Menggunakan C #, apakah ada cara yang lebih baik untuk mengkonversi Windows Bitmap
ke byte[]
daripada menyimpan ke file sementara dan membaca hasilnya menggunakan FileStream
?
233
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:
Anda bisa menggunakannya seperti:
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 baruMemoryStream
, menyimpanBitmap
dalam format apa pun itu ketika Anda memberikannya, dan mengembalikan array. Lewati overhead tambahan untuk membuatImageConverter
kelas dengan menggunakanMemoryStream
sumber
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.
.
sumber
Simpan Gambar ke MemoryStream dan kemudian ambil array byte.
http://msdn.microsoft.com/en-us/library/ms142148.aspx
sumber
System.Drawing.Image
(lihat: docs.microsoft.com/en-us/dotnet/api/… )System.Drawing.Image does not exist
. Jadi .. tidak, tidak bekerja :(Gunakan
MemoryStream
bukanFileStream
, a , seperti ini:sumber
ToArray
, bukanGetBuffer
.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 dariGetBuffer
akan mengembalikan gambar plus byte yang tidak digunakan, yang mungkin akan menghasilkan gambar yang rusak.Coba yang berikut ini:
Pastikan Anda menggunakan:
sumber
Saya yakin Anda bisa melakukannya:
sumber
sumber
Lebih sederhana:
sumber
Sangat sederhana gunakan ini hanya dalam satu baris:
sumber