C# 保存时以二进制列重新编码Jpeg图像

C# 保存时以二进制列重新编码Jpeg图像,c#,winforms,C#,Winforms,我知道也有类似的问题,但我有一个关于在二进制列中存储图像的问题 我有一个小的windows窗体应用程序,它使用Linq2SQL将图像从sql compact db加载到picturebox控件中。用户可以在picturebox上拖动任何图像(jpg、bmp、gif)。在DragDrop事件中,图像被加载到picturebox中。 保存记录时,执行以下代码以存储picturebox控件的图像: MemoryStream imgStream = new MemoryStream(); picture

我知道也有类似的问题,但我有一个关于在二进制列中存储图像的问题

我有一个小的windows窗体应用程序,它使用Linq2SQL将图像从sql compact db加载到picturebox控件中。用户可以在picturebox上拖动任何图像(jpg、bmp、gif)。在DragDrop事件中,图像被加载到picturebox中。 保存记录时,执行以下代码以存储picturebox控件的图像:

MemoryStream imgStream = new MemoryStream();
pictureBox1.Image.Save(imgStream, System.Drawing.Imaging.ImageFormat.Jpeg);
myTable.MyImage = imgStream.ToArray();
我已经检查了字节数组的大小,保存记录后它没有改变。
是否每次调用Save方法时都对图像重新编码?然后最好检查图像是否已更改。

如果在调用“保存”时调用此代码,则“是”,PictureBox每次都会将自身“导出”为JPEG。您是否因此注意到性能问题?如果要避免这种情况,请在应用程序加载时设置一个标志,当发生拖放事件时,升起标志,表示保存方法应更新图像数据。

JPEG图像根据.NET显示的功能进行解码(或者实际上是任何功能)。因此,如果您将JPEG作为二进制文件取出,将其放入PictureBox(将其转换为光栅格式以显示),然后获取现在未压缩的光栅图像并重新压缩,您可能最终会对该图像进行更改


我会将显示图像的原始ByTestStream保存在幕后某个位置,并在用户保存数据时将其写回DB。这不仅有助于保持图像的完整性,还可以通过减少每次重新压缩图像的需要来提高性能。

谢谢,您帮助找到了一个解决方案:我将字节数组(旧图像和当前编码的图像)与SequenceEqual进行比较<代码>如果(myTable.MyImage==null | | |!myTable.MyImage.ToArray().SequenceEqual(imgStream.ToArray())myTable.MyImage=imgStream.ToArray()My last comment假设byte[]压缩图像(保存时)与数据库中的byte[]相同。调试时,我发现如果图像没有更改,字节[]实际上是相同的。这可能是因为我总是将图像保存为jpg吗?JPEG压缩的“有损”部分发生在数据被实际压缩之前,而且压缩器应该足够智能,能够发现数据已经以足够简单的形式进行压缩。因此,在最初的转换之后,为了简化图像而丢弃信息,基本上得到的是一个ZIP文件,您可以将其解压缩以显示,然后重新压缩以保存。只要图像不改变,您就可以无限期地执行此操作。在我的情况下,性能不是问题,我只想避免每次保存记录时降低质量。