【问题标题】:Re-encoding of Jpeg Image in binary column when saving保存时在二进制列中重新编码 Jpeg 图像
【发布时间】:2011-02-17 01:58:34
【问题描述】:

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

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

MemoryStream imgStream = new MemoryStream();
pictureBox1.Image.Save(imgStream, System.Drawing.Imaging.ImageFormat.Jpeg);
myTable.MyImage = imgStream.ToArray();

我检查了字节数组的大小,保存记录后它没有改变。 每次调用 Save-Method 时是否重新编码图像?最好检查一下图像是否发生了变化。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,您帮助找到了解决方案:我将字节数组(旧图像和当前编码的图像)与之前的 SequenceEqual 进行了比较。 if (myTable.MyImage == null || !myTable.MyImage.ToArray().SequenceEqual(imgStream.ToArray())) myTable.MyImage = imgStream.ToArray();
    • 我的最后一条评论假设 byte[] 压缩图像(保存时)与数据库中的 byte[] 相同。调试时我发现 byte[] 实际上是相同的,如果图像没有改变的话。这可能是因为我总是将图像保存为 jpg?
    • JPEG 压缩的“有损”部分发生在数据实际压缩之前,并且压缩器应该足够聪明,以找出数据已经以足够简单的形式进行压缩。因此,在丢弃信息以简化图像的初始转换之后,您基本上得到的是一个 ZIP 文件,您解压缩以显示,然后重新压缩以保存。只要图像不改变,您就可以无限期地这样做。
    【解决方案2】:

    如果在调用 Save 时调用了此代码,那么是的,PictureBox 每次都会将自身“导出”为 JPEG。您是否因此注意到性能问题?如果您想避免这种情况,请在应用程序加载时设置一个标志,并在发生拖放事件时引发标志,表明 Save 方法应该更新图像数据。

    【讨论】:

    • 在我的情况下性能不是问题,我只是想避免每次保存记录时降低质量。
    猜你喜欢
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多