代码之家  ›  专栏  ›  技术社区  ›  rjray

从emf图像文件中提取宽度/高度维度

  •  2
  • rjray  · 技术社区  · 15 年前

    我维护了一个小的Perl库,它可以从图像中提取宽度/高度,适合那些不需要使用更大、更通用的库就可以使用该功能的人。有人问我是否可以支持WindowsEMF格式。然而,我的google fu在寻找格式的良好规范或更好的示例代码(任何语言)方面都没有太多的运气。我在寻找一个合适的格式规范,或者是读取/解析文件的例子。像往常一样,所有的帮助都是非常感谢的。

    1 回复  |  直到 14 年前
        1
  •  7
  •   Andreas Rejbrand    15 年前

    官方规范可直接从MSDN下载,网址为 http://msdn.microsoft.com/en-us/library/cc230514(PROT.10).aspx 是的。

    阅读和理解它需要一些时间,但是如果您以前使用过二进制文件格式,那么它肯定是可行的。

    但是请注意,emf是一种(伪)矢量图像格式,因此图像可以缩放到任何大小。但是可能有 违约 宽度和高度。特别是,应该有一个明确的长宽比。

    更新

    认为 图元文件的宽度(以像素为单位)是该文件的第5个基数,高度(以像素为单位)是第6个基数。在一个 典型的 案例。至少这对你来说是个不错的起点。

    我刚刚创建了一个示例emf文件

    01 00 00 00 88 00 00 00 00 00 00 00 00 00 00 00
    ae 01 00 00 75 01 00 00 00 00 00 00 00 00 00 00
    

    第五个基数是ae010000,由于字节的小端性,十六进制是000001ae,即十进制是430。第六个基数是75010000,即00000175(十六进制)或373(十进制)。因此我得到的尺寸是430_373平方像素。油漆报告432_374平方像素。

    如果我还有更多的时间,我会更广泛地研究文件格式。但至少我希望这是你的起点。

    更新2

    第三个和第四个32位整数显然分别是图像的左坐标和上坐标(逻辑单位),而第五个和第六个32位整数是右坐标和下坐标。在大多数情况下 (top, left) = (0, 0) ,然后我上面的文字是正确的(即 width = right ,请 height = top 协调)。

    如果 (top, left) <> (0, 0) ,那么,自然, width = right - left height = bottom - top 是的。

    现在这可能不是全部;如果你把得到的数字和油漆报告的数字进行比较,你会得到小的偏差。所以 继续… 是的。