0

標準の 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 つのビットマップに一度に割り当てられるメモリが多すぎるため、すぐに例外が発生します]

配置可能なメタ ファイルのサイズを変更して変換するには、添付のコードをどのように変更しますか?

4

1 に答える 1