Почему моя EMF в ресурсах конвертируется в растровое изображение?

Chris Degnen спросил: 28 апреля 2018 в 08:34 в: c#

Почему EMF, называемый blank.emf в ресурсах, сохраняется в виде растрового изображения?

private void button1_Click(object sender, EventArgs e)
{
    Metafile emf = null;
    using (var ms = new MemoryStream(Properties.Resources.blank))
    {
        emf = new Metafile(ms);
    }
    emf.Save("C:\\Users\\chrisd\\Documents\\emfbitmap1.emf",
        ImageFormat.Emf);
}

emfbitmap1.emf - это растровое изображение, а не EMF. Я подозреваю, что он преобразуется в растровое изображение после извлечения из Properties.Resources. Это определенно EMF в файловой системе.

1 ответ

Chris Degnen ответил: 28 апреля 2018 в 10:43

EMF преобразуется в растровое изображение с помощью операции Save.

EMF может быть успешно записана благодаря этому ответу с незначительными изменениями.

using System.Runtime.InteropServices;

, включая класс

    [DllImport("gdi32.dll")]
    internal static extern uint GetEnhMetaFileBits(IntPtr hemf,
        uint cbBuffer, byte[] lpbBuffer);    [DllImport("gdi32.dll")]
    internal static extern bool DeleteEnhMetaFile(IntPtr hemf);

и изменение кода

private void button1_Click(object sender, EventArgs e)
{
    Metafile emf = null;
    using (var ms = new MemoryStream(Properties.Resources.blank))
    {
        emf = new Metafile(ms);
    }    IntPtr h = emf.GetHenhmetafile();
    uint size = GetEnhMetaFileBits(h, 0, null);
    byte[] data = new byte[size];
    GetEnhMetaFileBits(h, size, data);
    using (FileStream w = File.
        Create("C:\\Users\\chrisd\\Documents\\emfbitmap1.emf"))
    {
        w.Write(data, 0, (int)size);
    }    DeleteEnhMetaFile(h);
}

Конечно, если не требуется иметь EMF в памяти, он может быть записан на диск напрямую. Например.

private void button1_Click(object sender, EventArgs e)
{
    File.WriteAllBytes("C:\\Users\\chrisd\\Documents\\emfbitmap1.emf",
        Properties.Resources.blank);
}