C# 在.Net中加载映像时发生OutOfMemory异常

C# 在.Net中加载映像时发生OutOfMemory异常,c#,.net,C#,.net,我正在从SQL CE数据库加载一个图像,然后尝试将其加载到PictureBox中 我正在这样保存图像: if (ofd.ShowDialog() == DialogResult.OK) { picArtwork.ImageLocation = ofd.FileName; using (System.IO.FileStream fs = new System.IO.FileStream(ofd.FileName

我正在从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();
                }
            }
然后使用LINQtoSQL保存到数据库

我按如下方式加载图像:

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);
                }
但我得到了一个OutOfMemory例外。我已经读到,这是一个轻微的红鲱鱼和可能有一些错误的文件类型,但我不知道是什么

有什么想法吗

谢谢
picArtwork.Image=System.Drawing.Bitmap.FromFile(@“C:\Temp\img.jpg”)

当GDI不能理解某一图像格式时,它就会抛出OOM异常,这是一种不良行为。使用Irfanview查看图像的真实类型,GDI可能无法处理它。

根据您提供的代码,您似乎将图像视为字符串,从字节[]到字符串以及从字符串到字节[]的转换可能会丢失数据

我不熟悉SQL CE,但如果您可以,您应该考虑将数据视为字节[],而不是对字符串进行编码。 我的假设基于这行代码

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

我的建议是,除非需要访问原始字节,否则不要使用文件流加载图像。相反,请使用位图或图像对象中提供的静态方法:

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")

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

这是我自己添加的一个文件,所以我知道它是a.jpg。Net是否对格式进行了任何转换?它不应该破坏格式,但如果它这样做,它肯定应该是GDI支持的格式,因为它来自GDI。这个项目的类型是什么。Artwork?在第一个代码块中为其分配字节,但在第二个代码块中,将Artwork转换为String,然后将其转换为字节。为什么要进行多次转换?我删除了.ToString(),它就像一个符咒。好的。干杯