为何资源中的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
相关产品推荐
相关产品推荐

