我知道标准 WMF 文件使用 18 字节的标头,后跟 GDI 命令记录。一个简单的网络搜索告诉我:“还有两个额外的 WMF 变体,它们在标准标题前面放置另一个标题。可放置的元文件使用包含 xy 坐标的 22 字节标题来定位页面上的图像”。但是对于这种元文件类型,我有点没有人手不足?与标准 WMF 相比,这种类型应该解决什么样的要求?我为什么感兴趣?我有以下代码用于重新调整 WMF 的大小并将其转换为 GIF,它在尝试从 META 文件中构造位图时失败:
public Stream Resize(string filePath, int maxSize)
{
try
{
MemoryStream stream = new MemoryStream();
using (Metafile img = new Metafile(filePath))
{
MetafileHeader header = img.GetMetafileHeader();
float scale = header.DpiX / 96f;
var newSize = CalcaulateSize(img.Width, img.Height, maxSize);
using (Bitmap bitmap = new Bitmap((int)(scale * img.Width / header.DpiX * 100), (int)(scale * img.Height / header.DpiY * 100)))
{
using (Graphics g = Graphics.FromImage(bitmap))
{
g.Clear(Color.White);
g.ScaleTransform(scale, scale);
g.DrawImage(img, 0, 0);
}
var resizedBitmap = new Bitmap(newSize.Width, newSize.Height);
using (var g2 = Graphics.FromImage(resizedBitmap))
{
g2.CompositingQuality = CompositingQuality.HighQuality;
g2.InterpolationMode = InterpolationMode.HighQualityBicubic;
g2.SmoothingMode = SmoothingMode.AntiAlias;
g2.PixelOffsetMode = PixelOffsetMode.HighQuality;
g2.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
g2.TextContrast = 12;
g2.Clear(Color.White);
g2.DrawImage(bitmap, 0, 0, newSize.Width, newSize.Height);
}
resizedBitmap.Save(stream, ImageFormat.Gif);
}
stream.Position = 0;
}
return stream;
}
catch (Exception)
{
return null;
}
并引发异常“参数无效”。
(int)(scale * img.Width / header.DpiX * 100) = 22181 (int)(scale * img.Height / header.DpiY * 100)) = 33718
[为单个位图一次分配太多内存,导致立即异常]
您将如何更改附加代码以重新调整大小并转换可放置的元文件?