標準の WMF ファイルでは、18 バイトのヘッダーの後に GDI コマンド レコードが続くことを知っています。簡単な Web 検索で、次のことがわかります。しかし、私はそのようなメタファイルタイプの実際のアプリケーションを人手不足にしていませんか? 標準の WMF と比較して、このタイプはどのような要件に対処する必要がありますか? なぜ興味があるのですか?META ファイルからビットマップを構築しようとした時点で失敗する WMF のサイズを変更して GIF に変換するための次のコードがあります。
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
[1 つのビットマップに一度に割り当てられるメモリが多すぎるため、すぐに例外が発生します]
配置可能なメタ ファイルのサイズを変更して変換するには、添付のコードをどのように変更しますか?