65.9K
CodeProject 正在变化。 阅读更多。
Home

Excel 像素化图像创建器

starIconstarIconstarIconstarIconstarIcon

5.00/5 (12投票s)

2017 年 8 月 30 日

CPOL

3分钟阅读

viewsIcon

22879

downloadIcon

709

使用 Excel 工作表的单元格作为像素渲染真实图像(用于娱乐和实验)。

引言

这个小项目是使用 Excel 工作表的单元格作为像素来渲染真实图像。 它需要 .NET 4.5 和本地 Excel 才能运行。 它是用 C#/Winform/VS 2013 编写的。

背景

基本上,Winform 应用程序从您的硬盘驱动器中选择一张图像,并启动 Excel 以使用工作表单元格渲染所选图像。

简要的运行过程如下

  1. 它根据您的 UI 输入(单位、列等)选择图像并将其重新采样到内存中。
  2. 它启动 Excel,使电子表格单元格看起来像正方形以模拟一个大像素。
  3. 它以线性方式或随机方式扫描内存中的重新采样的图像(我更喜欢随机方式,这种效果看起非常有趣)。
  4. 它逐个更改单元格的背景颜色(以线性顺序或随机顺序)。

(这是该应用程序的样子。)

(它正在以随机方式在 Excel 中渲染。)

(渲染完成。)

Using the Code

代码非常简单。 它使用 VS 2013(或更高版本)、.NET 4.5、C# 和 Winform。

确保您已正确引用 Office Interop Excel。

关注点

  1. 运行进度弹出窗口

    最初,我以为我需要进行 async/await 来制作一个像样的进度弹出窗口。 但你知道,这么多年过去了,这种所谓的“长运行”流程处理框架仍然难以使用,除非你每天都这样做。 另外,你必须用这个新的 async/await 处理 COM+/Office Interop。 我做了一些实验,我决定采用另一种方法。

    事实证明,一个普通的调用就可以很好地处理它。 也许是因为 Office Interop,系统已经处理了这种异步、工作线程、UI 线程切换的传闻。 坦率地说,我不知道。 但它有效。

    您可以看到黄色标记的代码,没有花哨的 async/await 东西,但仍然可以顺利完成任务。

    显然,上述方法仍然缺少一个功能:“取消”。

    要在半途取消一个长时间运行的进程,伙计们,这并不是一件容易的事。 这是一个高级主题,并且是根据情况而定的(有时候,你想回滚,有时候你只想结束它……)。 我正忙着过自己的生活,而且这个“功能”实际上扰乱了这个小项目的主要目的,所以……

  2. 性能

    如果你用大尺寸图像或超小单元格(通过更改单元格单位大小)弄乱了这个小应用程序,它会变得非常慢。 请记住,Excel 工作表有局限性(1048576 行 X 16384 列)。 但在你尝试那些数字之前,我在我的代码注释中警告过你

  3. 再次关于性能

    在我的实验中,在图像渲染时,如果“焦点”在 Excel 上,它会很慢。 但是如果“焦点”在 Excel 之外,它会更快。 别问我为什么。 如果你想弄清楚,尽情折腾吧,这完全是你的。 但我的谦虚的方法只是确保应用程序获得焦点。

    你相信吗? 这是 2017 年和 .NET 5.0 时代(对吗?) 当你想做一些像“切换焦点”这样的基本事情时,你仍然不得不依赖全能的 WIN32!

  4. 随机化

    我将默认渲染效果设置为“随机化”。 看着很有趣。 在我的注释中对此进行了很好的记录。 这里也提醒一下:它不是“真正的”随机方法。 它只是足以欺骗人的眼睛。

  5. 测试图像

    我放了一张“这个人”的照片作为测试图像,方便您使用。 它被打包在源代码 zip 中。

就这样! 只需下载源代码并试用。 我认为我的注释对你理解代码也很有帮助。

源代码解决方案项目可以从 这里下载。

我还制作了一个 YouTube 视频来展示它的运行方式。 玩得开心

历史

  • 2017 年 8 月 30 日:初始版本
© . All rights reserved.