2010-04-19 58 views
1

從SQL CE db加載圖像,然後嘗試將其加載到PictureBox中。在.Net中加載圖像時發生OutOfMemory異常

我保存圖像這樣的:

if (ofd.ShowDialog() == DialogResult.OK) 
      { 
       picArtwork.ImageLocation = ofd.FileName; 
       using (System.IO.FileStream fs = new System.IO.FileStream(ofd.FileName, System.IO.FileMode.Open)) 
       { 
        byte[] imageAsBytes = new byte[fs.Length]; 
        fs.Read(imageAsBytes, 0, imageAsBytes.Length); 
        thisItem.Artwork = imageAsBytes; 
        fs.Close(); 
       } 
      } 

,然後使用LINQ to SQL保存到數據庫中。

我加載圖像回像這樣:

using (FileStream fs = new FileStream(@"C:\Temp\img.jpg", FileMode.CreateNew ,FileAccess.Write)) 
       { 
        byte[] img = (byte[])encoding.GetBytes(ThisFilm.Artwork.ToString()); 
        fs.Write(img, 0, img.Length); 
       } 

,但我得到一個OutOfMemoryException。我已經讀過,這是一個輕微的紅色鯡魚,並可能有文件類型有問題,但我不能確定什麼。

任何想法?

謝謝 picArtwork.Image = System.Drawing.Bitmap.FromFile(@「C:\ Temp \ img.jpg」);

+0

這是什麼類型的藝術品?您將在第一個代碼塊中爲其分配字節,但在第二個代碼塊中將Artwork ToString轉換爲字符,然後將其轉換爲字節。爲什麼多次轉換? – dthorpe 2010-04-19 20:12:28

回答

0

根據您提供的代碼,您似乎將圖像視爲字符串,可能是數據在從byte []到字符串和字符串到byte []的轉換過程中丟失。

我對SQL CE並不熟悉,但是如果您可以考慮將數據視爲字節[]並且不對字符串進行編碼。

我基地我的假設在這行代碼

byte[] img = (byte[])encoding.GetBytes(ThisFilm.Artwork.ToString()); 
+0

我刪除了.ToString(),它像一個魅力。發現得好。乾杯。 – Ben 2010-04-20 10:31:18

0

只要GDI不能理解特定的圖像格式,GDI就會拋出OOM異常的不良行爲。使用Irfanview來查看真正的圖像類型,可能GDI無法處理它。

+0

這是一個我添加了自己的文件,所以我知道它是一個.jpg。 .Net是否會對格式進行任何轉換? – Ben 2010-04-19 20:08:53

+0

它不應該破壞格式,但如果是這樣,它肯定應該是GDI支持的格式,因爲它來自GDI。 – dthorpe 2010-04-19 20:11:29

0

我的建議是不要使用一個FileStream加載圖像,除非你需要訪問原始字節。相反,使用位圖或圖像對象提供的靜態方法:

Image img = Image.FromFile(@"c:\temp\img.jpg") 
Bitmap bmp = Bitmap.FromFile(@"c:\temp\img.jpg") 

要保存文件使用圖像或位圖對象的.Save方法:

img.Save(@"c:\temp\img.jpg") 
bmp.Save(@"c:\temp\img.jpg") 

當然,我們不知道是什麼類型ArtWork是。你願意與我們分享這些信息嗎?

相關問題