2012-03-28 48 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