【发布时间】:2014-05-31 03:22:38
【问题描述】:
我知道标准 WMF 文件使用 18 字节的标头,后跟 GDI 命令记录。一个简单的网络搜索告诉我:“有两个额外的 WMF 变体将另一个标题放在标准标题前面。可放置的元文件使用包含 x-y 坐标的 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
[为单个位图一次性分配的内存过多,导致立即异常]
您将如何更改附加代码以重新调整大小并转换可放置的元文件?
【问题讨论】:
标签: gdi+ image-resizing metafile wmf