如何将旧式Windows图元文件写入文件

本文关键字:元文件 文件 图元 Windows | 更新日期: 2023-09-27 18:19:59

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

如何将旧式Windows图元文件写入文件

Petzold没有提到这一点,但有一个将元文件写入磁盘的约定:在元文件数据前面加上WmfPlaceableFileHeader结构。显然,这是Aldus在当时发明的,被称为"可放置的元文件"。
[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);
相关文章: