image - 这个 EMF 图像 A4 大小如何?

标签 image reverse-engineering gdi file-format .emf

Adobe Illustrator 制作的 EMF 文件(我不知道是哪个版本,但它有一个早期样式的 EMR header )应该是 A4 大小,但我不明白它怎么会这样。该文件具有这些 EMR 记录:

U_EMRHEADER                   record:    0 type:  1 offset:       0 size:     116
   rclBounds:      {255,-925,1377,-132} 
   rclFrame:       {7969,-28906,43031,-4125}  **350.63 x 247.82 mm**
   dSignature:     0x464D4520
   nVersion:       0x00010000
   nBytes:         1924
   nRecords:       54
   nHandles:       4
   sReserved:      0
   nDescription:   13
   offDescription: 88
      Desc. A:  Adobe Systems
      Desc. B:  
   nPalEntries:    0
   szlDevice:      {1024,768} 
   szlMillimeters: {320,240} 
U_EMRSETMAPMODE               record:    1 type: 17 offset:     116 size:      12
   iMode:          0x00000008       **MM_ANISOTROPIC**
U_EMRSETWINDOWORGEX           record:    3 type: 10 offset:     140 size:      16
   ptlOrigin:      {0,0}
U_EMRSETVIEWPORTORGEX         record:    4 type: 12 offset:     156 size:      16
   ptlOrigin:      {0,0}
U_EMRSETWINDOWEXTEX           record:    5 type:  9 offset:     172 size:      16
   szlExtent:      {10104,7143}
U_EMRSETVIEWPORTEXTEX         record:    6 type: 11 offset:     188 size:      16
   szlExtent:      {3368,2381}

rclFrame 字段通常设置页面大小,但 A4 是 297 x 210 毫米,而不是 350.63 x 247.82 毫米。但是 350.63 x 247.82 是 A4 的正确比例。我可以从这些数字中骗取 A4 尺寸的唯一方法是将 rclFrame 值视为 MM_HIENGLISH,然后以这种方式使用来自 EMRSETWINDOWEXTEX/EMRSETVIEWPORTEXTEX 的 1/3 比例因子:

 35.063" * 1/3 = 11.69"
 24.782" * 1/3 = 8.26"

但这意味着程序在看到后两条记录之前无法确定页面的大小。我也找不到任何文件说这种事情会发生。

任何人都可以阐明这一点吗?

最佳答案

我认为您的 EMF 包含的信息可能多于诊断转储所指示的信息。 提供的 EMR_HEADER 记录将 nVersion 设置为 0x00010000,因此该记录另外包含这些在 szlMillimeters 之后开始的字段:

    public uint     cbPixelFormat;
    public uint     offPixelFormat;
    public uint     bOpenGL;
    public SIZE     szlMicrometers;

提供的诊断转储中缺少这些字段的值。这是我机器上的 XP emf 文件头部的十六进制转储:

 0: 01 00 00 00 6c 00 00 00 58 07 00 00 03 02 00 00  | ....l...X....... |
10: aa 0b 00 00 1f 04 00 00 95 1f 00 00 07 09 00 00  | ................ |
20: 07 31 00 00 15 11 00 00 20 45 4d 46 00 00 01 00  | .1...... EMF.... |
30: 44 07 00 00 2e 00 00 00 03 00 00 00 00 00 00 00  | D............... |
40: 00 00 00 00 00 00 00 00 61 13 00 00 68 1b 00 00  | ........a...h... |
50: d2 00 00 00 29 01 00 00 00 00 00 00 00 00 00 00  | ....)........... |
60: 00 00 00 00 50 34 03 00 28 88 04 00              | ....P4..(...     |

在此代码段中,szlMicrometers 字段是最后一对 DWORD。它们的值分别是0x00033450、0x00048828,用十进制表示的千分之一毫米这些值是210000、297000

关于image - 这个 EMF 图像 A4 大小如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12983660/

相关文章:

javascript - 如何更改 JSPsych 中刺激呈现的权重?

html - 如何使用 CSS 对齐表格单元格右下角的图像?

c++ - 查找类迂回函数的对象

visual-c++ - 混淆了两个 MFC GDI 函数

ffmpeg gdigrab在捕获图形密集型飞行模拟器时记录黑窗

image - 在MATLAB中对图像进行高通巴特沃斯滤波器

java - 在java中读/写图像

c# - 保护 .NET 代码免遭逆向工程?

java - 逆向工程排序算法

c++ - 设置窗口像素的正确(无闪烁)方式?