综述:
计算直接指出:3289 X 4570 X 32bpp的.BMP图片大约需要53MB。相同大小但24bpp的图片大约需要43MB,而16bpp大小需要大约28MB。在我的情况下,ChemDraw处理的图片文件必须从24bpp转换为16bpp。
进一步比较两个文件的十六进制数据可以更详细地了解ChemDraw处理的图片与原始图片之间的区别。具体来说,ChemDraw存储“EMF_STRETCHDIBITS”而不是“EMF_STRETCHBLT”。应该补充一点,“EMF_STRETCHDIBITS”可以通过在将像素复制到TMetaFile / TMetaFileCanvas时调用StretchDIBits来完成。还应注意“EMF_STRETCHDIBITS”的像素应与“EMF_STRETCHBLT”的像素相同。
不幸的是,直到现在我还没有发现ChemDraw如何精确处理和存储粘贴的图片。也就是说,我没有找到为什么ChemDraw存储的像素与我可以编程获得的像素不同。
PS:我稍后会对这个问题投反对票,因为我目前没有足够的声誉。感谢所有善意发表评论的人!
===
您好,
非常感谢你的时间!
假设我有一张名为“sample_original.bmp”的照片。文件大小为3289 X 4570,43MB。然后我执行以下操作将其转换为.EMF文件(增强的Windows MetaFile):
方法1,通过制作一个小型的内部Delphi程序: (1)加载.BMP图像文件。 (2)获取TMetaFile的画布(TMetaFileCanvas) (3)调用Canvas.Draw复制图像。 (4)保存到.EMF文件,名为“sample_original_bmp2emf_method1.emf”
方法2: (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”?图片是否因为质量下降而变小了? 换句话说,这个外部程序可能会对我的原始图片做出哪些改变?
祝福,
上面提到的文件可以在以下网址下载:
PS:我相信Andreas Rejbrand非常友好地回答了我,然后我发表了我的评论。但我现在看不到那些。它应该是系统的正常行为吗? O_O答案 0 :(得分:1)
您写道:
Base64-解码XML字符串,对其进行解压缩,然后将其保存到图片文件“sample_original_bmp2emf_method2.emf”中。
所以它绝对不是emf文件,而是一些压缩格式.. 或者在转换为XML之前将其转换为另一种格式(如矢量)。在这种情况下,生成的图片中的数据少于真实的位图。
而第一种方法会给你一个emf文件,其大小只比普通的bmp文件大几个字节(即用于封装位图数据的emf记录)。
如果你压缩第一种方法的emf文件,我很确定你会得到一个比方法二获得的假emf小的文件。
答案 1 :(得分:1)
为什么不直接比较两张图片?在光栅编辑程序中打开它们并比较像素。
为什么要关心文件的大小?当然重要的是图像是否是正确的。