【发布时间】:2012-07-05 15:39:23
【问题描述】:
我正在使用 winform (C#)。 我将图像作为位图,我想将位图转换为字节以插入数据库。 那么,你能告诉我怎么做吗?
【问题讨论】:
我正在使用 winform (C#)。 我将图像作为位图,我想将位图转换为字节以插入数据库。 那么,你能告诉我怎么做吗?
【问题讨论】:
您可以使用 ImageConverter 获取字节数组形式的图像
public static byte[] GetBytesOfImage(Image img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
或者您可以使用 BitmapImage 进行转换。
使用这两种方法将位图转字节数组和字节数组转位图。
public Byte[] BufferFromImage(BitmapImage imageSource)
{
Stream stream = imageSource.StreamSource;
Byte[] buffer = null;
if (stream != null && stream.Length > 0)
{
using (BinaryReader br = new BinaryReader(stream))
{
buffer = br.ReadBytes((Int32)stream.Length);
}
}
return buffer;
}
public BitmapImage ImageFromBuffer(Byte[] bytes)
{
MemoryStream stream = new MemoryStream(bytes);
BitmapImage image = new BitmapImage();
image.BeginInit();
image.StreamSource = stream;
image.EndInit();
return image;
}
【讨论】:
BitmapImage 转换为字节数组,而不是 Bitmap。当然,您也可以将 Bitmap 转换为 BitmapImage,但为什么要这样做?
您可以使用以下代码:
Bitmap myBitmap = ...;
var imageStream = new MemoryStream();
using (imageStream)
{
// Save bitmap in some format.
myBitmap.Save(imageStream, ImageFormat.Jpeg);
imageStream.Position = 0;
// Do something with the memory stream. For example:
byte[] imageBytes = imageStream.ToArray();
// Save bytes to the database.
}
顺便说一句,我不知道您的图像会有多大以及您使用什么数据库,但是在数据库中存储大 blob 通常不是一个好主意。大型 blob 的文件系统性能比数据库性能好得多。 SQL Server 有 direct support 用于在文件系统上以事务方式存储 blob(他们建议将其用于 1MB 及更大的文件)。
在数据库中存储文件时,我发现 SQL Server Compact 的读取性能严重下降。我不知道其他数据库在存储大 blob 时的表现如何。
另一种可能的解决方案是将图像存储在文件系统上,并在数据库中提供指向文件的指针。
【讨论】:
您可以使用Bitmap.Save 将位图的内容保存到流中。您可以将其与 MemoryStream 一起使用,如下所示:
MemoryStream memoryStream = new MemoryStream();
Bitmap newBitmap = new Bitmap();
newBitmap.Save(memoryStream, ImageFormat.Bmp);
byte[] bitmapRecord = memoryStream.ToArray();
【讨论】:
Bitmap newBitmap = new Bitmap();.查看新更新。