私はwinform(C#)を使用しています。画像をビットマップとして持っていて、ビットマップをバイトに変換してデータベースに挿入したいと思います。では、その方法を教えていただけますか?
3 に答える
ImageConverter get byte array form image を使用できます
public static byte[] GetBytesOfImage(Image img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
または、BitmapImage を使用して変換を行うことができます。
これら 2 つのメソッドを使用して、ビットマップをバイト配列に、バイト配列をビットマップに変換します。
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;
}
これには次のコードを使用できます。
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 の方がはるかに優れています。SQL Server は、ファイル システムに BLOB をトランザクション的に格納することを直接サポートしています (1MB 以上のファイルには SQL Server を使用することをお勧めします)。
データベースにファイルを格納するときに、SQL Server Compact で読み取りパフォーマンスが大幅に低下するのを見てきました。大きなブロブを保存するときに他のデータベースがどのように機能するかはわかりません。
もう 1 つの解決策として、イメージをファイル システムに保存し、データベースにファイルへのポインターを設定する方法があります。
を使用Bitmap.Save
して、ビットマップの内容をストリームに保存できます。MemoryStream
これを次のように使用できます。
MemoryStream memoryStream = new MemoryStream();
Bitmap newBitmap = new Bitmap();
newBitmap.Save(memoryStream, ImageFormat.Bmp);
byte[] bitmapRecord = memoryStream.ToArray();