总结:
计算直截了当地指出:一张 3289 X 4570 X 32bpp 的 .BMP 图片大约需要 53MB。相同大小但24bpp的图片大约需要43MB,16bpp的图片大约需要28MB。在我的情况下,必须将 ChemDraw 处理的图片文件从 24bpp 转换为 16bpp。
进一步比较两个文件的十六进制数据,可以更详细地了解 ChemDraw 处理的图片和原始图片之间的差异。具体来说,ChemDraw 存储“EMF_STRETCHDIBITS”而不是“EMF_STRETCHBLT”。需要补充的是,在将像素复制到 TMetaFile/TMetaFileCanvas 时,可以通过调用 StretchDIBits 来完成“EMF_STRETCHDIBITS”。还应注意,“EMF_STRETCHDIBITS”的像素应与“EMF_STRETCHBLT”的像素相同。
不幸的是,直到现在我还没有弄清楚 ChemDraw 究竟是如何处理和存储粘贴的图片的。也就是说,我没有发现为什么 ChemDraw 存储的像素与我通过编程可以获得的不同。
PS:我稍后会就这个问题投票赞成答案,因为我目前没有足够的声誉。感谢所有好心评论的人!
===</p>
你好,
非常感谢您的时间!
假设我有一张名为“sample_original.bmp”的图片。文件大小为 3289 X 4570、43MB。然后我执行以下操作将其转换为 .EMF 文件(增强型 Windows 元文件):
方法 1,通过制作一个小的内部 Delphi 程序: (1) 加载 .BMP 图像文件。(2) 获取TMetaFile(TMetaFileCanvas) 的Canvas (3) 调用Canvas.Draw 复制图像。(4) 保存为.EMF文件,命名为“sample_original_bmp2emf_method1.emf”
方法二:(1)在mspaint程序中打开.BMP图片文件,选择“全选”,选择“复制”。(2) 打开一个名为 ChemDraw 的外部程序,新建文件,然后选择“粘贴”。(3) 然后我选择将其保存为与 XML 兼容的 .cdxml 格式,命名为“sample_original_bmp2emf_method2.cdxml”。(4) 图片的内容(可能改变或退化?)现在保存在sample_original_bmp2emf_method2.cdxml 文件中。格式是 Base64 编码的 zlib 压缩格式。(5)我可以对XML字符串进行Base64解码,zlib-解压,保存到图片文件“sample_original_bmp2emf_method2.emf”中。
sample_original_bmp2emf_method2.emf 的文件大小比 sample_original_bmp2emf_method1.emf 小 15 MB,但宽度和高度保持不变。此外,如果我在 mspaint 程序中打开“sample_original_bmp2emf_method2.emf”并将其保存回 .bmp 文件格式,则会弹出一条警告说透明信息正在丢失。
您能否帮助评论如何区分“sample_original_bmp2emf_method1.emf”和“sample_original_bmp2emf_method2.emf”?图片变小是因为它的质量下降了吗?换句话说,这个外部程序可能会对我的原始图片进行哪些更改?
最良好的祝愿,
上面提到的文件可以在以下网址下载:
http://www.rapidspread.com/file.jsp?id=2ighvzoci8
PS:我相信 Andreas Rejbrand 已经很友好地做出了回答,然后我给出了我的评论。但我现在看不到那些。它应该是系统的正常行为吗?o_o