【发布时间】:2011-05-20 12:34:29
【问题描述】:
总结:
-
计算直截了当地指出:一张 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:我稍后会为这个问题投票,因为我目前没有足够的声誉。感谢所有愿意发表评论的人!
===
嗨,
非常感谢您的宝贵时间!
假设我有一张名为“sample_original.bmp”的图片。文件大小为 3289 X 4570、43MB。然后我执行以下操作将其转换为 .EMF 文件(增强型 Windows 元文件):
方法 1,通过制作一个小型的内部 Delphi 程序: (1) 加载 .BMP 图像文件。 (2)获取TMetaFile的Canvas(TMetaFileCanvas) (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 已经很友善地做出了他的回答,然后我给了我的 cmets。但我现在看不到那些。它应该是系统的正常行为吗? o_o
【问题讨论】:
-
你不用Powerpoint打开什么,然后将图片保存为
.emf表格,看看你得到了什么尺寸。方法 2 中精心设计的方案似乎为该过程添加了许多不必要的步骤。此外,ChemDraw 的实现细节可能是任何差异的根源。 -
非常感谢你们的cmets!正如您所说,ChemDraw 是差异的来源。我关心的是是否有办法获得对差异的理解?我的意思是,图片是否降级,为什么图片尺寸较小而宽度和高度保持不变,等等。
-
EMF 是一种矢量图像格式。 BMP 是一种光栅格式。为什么要将 BMP 转换为 EMF,这似乎很奇怪。
-
@David:感谢您的宝贵时间!我了解 EMF 是一种矢量图像格式。原因是,我需要将我的图片放入 ChemDraw 程序(以生成新的、可能更复杂的图片用于科学出版物),并将 ChemDraw 存储为 EMF 格式。但是,如上所述,我偶然发现 ChemDraw 存储的 EMF 图片与我从原始 BMP 中获得的不同。我非常关心原始图片到底发生了什么。 :D
-
@David Heffernan:实际上,在元文件的画布上绘制位图会将光栅对象嵌入到容器中
标签: image delphi bmp metafile .emf