2012-03-28 49 views
4

稍微愚蠢的,但...商店形象的.resx为字节[],而不是位图

有没有一种方法,以防止Visual Studio的治疗中的.resx .jpg文件作为位图,以便我能而不是访问资源的byte []属性?

我只是想:

byte[] myImage = My.Resources.MyImage; 
+0

它是否会伤害你的应用程序要做到这一点的表现? 'ImageConverter converter = new ImageConverter();返回(byte [])converter.ConvertTo(img,typeof(byte []));' – 2012-03-28 05:37:43

回答

5

尝试使用一种“嵌入的资源”,而不是

因此,可以说你有一个jpg“Foo.jpg”在ClassLibrary1的。将“构建操作”设置为“嵌入式资源”。如果你想要一个更可重复使用的方法

byte[] GetBytes(string resourceName) 
{ 
    var assembly = GetType().Assembly; 
    var fullResourceName = string.Concat(assembly.GetName().Name, ".", resourceName); 
    using (var stream = assembly.GetManifestResourceStream(fullResourceName)) 
    { 
     var buffer = new byte[stream.Length]; 
     stream.Read(buffer, 0, (int) stream.Length); 
     return buffer; 
    } 
} 

,并呼吁

var bytes = GetBytes("Foo.jpg"); 
+0

是的,我认为这是我真正想要的,我所追求的是一种在程序集中保留各种文件的方式,以便我可以从代码创建它们,而不是在构建时将它们复制到输出。 – Grokodile 2012-03-28 05:53:51

0

没有办法,我知道的,虽然你可以重新定义了.Designer.cs生成的代码返回不包含从位图的位图,但字节数组。

+0

呃,我对自动生成的东西不会太多。你可能最终会触发它重新生成,现在你有一个维修头痛。 – 2012-03-28 05:36:29

5

给这个

然后使用此代码来获取字节

byte[] GetBytes() 
{ 
    var assembly = GetType().Assembly; 
    using (var stream = assembly.GetManifestResourceStream("ClassLibrary1.Foo.jpg")) 
    { 
     var buffer = new byte[stream.Length]; 
     stream.Read(buffer, 0, (int) stream.Length); 
     return buffer; 
    } 
} 

,或者, jpeg文件有不同的扩展名,例如“myfile.jpeg.bin”。然后Visual Studio应该将其视为二进制文件,生成的设计器代码将返回byte []。

3

或者,右键单击您的.resx文件,然后单击“查看代码”。

编辑使用System.Byte[]这样的XML资源项目:

<data name="nomap" type="System.Resources.ResXFileRef, System.Windows.Forms"> 
    <value>..\Resources\nomap.png;System.Byte[]</value> 
</data> 

保存,你应该能够使用Byte[],而不是Bitmap

+0

只有这个对我有用,谢谢 – 2017-01-31 08:48:47

+0

注意:不要与** Resource.Designer.cs **文件混淆,任何类型的改变都会给你一个运行时错误。请在** Resource.resx **文件中更改您的类型。 – 2017-01-31 09:00:55