1

jpg 画像をベクター形式に変換しようとしています。このコードを実装しようとしていますが、例外があります。

 public void Run()
        {
            Control c = new Control();           
            Graphics grfx = c.CreateGraphics();
           //ReadImage(ImageName) method return the Image to Byte Array
            MemoryStream ms = new MemoryStream(ReadImage(@"E:\Temp\1.jpg"));
            IntPtr ipHdc = grfx.GetHdc();
            Metafile mf = new Metafile(ms,ipHdc);
            grfx.ReleaseHdc(ipHdc);
            grfx.Dispose();
            grfx = Graphics.FromImage(mf);
            mf.Save(@"E:\Temp\file.wmf", ImageFormat.Wmf);//Get Exception on this line
            grfx.Dispose();
        }

例外: GDI+ で一般的なエラーが発生しました。 間違いを犯したコードを確認してください。前もって感謝します

4

3 に答える 3

3

コードは機能しません: コンストラクMetafileターは、すでにいくつかのメタファイル データ (つまり、「.wmf」ファイル) を含むストリーム、または空 (新しいメタファイルの場合) であると想定しています。

新しいメタファイルを作成し、そこからグラフィックス コンテキストを作成し、JPEG イメージを別のImageオブジェクトにロードして、メタファイル コンテキストに描画する必要があります。その後、メタファイルを「.wmf」ファイルとして保存できます。

私はこれを自分で行ったわけではありませんが、メタファイルの作成に関する (トリッキーな) 詳細の多くを説明しているCodeProject の記事を見つけました。

ただし、これは「実際の」ビットマップからベクターへの変換ではないことに注意してください。ビットマップを「.wmf」コンテナに埋め込むだけです。たとえば、サイズを変更しようとすると、元の jpeg-Image と同じ結果が得られます (つまり、「スムーズな」スケーリングはありません)。

于 2011-11-16T08:28:28.077 に答える
1

あなたのようにファイルをディスクに書き込むために問題が発生する前に、アプリケーションで同じエラーが発生しました

E:\Temp\file.wmf

ファイルの書き込み許可を確認してください。私のディレクトリはネットワーク内のマップされたメモリだったので、パスとユーザー名でディレクトリを接続する必要がありました.親ディレクトリが存在することを確認し、パスにファイル名と拡張子の両方が含まれていることを確認してください.うまくいかない場合は、管理者としてプログラムを実行してみてください.

于 2011-11-16T08:25:03.593 に答える
1
 public string Main(Bitmap image)
        {
             string str = "";
            try
            {

                int width = image.Width;
                int height = image.Height;

                Graphics offScreenBufferGraphics;
                Metafile m;
                using (MemoryStream stream = new MemoryStream())
                {
                    using (offScreenBufferGraphics = Graphics.FromImage(image))
                    {
                        IntPtr deviceContextHandle = offScreenBufferGraphics.GetHdc();
                        m = new Metafile(
                        stream,
                        deviceContextHandle,
                        new RectangleF(0, 0, width, height),
                        MetafileFrameUnit.Pixel,
                        EmfType.EmfPlusOnly);
                        offScreenBufferGraphics.ReleaseHdc();
                    }
                }

                using (Graphics g = Graphics.FromImage(m))
                {
                    // Set everything to high quality and Draw image
                    g.SmoothingMode = SmoothingMode.HighQuality;
                    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    g.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    g.CompositingQuality = CompositingQuality.HighQuality;
                    MetafileHeader metafileHeader = m.GetMetafileHeader();
                    g.ScaleTransform(
                      metafileHeader.DpiX / g.DpiX,
                      metafileHeader.DpiY / g.DpiY);
                    g.PageUnit = GraphicsUnit.Pixel;
                    g.SetClip(new RectangleF(0, 0, width, height));
                    Point ulCorner = new Point(0, 0);
                    g.DrawImage(image, 0, 0, width, height);


                }

                // Get a handle to the metafile
                IntPtr iptrMetafileHandle = m.GetHenhmetafile();

                // Export metafile to an image file
                CopyEnhMetaFile(iptrMetafileHandle, @"c:\\Ginko-Bilobatest1234.wmf");
                str = "wmf image successfully generated.";
            }
            catch (Exception ex)
            {
                str = ex.InnerException + ex.Message;
            }
            return str;
            // Delete the metafile from memory
            // DeleteEnhMetaFile(iptrMetafileHandle);
        }
于 2013-05-27T08:26:45.207 に答える