itm.abhishek Ответов: 1

Изменение цвета файла .emf в C#


Привет,

Я пытаюсь изменить цвет существующего файла метафайла(.emf) с моей машины и сохранить его как еще одну измененную копию. Я могу визуализировать метафайл времени выполнения в форме windows, но не смог сохранить его на своей машине.

Я приложил свой код ниже и был бы признателен, если бы кто-нибудь мог помочь.

Что я уже пробовал:

[DllImport("gdi32.dll")]
        static extern IntPtr CopyEnhMetaFile(  // Copy EMF to file
         IntPtr hemfSrc,   // Handle to EMF
         String lpszFile // File
       );

        [DllImport("gdi32.dll")]
        static extern int DeleteEnhMetaFile(  // Delete EMF
          IntPtr hemf // Handle to EMF
        );
        [DllImport("gdi32.dll")]
        static extern uint GetEnhMetaFileBits(IntPtr hemf, uint cbBuffer,
        [Out] byte[] lpbBuffer);

        private void PicModified_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            float[][] matrixColTrans =
                {
                        new float[] {0, 0, 0, 0, 0}
                        , new float[] {0, 0, 0, 0, 0}
                        , new float[] {0, 0, 0, 0, 0}
                        , new float[] {0, 204, 0, 1, 0}
                        , new float[] {0, 0, 0, 0, 0}
                    };
            ColorMatrix colorMatrix = new ColorMatrix(matrixColTrans);

            ImageAttributes ia = new ImageAttributes();
            ia.SetColorMatrix(colorMatrix);

            if (txtSelectEMFFilePath.Text.EndsWith(".emf"))
            {
                string destFileName = txtSelectEMFFilePath.Text;
                Metafile mf = new Metafile(destFileName);
                
                g.DrawImage(
                    mf
                    , new Rectangle(0, 0, picModified.Width, picModified.Height)// destination rectangle 
                    , 0, 0 // upper-left corner of source rectangle 
                    , mf.PhysicalDimension.Width // width of source rectangle
                    , mf.PhysicalDimension.Height // height of source rectangle
                    , GraphicsUnit.Pixel
                    , ia
                );
              
                // Save it as a metafile
                IntPtr iptrMetafileHandle = mf.GetHenhmetafile();

                // Export metafile to an image file
                IntPtr iptrMetafileHandleCopy = CopyEnhMetaFile(iptrMetafileHandle, "image.emf");
               
                //Binding Output file
                Image newimg = new Metafile("image.emf");
                imgOut.Image = newimg;
                imgOut.SizeMode = PictureBoxSizeMode.Zoom;

                //// Delete the metafile from memory
                DeleteEnhMetaFile(iptrMetafileHandle);
                DeleteEnhMetaFile(iptrMetafileHandleCopy);

                mf.Dispose();
                //1. End 
            }
        }

1 Ответов

Рейтинг:
2

MadMyche

Для этого вам нужно получить отдельный кодер, так как GDI+ не может сохранять эти типы метафайлов

Майкрософт Документы:
Замечания
Если для формата файла изображения не существует кодера, используется кодер Portable Network Graphics (PNG). При использовании метода Save для сохранения графического изображения в виде файла формата Windows Metafile format (WMF) или Enhanced Metafile Format (EMF) результирующий файл сохраняется в виде файла Portable Network Graphics (PNG).
Это происходит потому, что компонент GDI+ платформы .NET Framework не имеет кодировщика, который можно использовать для сохранения файлов в формате .wmf или .emf.

Изображение.Метод Сохранения (System.Чертеж) | Microsoft Docs[^]


itm.abhishek

Привет, я попробовал изображение.Метод Save, но он создает только изображение с расширением .emf. На самом деле он не создает истинный файл .emf. Я просмотрел несколько статей на MSDN и обнаружил, что функция CopyEnhMetaFile(iptrMetafileHandle, "image.emf") фактически копирует содержимое файла .emf в новый. Но в моем случае это всего лишь копирование исходного содержимого файла в новый файл и сохранение его обратно на машину. Новый файл, созданный функцией CopyEnhMetaFile, не включает в себя изменения цвета, выполненные функцией g.DrawImage в приведенном выше коде.