【问题标题】:Extracting Width/Height Dimensions from EMF Image Files从EMF图像文件中提取宽度/高度尺寸
【发布时间】:2011-03-24 09:29:12
【问题描述】:

我维护了一个小型 Perl 库,它可以从图像中提取宽度/高度,供那些需要该功能而不使用更大、更通用的库的人使用。有人问我是否可以支持 Windows EMF 格式。但是,我的 Google-fu 在尝试找到一个好的格式规范或更好的示例代码(任何语言)时,我的运气并不好。我正在寻找一个体面的格式规范,或读取/解析文件的示例。像往常一样,非常感谢所有帮助。

【问题讨论】:

  • CPAN 上似乎还没有(工作的)EMF 解析器——有一个占位符版本,如 Data::ParseBinary::Graphics::EMF,如果你提供给他,我相信作者会很感激有一些工作补丁:)

标签: windows perl vector-graphics .emf


【解决方案1】:

官方规范可以直接从MSDNhttp://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 平方像素。 Paint 报告 432×374 平方像素。

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

更新 2

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

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

现在这可能不是全部;如果您将获得的数字与 Paint 报告的数字进行比较,您会得到小的偏差。所以待续……

【讨论】:

    【解决方案2】:

    根据 Andreas Rejbrand 的研究,我用 Python 编写了获取 EMF 文件大小的代码:

    with open("img.emf", "rb") as f:
        f.read(16)
        w1, w2 = f.read(1).hex(), f.read(1).hex()
        f.read(2)
        h1, h2 = f.read(1).hex(), f.read(1).hex()
    
    width  = int(str(w2) + str(w1), 16) * 762 # I've no idea why is '762' but it works this way
    height = int(str(h2) + str(h1), 16) * 762
    

    我相信如果它能够读取字节,它也可以在 Perl 中实现。

    这是它在实际任务中的工作方式:Unable to insert EMF into Word using Python

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-16
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 2011-03-27
      • 2012-03-19
      • 1970-01-01
      相关资源
      最近更新 更多