【问题标题】:How to get a System.Drawing.Image object from image which build action is marked as Resource?如何从构建操作标记为资源的图像中获取 System.Drawing.Image 对象?
【发布时间】:2015-09-09 18:21:59
【问题描述】:

我有一个 wpf 应用程序,并且得到了一个对代码隐藏有用的图像,它在项目中的位置类似于“projectName\images\pp.png”,它的构建操作是“Resource”(节点:不是嵌入式资源)。 我需要代码隐藏中的 System.Drawing.Image 对象。 我尝试了这些方法:

1.

var img = new BitmapImage(new Uri(@"\images\pp.png", UriKind.Relative));
var stream = img.StreamSource;
System.Drawing.Image needObj = Image.FromStream(stream);

我有一个空流,所以它不起作用。

2.

private static System.IO.Stream getResource(string name)
{
    var assembly = Assembly.GetExecutingAssembly();
    string resName = assembly.GetName().Name + ".g.resources";
    return assembly.GetManifestResourceStream(resName);
}
var stream = getResource(@"\images\pp.png");
System.Drawing.Image needObj = Image.FromStream(stream);

我得到了一个 UnmanagedMemoryStream 对象,并且在调用“Image.FromStream(stream)”时发生了 InvalidArgument 异常。

谁能告诉我上述两种方法为什么不起作用或如何实现?

【问题讨论】:

  • 如果操作正确,资源是Bitmap,可以直接分配给Image变量。
  • 问题解决了吗?
  • @eforlina 好的,知道了,资源,不是嵌入式资源。所以 ints 最好删除 winforms 标签,因为资源仅适用于 wpf

标签: c# wpf


【解决方案1】:

WPF - 获取图像资源并转换为 System.Drawing.Image

var bitmapImage = new BitmapImage(new Uri(@"pack://application:,,,/"
    + Assembly.GetExecutingAssembly().GetName().Name
    + ";component/"
    + "images/pp.png", UriKind.Absolute));

var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create((BitmapImage)bitmapImage));
var stream = new MemoryStream();
encoder.Save(stream);
stream.Flush();
var image = new System.Drawing.Bitmap(stream);

注意:

  • 使用“/”代替“\”
  • 考虑阅读Pack URIs in WPF(重要部分:资源文件包URI)
  • 添加对 system.drawing.dll 的引用

本地程序集资源文件

编译到本地的资源文件的包 URI 程序集使用以下权限和路径: pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.Ext

【讨论】:

    【解决方案2】:

    Windows 窗体 - 获取图像嵌入资源:

    var assembly = System.Reflection.Assembly.GetExecutingAssembly();
    var stream= assembly.GetManifestResourceStream("YourAssemblyName.images.pp.png");
    var image = Image.FromStream(stream);
    

    注意:

    • "YourAssemblyName.images.pp.png" 区分大小写
    • 而不是 YourAssemblyName 输入您的程序集名称,例如对于我的项目,它是我的项目名称,也是我的默认命名空间。
    • 如果您不确定传递给 GetManifestResourceStram 的确切内容,请使用以下代码:

    查找嵌入的资源名称:

    var assembly = System.Reflection.Assembly.GetExecutingAssembly();
    assembly.GetManifestResourceNames()
            .Where(x => x.EndsWith("pp.png")) //Comment this line to find all resource names
            .ToList()
            .ForEach(resource =>
            {
                MessageBox.Show(resource);
            });
    

    【讨论】:

    • :不行。很容易得到BitmapImage对象。我需要的是System.Drawing.Image对象。顺便说一句,BitmapImage.StreamSource一直为空,这也让我很困惑。
    猜你喜欢
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多