【问题标题】:How to tell the difference between the original .BMP/.EMF picture file with the processed .BMP/.EMF file?如何区分原始 .BMP/.EMF 图片文件与处理后的 .BMP/.EMF 文件?
【发布时间】:2011-05-20 12:34:29
【问题描述】:

总结:

  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:我稍后会为这个问题投票,因为我目前没有足够的声誉。感谢所有愿意发表评论的人!

===

嗨,

非常感谢您的宝贵时间!

假设我有一张名为“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


【解决方案1】:

你写道:

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

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

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

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

【讨论】:

  • @Arnaud:感谢您的宝贵时间!我可能没有把情况说清楚。正如我所写,ChemDraw 将图片存储为“Base64 编码的 zlib 压缩格式”。如果我对其进行 base64 解码,zlib 解压缩解码的十六进制数据,则解压缩的十六进制数据确实是一个 TRUE .emf 文件。标头字节就是一个证明。我还可以将解压后的十六进制数据保存到 .emf 文件中,然后在 mspaint 程序中打开。 “如果你压缩第一种方法的 emf 文件,我很确定你会得到一个更小的文件......”是肯定的。我担心的是,如果我们比较两个未压缩版本,两个 emf 文件会有所不同。
  • @Xichen:所以我猜这两个 emf 文件没有相同的数据。也许分辨率或颜色位不一样。用frazmitic.free.fr/emfexplorer看看这两个emf文件有什么区别。
  • @Arnaud:感谢您的 cmets!正如您所说,经过 ChemDraw 处理的 .EMF 图片文件可能会“丢失”某些数据。但是,宽度和高度已保持不变。 24 个颜色位也保持不变。因此,我不知道 ChemDraw 还能做什么。谢谢您的建议!我已经下载了 emfexplorer,并用它来打开 .EMF 文件。但是,emfexplorer 的目的似乎是在一个 .EMF 文件中以不同的细节呈现矢量命令。在我的情况下,它对理解 .EMF 文件的差异没有帮助,不是吗?
  • @Arnaud:你是对的。在 ChemDraw 处理的 .EMF 图片文件中,颜色位似乎是 16 bpp。非常感谢你们的cmets! (我目前无法投票给您或其他人的答案,因为我没有足够的声誉。我会稍后尝试。)
【解决方案2】:

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

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

【讨论】:

  • @David:谢谢你们的cmets!!你能帮忙推荐一些光栅编辑软件吗?如果我可以看到像素之间的差异,也许我可以看到 ChemDraw 对我的原始图片所做的更改。关于您的第二条评论,我主要关心的是图像是否已降级。如果我能在保存我粘贴到其中的图片之前了解 ChemDraw 将做的更改,那将是最好的,因为这样我也可以了解 ChemDraw 的实现。
  • @Xichen Li 我使用 Paint.NET,但实际上任何事情都可以。我的意思是您担心 ChemDraw 会修改和降低您的图像质量。那你为什么在乎它的大小呢?当然,重要的是它是否会修改或降低您的形象!
  • @David:谢谢你们的cmets!我将查看Paint的手册。网,让你知道是否有任何消息。原因是,文件大小的差异可能是 ChemDraw 更改/降级粘贴图像的线索?此外,如果我可以知道粘贴的图像到底发生了什么,我可能会停止担心(如果更改/降级是微不足道的),或者阻止此类更改(如果它们非常明显)。
  • @David:很抱歉,您能否具体指导一下如何使用 Paint .NET 来了解两个 .EMF 图片文件的像素比较?我在手册中没有找到相关说明。 :D
  • @Xichen Li 加载两张图片,放大一点,并排看,看看你是否能发现任何不同之处。我再次问这个问题,你为什么关心文件有多大?你能看出图片有什么不同吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 2016-07-15
相关资源
最近更新 更多