【发布时间】: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