如何将旧版Windows元文件写入文件

3

我可以生成一个旧的(非增强型)元文件。如何将其写入磁盘,使其成为正确的.wmf文件?

1个回答

4

Petzold没有提到,但是有一种写入磁盘的元文件约定:使用WmfPlaceableFileHeader结构作为元文件数据的前缀。显然,这种方法是由 Aldus 在过去发明的,并被称为“可放置的元文件”(placeable metafile)

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct WmfPlaceableFileHeader
{
     public uint key;  // 0x9aC6CDD7
     public ushort hmf;
     public ushort bboxLeft;
     public ushort bboxTop;
     public ushort bboxRight;
     public ushort bboxBottom;
     public ushort inch;
     public uint reserved;
     public ushort checksum;
}

Win32.WmfPlaceableFileHeader header = new Win32.WmfPlaceableFileHeader();
const ushorttwips_per_inch = 1440;
header.key = 0x9aC6CDD7;  // magic number
header.hmf = 0;
header.bboxLeft = 0;
header.bboxRight = width_in_inches * twips_per_inch;
header.bboxTop = 0;
header.bboxBottom = height_in_inches * twips_per_inch;
header.inch = twips_per_inch;
header.reserved = 0;

// Calculate checksum for first 10 WORDs.
ushort checksum = 0;
byte[] header_bytes = StructureToByteArray(header);
for (int i = 0; i < 10; i++)
     checksum ^= BitConverter.ToUInt16(header_bytes, i * 2);
header.checksum = checksum;

// Construct the file in-memory.
header_bytes = StructureToByteArray(header);
file_contents.Write(header_bytes, 0, header_bytes.Length);
file_contents.Write(metafile_bytes, 0, metafile_bytes.Length);

只是好奇 - 你为哪个需要这么旧的数据格式的程序提供服务? - RenniePet
我正在生成用于导出到PowerPoint的元文件。我可以生成增强型元文件,但背景不会透过(是不透明的),而旧式元文件则未绘制的区域是透明的。 - Oliver Bock
如果您不打算缩放图像,您可能需要调查一下是否可以使用PNG。 - IInspectable
实际上我正在处理metafkles,因为png在打印时效果不佳(即使分辨率加倍),透明度会导致文本边缘出现丑陋的瑕疵。 - Oliver Bock
原来我们可以让透明的增强型元文件正常工作。可能是由于旧版 Office 的问题。总之,解决这个问题很有趣。 - Oliver Bock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接