以编程方式将资源加载为字节数组

Posted

技术标签:

【中文标题】以编程方式将资源加载为字节数组【英文标题】:load resource as byte array programmatically 【发布时间】:2012-03-18 06:23:30 【问题描述】:

我将图像添加为文件并将类型设置为资源(见截图) 如何在不使用 resx 文件等的情况下将其作为字节数组提取出来?

【问题讨论】:

我认为您在询问之前没有搜索过网络。 support.microsoft.com/kb/319292 是的,但没有显示如何获取byte[] 【参考方案1】:

如果您不直接使用图像(即:如果您的项目是 Windows 应用程序,则使用控件),那么您可以:

1-更改文件扩展名(即:*.jpg.data)

2- 将“图像”添加到资源文件 RESX

3- 使用以下方法访问字节数组:Resources.PathToImages.ResxFileName.ImageName

注意:如果添加扩展名不变的图像,RESX 编译器会创建 Bitmap 属性而不是 byte[] 属性。

【讨论】:

【参考方案2】:

事情甚至比项目标记为答案更简单!

如果点击资源中的文件并查看属性窗口,可以将文件类型设置为二进制。 然后你就可以通过简单的代码访问字节数组了

var byteArray = Properties.Resources.FileName;

其中 FileName 是您的资源的名称。

【讨论】:

使用 Visual Studio Express 2010 我无法更改 PNG 资源的类型,但我在添加为资源之前将文件重命名为 .bin,效果非常好! 我在 Visual Studio 2017 中看不到任何更改文件类型的选项 您确定要查看“属性”窗口吗?我刚刚检查了我安装的 VS2017,它肯定在那里。 VS 2015:被识别为图像格式的文件显示在资源的 Images 视图中。然而,属性中的文件类型选项似乎只显示在 文件 视图中的资源。 似乎有些混乱,因为我们正在讨论嵌入资源的两种不同方法。 OP 正在讨论将文件的构建操作设置为嵌入式资源。您正在谈论使用 resx 文件。我认为 OP 不知道该选项。【参考方案3】:

How to embed and access resources by using Visual C# 中描述了该过程。

本质上它需要使用反射,使用 Assembly 类。

Stream imageStream = 
            currentAssembly.GetManifestResourceStream("Resources.logo_foot.png");

有关如何从Stream 获取byte[] 的详细信息,请参阅How to convert an Stream into a byte[] in C#?。

【讨论】:

我必须输入整个命名空间才能让它工作。如果您不确定自己拥有哪些资源,请致电 currentAssembly.GetManifestResourceNames() 从流中获取字节数组似乎是不必要的棘手。我认为使用 Resources.resx 嵌入资源要好得多,然后它将提供使用 byte[] 而不是 Stream 的访问权限。

以上是关于以编程方式将资源加载为字节数组的主要内容,如果未能解决你的问题,请参考以下文章

将文件加载为字节数组,而不在内存中分配它 C#

将字节数组转换为字符串 spark

Apptication的其他功能

使用 Rails 将字节数组转换为 HTML 图像?

遍历字节数组以解析出各个长度

在 Qml 中从字节数组加载到图像