2

总结:

  1. 计算直截了当地指出:一张 3289 X 4570 X 32bpp 的 .BMP 图片大约需要 53MB。相同大小但24bpp的图片大约需要43MB,16bpp的图片大约需要28MB。在我的情况下,必须将 ChemDraw 处理的图片文件从 24bpp 转换为 16bpp。

  2. 进一步比较两个文件的十六进制数据,可以更详细地了解 ChemDraw 处理的图片和原始图片之间的差异。具体来说,ChemDraw 存储“EMF_STRETCHDIBITS”而不是“EMF_STRETCHBLT”。需要补充的是,在将像素复制到 TMetaFile/TMetaFileCanvas 时,可以通过调用 StretchDIBits 来完成“EMF_STRETCHDIBITS”。还应注意,“EMF_STRETCHDIBITS”的像素应与“EMF_STRETCHBLT”的像素相同。

  3. 不幸的是,直到现在我还没有弄清楚 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

4

2 回答 2

1

你写了:

Base64-decode XML字符串,zlib-解压,保存到图片文件“sample_original_bmp2emf_method2.emf”中。

因此,它绝对不是 emf 文件,而是某种压缩格式。或者在转换为 XML 之前将其转换为另一种格式(如矢量)。在这种情况下,生成的图片中的数据比真实位图中的数据少。

而第一种方法将为您提供一个大小仅比普通 bmp 文件大几个字节的 emf 文件(即用于封装位图数据的 emf 记录)。

如果你压缩第一种方法的 emf 文件,我很确定你会得到一个比方法二得到的假 emf 更小的文件。

于 2010-12-05T15:22:09.163 回答
1

为什么不直接比较两张图呢?在光栅编辑程序中打开它们并比较像素。

为什么你关心文件有多大?当然,重要的是图像是否正确。

于 2010-12-05T18:58:44.237 回答