Menggunakan C #, apakah ada cara yang lebih baik untuk mengkonversi Windows Bitmap
ke byte[]
daripada menyimpan ke file sementara dan membaca hasilnya menggunakan FileStream
?
Menggunakan C #, apakah ada cara yang lebih baik untuk mengkonversi Windows Bitmap
ke byte[]
daripada menyimpan ke file sementara dan membaca hasilnya menggunakan FileStream
?
Jawaban:
Ada beberapa cara.
ImageConverter
public static byte[] ImageToByte(Image img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
Yang ini nyaman karena tidak memerlukan banyak kode.
Aliran Memori
public static byte[] ImageToByte2(Image img)
{
using (var stream = new MemoryStream())
{
img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
return stream.ToArray();
}
}
Yang ini setara dengan apa yang Anda lakukan, kecuali file disimpan ke memori, bukan ke disk. Meskipun lebih banyak kode Anda memiliki pilihan ImageFormat dan dapat dengan mudah dimodifikasi antara menyimpan ke memori atau disk.
ImageConverter
metode ini akan menyimpan gambar sebagai Png, menghasilkan file BESAR.
ImageConverter
bukan standar .net yang mungkin Anda gunakanMemoryStream
Sebuah MemoryStream dapat membantu untuk ini. Anda bisa memasukkannya dalam metode ekstensi:
public static class ImageExtensions
{
public static byte[] ToByteArray(this Image image, ImageFormat format)
{
using(MemoryStream ms = new MemoryStream())
{
image.Save(ms, format);
return ms.ToArray();
}
}
}
Anda bisa menggunakannya seperti:
var image = new Bitmap(10, 10);
// Draw your image
byte[] arr = image.ToByteArray(ImageFormat.Bmp);
Saya sebagian tidak setuju dengan jawaban prestomanifto sehubungan dengan ImageConverter. Jangan gunakan ImageConverter. Tidak ada yang salah secara teknis dengan itu, tetapi hanya fakta bahwa ia menggunakan tinju / unboxing dari objek memberitahu saya itu kode dari tempat-tempat gelap tua dari kerangka NET. Dan itu tidak ideal untuk digunakan dengan pemrosesan gambar (itu terlalu banyak untuk mengkonversi ke byte [] setidaknya), terutama ketika Anda mempertimbangkan yang berikut ini.
Saya melihat ImageConverter
kode yang digunakan oleh .Net framework, dan secara internal ia menggunakan kode yang hampir identik dengan yang saya berikan di atas. Itu menciptakan yang baru MemoryStream
, menyimpan Bitmap
dalam format apa pun itu ketika Anda memberikannya, dan mengembalikan array. Lewati overhead tambahan untuk membuat ImageConverter
kelas dengan menggunakanMemoryStream
Anda juga bisa Marshal. Salin data bitmap. Tidak ada aliran memori perantara dll. Dan salinan memori cepat. Ini harus bekerja pada bitmap 24-bit dan 32-bit.
public static byte[] BitmapToByteArray(Bitmap bitmap)
{
BitmapData bmpdata = null;
try
{
bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
int numbytes = bmpdata.Stride * bitmap.Height;
byte[] bytedata = new byte[numbytes];
IntPtr ptr = bmpdata.Scan0;
Marshal.Copy(ptr, bytedata, 0, numbytes);
return bytedata;
}
finally
{
if (bmpdata != null)
bitmap.UnlockBits(bmpdata);
}
}
.
Simpan Gambar ke MemoryStream dan kemudian ambil array byte.
http://msdn.microsoft.com/en-us/library/ms142148.aspx
Byte[] data;
using (var memoryStream = new MemoryStream())
{
image.Save(memoryStream, ImageFormat.Bmp);
data = memoryStream.ToArray();
}
System.Drawing.Image
(lihat: docs.microsoft.com/en-us/dotnet/api/… )
System.Drawing.Image does not exist
. Jadi .. tidak, tidak bekerja :(
Gunakan MemoryStream
bukan FileStream
, a , seperti ini:
MemoryStream ms = new MemoryStream();
bmp.Save (ms, ImageFormat.Jpeg);
byte[] bmpBytes = ms.ToArray();
ToArray
, bukan GetBuffer
.
Note that the buffer contains allocated bytes which might be unused. For example, if the string "test" is written into the MemoryStream object, the length of the buffer returned from GetBuffer is 256, not 4, with 252 bytes unused. To obtain only the data in the buffer, use the ToArray method.
Jadi sekarang array byte dari GetBuffer
akan mengembalikan gambar plus byte yang tidak digunakan, yang mungkin akan menghasilkan gambar yang rusak.
Coba yang berikut ini:
MemoryStream stream = new MemoryStream();
Bitmap bitmap = new Bitmap();
bitmap.Save(stream, ImageFormat.Jpeg);
byte[] byteArray = stream.GetBuffer();
Pastikan Anda menggunakan:
System.Drawing & using System.Drawing.Imaging;
MemoryStream ms = new MemoryStream();
yourBitmap.Save(ms, ImageFormat.Bmp);
byte[] bitmapData = ms.ToArray();
Lebih sederhana:
return (byte[])System.ComponentModel.TypeDescriptor.GetConverter(pImagen).ConvertTo(pImagen, typeof(byte[]))
Sangat sederhana gunakan ini hanya dalam satu baris:
byte[] imgdata = File.ReadAllBytes(@"C:\download.png");