2010-04-19 48 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是。你愿意与我们分享这些信息吗?

相关问题