You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何资源中的blank.emf经代码保存后变为位图?

问题根源:资源导入时的自动格式转换

你遇到的问题核心在于Visual Studio默认会把导入的EMF文件转换成位图格式存储在资源中,而不是保留原始的EMF元数据。所以当你从Properties.Resources.blank获取数据时,拿到的已经是位图的字节数组,而非原始的EMF流——哪怕你之后用这些字节创建Metafile并指定ImageFormat.Emf保存,最终得到的文件本质还是位图。

快速验证问题

你可以检查Properties.Resources.blank的类型:它应该是Bitmap而不是Metafile,这就直接证明资源已经被自动转换了。

解决方案:保留原始EMF资源

要解决这个问题,你需要修改资源的导入方式,让Visual Studio以原始字节形式嵌入EMF文件,而非自动转换格式:

步骤1:调整资源的生成操作

在解决方案资源管理器中找到blank.emf文件:

  • 右键点击文件,选择「属性」
  • 将「生成操作」从默认的「资源」改为「嵌入的资源」
  • 「复制到输出目录」设置为「不复制」即可,因为嵌入资源会打包进程序集,无需单独复制

步骤2:修改代码读取原始EMF流

现在资源以原始字节形式存在,你需要从程序集的嵌入资源中读取它,而不是通过Properties.Resources。修改后的代码如下:

using System.Reflection; // 需要添加这个命名空间

private void button1_Click(object sender, EventArgs e)
{
    Metafile emf = null;
    // 注意:资源路径格式是「项目命名空间.资源文件名」,比如你的项目叫EMFTest,这里就是EMFTest.blank.emf
    var resourcePath = "YourProjectNamespace.blank.emf";
    using (var ms = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourcePath))
    {
        if (ms != null)
        {
            emf = new Metafile(ms);
        }
    }
    
    if (emf != null)
    {
        emf.Save(@"C:\Users\chrisd\Documents\emfbitmap1.emf", ImageFormat.Emf);
    }
}

确认资源路径的小技巧

如果你不确定资源的完整路径,可以用下面的代码列出程序集中所有嵌入资源的名称,找到blank.emf对应的路径:

foreach (var resourceName in Assembly.GetExecutingAssembly().GetManifestResourceNames())
{
    Console.WriteLine(resourceName);
}

这样修改后,你保存的文件就会是真正的EMF格式,而不是位图了。

内容的提问来源于stack exchange,提问作者Chris Degnen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:21:47