Как преобразовать JPG, растровое изображение в векторный формат в C # - PullRequest
1 голос
/ 16 ноября 2011

Я пытаюсь преобразовать изображение 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 +. Пожалуйста, проверьте мой код, где я сделал ошибку. Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 16 ноября 2011

Код не может работать: Afaik конструктор Metafile ожидает поток, который уже содержит некоторые данные метафайла (то есть файл .wmf) или является пустым (для новых метафайлов)

Вы должны создатьновый метафайл, создайте из него графический контекст, загрузите изображение jpeg в отдельный объект Image и нарисуйте его в контексте метафайла.Затем вы можете сохранить метафайл в виде файлов ".wmf".

Я сам этого не делал, но нашел статью о CodeProject , в которой объясняются многие (хитрые) подробности осоздание метафайла.

Обратите внимание, что это не "реальное" преобразование растрового изображения в вектор.Он просто встраивает растровое изображение в контейнер «.wmf».Например, если вы попытаетесь изменить его размер, вы получите те же результаты, что и для исходного jpeg-Image (т.е. без «плавного» масштабирования).

1 голос
/ 16 ноября 2011

Я получил ту же ошибку, прежде чем в моем приложении возникла проблема из-за записи файла на диск, так как у вас

E:\Temp\file.wmf

проверьте разрешение файла на запись! Мой каталог был Mapped Memory в сети, поэтому мне пришлось подключить каталог с паролем и именем пользователя. Убедитесь, что родительский каталог существует, и убедитесь, что путь включает в себя как имя файла, так и расширение. Если он не работает, попробуйте запустить программу от имени администратора

0 голосов
/ 27 мая 2013
 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);
        }
...