如何解释MS-EMF标题对象属性 - 边界,框架,设备和毫米?

时间:2015-07-15 16:03:23

标签: rendering specifications .emf

我实现了渲染MS-EMF到光栅图像工具 解析器按规范工作没问题。但是在渲染问题时我有解释2.2.9 Header Object属性,而在规范中没有足够的信息。

要从LOGICAL转换为DEVICE坐标,请使用当前的MapMode。如何解释它们(尤其是有趣的MM_ISOTROPICMM_ANISOTROPIC)可以查看gdi,例如here

现在,我试图指定整个图像的位置和大小:

var minPoint = new PointF(header.Bounds.Left, header.Bounds.Top);
var maxPoint = new PointF(header.Bounds.Right, header.Bounds.Bottom);

float imageWidth = maxPoint.X - minPoint.X;
float imageHeight = maxPoint.Y - minPoint.Y;

float shiftX = -minPoint.X;
float shiftY = -minPoint.Y;

var globalCanvas = new CanvasClass(options.PageWidth, options.PageHeight);
globalCanvas.RenderTransform = new DrMatrix(1, 0, 0, 1, 0, 0);

float scaleX = options.PageWidth / (maxPoint.X + shiftX);
float scaleY = options.PageHeight / (maxPoint.Y + shiftY);
float minCommonScale = Math.Min(scaleX, scaleY);

if (minCommonScale > Epsilon)
{
    globalCanvas.RenderTransform.Scale(minCommonScale, minCommonScale);
}

globalCanvas.RenderTransform.Translate(shiftX, shiftY);

但我不明白如何使用所有属性 - 边界,框架,设备和毫米 - 并且结果图像被拉伸或不正确缩放或图像的位置不正确。

他们如何解释?

示例1。
emf file
标题:

Bounds: (0, 0) - (579, 429)
Frame:  (0, 0) - (10000, 10000)
Device: 1855, 1034
Millimeters:    320, 240  

总共4条记录:

SelectObject(hDC, (HGDIOBJ)GRAY_BRUSH);
Ellipse(hDC, 0, 0, 99, 99);
SelectObject(hDC, (HGDIOBJ)BLACK_BRUSH);
Ellipse(hDC, 480, 330, 579, 429);

结果:
ex1-result
但我们必须看到ex1-ethalon
有趣的是,除了Windows标准查看器之外,观看者显示的ehalon不正确 ex1-windows-internal-vewer-ethalon

示例2。
emf file
标题:

Bounds: (960, 210) - (3396, 2429)
Frame:  (6772, 1481) - (23969, 17143)
Device: 2892, 4125
Millimeters:    204, 291

结果(尚未完成呈现):ex2-result-incomplete-rendering 但是我们看到了ethalon(关注图像位置):ex2-ethalon

0 个答案:

没有答案