繁体   English   中英

在.Net中加载图像时出现OutOfMemory异常

[英]OutOfMemory exception when loading an image in .Net

我从SQL CE数据库中加载图像,然后尝试将其加载到PictureBox中。

我正在这样保存图像:

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保存到Db。

我像这样重新加载图像:

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”);

当GDI无法理解某种图像格式时,它就会抛出OOM异常。 使用Irfanview查看实际上是哪种图像,GDI可能无法处理它。

根据您提供的代码,似乎您将图像视为一个字符串,这可能是由于从byte []到字符串以及从字符串到byte []的转换而丢失了数据。

我对SQL CE不熟悉,但是如果可以的话,应该考虑将数据视为byte []而不是在字符串之间进行编码。

我的假设基于这一行代码

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

我的建议是除非需要访问原始字节,否则不要使用FileStream加载图像。 而是使用Bitmap或Image对象中提供的静态方法:

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

要保存文件,请使用Image或Bitmap对象的.Save方法:

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

当然,我们不知道ArtWork是什么类型。 您愿意与我们分享这些信息吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM