代码之家  ›  专栏  ›  技术社区  ›  Chris Degnen Akila Dilan Md

为什么要将资源中的EMF转换为位图?

  •  1
  • Chris Degnen Akila Dilan Md  · 技术社区  · 7 年前

    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 回复  |  直到 7 年前
        1
  •  0
  •   Chris Degnen Akila Dilan Md    7 年前

    EMF正在由 Save 操作。

    由于 this answer ,稍加修改。

    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);
    }
    

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