在本文中,将探讨如何利用Excel的单元格作为像素来渲染图像。这项技术需要.NET4.5框架和本地安装的Excel应用程序。整个项目是用C#语言编写的,采用Winform界面,并在Visual Studio 2013环境下开发。
基本上,这个Winform应用程序会从硬盘中选择一张图片,然后启动Excel来使用工作表单元格渲染所选的图片。运行过程简述如下:
应用程序首先选择图片,并根据用户界面的输入(单位、列等)将其重新采样到内存中。然后启动Excel,使电子表格单元格呈现正方形状,以模拟大像素。接着,应用程序以线性方式或随机方式扫描内存中的重新采样图像(更喜欢随机方式,观看效果非常有趣)。最后,逐个改变单元格的背景颜色(无论是线性顺序还是随机顺序)。
代码非常直接。它使用Visual Studio 2013(或更高版本)、.NET4.5、C#和Winform。确保正确引用了Office Interop Excel。
最初,认为需要使用async/await来创建一个体面的进度弹出窗口。但是,经过多年的实践,发现所谓的“长运行”进程处理框架仍然难以使用,除非每天都在使用它。此外,还需要处理与COM+/Office Interop相关的新async/await问题。经过一些实验,决定采用另一种方法。
结果表明,一个普通的调用就可以很好地处理这个问题。也许这是因为Office Interop,系统已经处理了这种异步、工作线程、UI线程切换的神话。坦白说,不知道。但它确实有效。
可以查看标记为黄色的代码,没有花哨的async/await,但仍然可以顺利地完成任务。显然,上述方法仍然缺少一个功能:“取消”。
要在中间取消一个长运行的进程,这并不容易。这是一个高级主题,具体情况具体分析(有时,可能想要回滚,有时只想终止它...)。忙于过自己的生活,这个“功能”实际上干扰了这个小项目的主要目的,所以...
如果使用大尺寸的图像或超小的单元格(通过改变单元格单位大小),应用程序将会变得非常慢。请记住,Excel工作表有限制(1048576行X 16384列)。但在尝试这些数字之前,已经在代码注释中警告过:
在实验中,当图像渲染时,如果“焦点”在Excel上,它会很慢。但如果“焦点”不在Excel上,它会更快。不要问为什么。如果想弄清楚,那就去吧,都是。但谦逊的方法就是确保应用程序有焦点。
能相信吗?这是2017年,.NET5.0时代(猜对了吗?),当想要做一些基本的事情,比如“切换焦点”,仍然需要依赖万能的WIN32!
将默认的渲染效果设置为“随机化”。观看效果很有趣。它在注释中有很好的文档记录。这里也提醒一下:这不是“真正的”随机方法。它只是足够好,可以欺骗人眼。
为了方便,将“这个人”的照片作为测试图像。它包含在源代码zip包中。
就是这样!只需下载源代码并尝试。认为注释也有助于理解代码。
源代码解决方案项目可以在这里下载。