【问题标题】:PNG file is corrupt when reading back from SQL从 SQL 回读时 PNG 文件已损坏
【发布时间】:2016-04-11 08:52:54
【问题描述】:

我有一个数据库程序,它将图像存储到 SQL DB 并将它们读回以显示在 WPF 应用程序中。如果我使用 Jpeg 图像,它可以正常工作,但如果我使用 PNG 图像,我想用它来尝试保持透明度(存储时无论如何都会消失),大多数图像都会损坏。

这是被选中的图片

然后我将它保存到数据库,并将图像添加到列表视图

然后如果我关闭应用程序并重新加载它,它会从数据库中拉回图像,您可以在列表视图中看到它已损坏

然后当我选择它时,图像控件也会显示损坏的图像

我正在使用 BitmapImage 对象将图像存储在代码中,并使用它来设置 image.source,并将其转换为 byte[] 以存储到数据库中的图像字段中。

我使用以下行将位图图像转换为 Byte[]

                    command.Parameters.AddWithValue("@Image", ImageToByteArray(productImage.ProductImage));

这些是与位图图像相互转换的函数

        private static BitmapImage BuildImage(byte[] image)
    {
        var bitmap = new BitmapImage();
        bitmap.BeginInit();
        MemoryStream mem = new MemoryStream(image);
        bitmap.StreamSource = mem;
        bitmap.CacheOption = BitmapCacheOption.OnLoad;
        bitmap.EndInit();
        //bitmap.Freeze();

        return bitmap;
    }

    private static byte[] ImageToByteArray(BitmapImage image)
    {
        byte[] data;
        JpegBitmapEncoder encoder = new JpegBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(image));
        using (MemoryStream ms = new MemoryStream())
        {
            encoder.Save(ms);
            data = ms.ToArray();
        }

        return data;

    }

适用于 Jpegs,但我有图像的白色背景。

任何帮助将不胜感激。

【问题讨论】:

  • 您使用哪种编程语言和 DBMS?
  • 我建议在 SQL 中使用 varBinary 作为数据类型并将其放在 C# 中的流中并将其转换为 String base64 ;)
  • 图像只是 SQL Server 的 BLOB。它不会以任何方式影响或修改数据,因此问题在于您如何存储和读取它......
  • Jpeg 不支持透明度。
  • 我使用 c# 作为语言,使用 SQL Express 2014 作为数据库。我确实认为一旦将它存储为字节 [] 应该没问题,所以也许它在 c# 中的转换,图像显示为图像,我将 .source 设置为 BitmapImage,在读回时,我转换源返回位图图像,storedImage = img.source as BitmapImage... 我将尝试将数据库类型更改为 varBinary,但我不确定这会产生什么不同。

标签: sql bytearray bitmapimage


【解决方案1】:

“JpegBitmapEncoder”是一个很大的线索。你肯定想要"PNGBitmapEncoder"...?

【讨论】:

    【解决方案2】:

    根据个人喜好,我会将您的 SQL 数据列更改为 varbinary(MAX) 并使用流和 BinaryReader 对象来上传文件。

    但是我认为你的问题是你没有使用 PngBitmapEncoder 来处理你正在使用 JpegBitmapEncoder 的 PNG,无论文件类型如何。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-10-24
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      相关资源
      最近更新 更多