我实现了渲染MS-EMF到光栅图像工具 解析器按规范工作没问题。但是在渲染问题时我有解释2.2.9 Header Object属性,而在规范中没有足够的信息。
要从LOGICAL
转换为DEVICE
坐标,请使用当前的MapMode。如何解释它们(尤其是有趣的MM_ISOTROPIC
和MM_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-ethalon
有趣的是,除了Windows标准查看器之外,观看者显示的ehalon不正确
示例2。
emf file
标题:
Bounds: (960, 210) - (3396, 2429)
Frame: (6772, 1481) - (23969, 17143)
Device: 2892, 4125
Millimeters: 204, 291
结果(尚未完成呈现): 但是我们看到了ethalon(关注图像位置):