Saya membuat aplikasi berbagi Desktop Jarak Jauh di mana saya mengambil gambar dari Desktop dan Mengompresnya dan Mengirimkannya ke penerima. Untuk mengompres gambar saya perlu mengubahnya menjadi byte [].
Saat ini saya menggunakan ini:
public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}
public Image byteArrayToImage(byte[] byteArrayIn)
{
MemoryStream ms = new MemoryStream(byteArrayIn);
Image returnImage = Image.FromStream(ms);
return returnImage;
}
Tetapi saya tidak menyukainya karena saya harus menyimpannya dalam ImageFormat dan itu juga dapat menggunakan sumber daya (Perlambat) serta menghasilkan hasil kompresi yang berbeda. Saya telah membaca tentang menggunakan Marshal.Copy dan memcpy tetapi saya tidak dapat melakukannya mengerti mereka.
Jadi, apakah ada metode lain untuk mencapai tujuan ini?
MemoryStream
; itu adalah sumber daya yang sepenuhnya dikelola, kecuali jika Anda menggunakannya di remote. Dalam kedua kasus ini, akan menjadi tidak tepat untuk membuang sumber daya.Jawaban:
Tidak. Untuk mengonversi gambar ke array byte Anda harus menentukan format gambar - sama seperti Anda harus menentukan pengkodean saat Anda mengubah teks menjadi array byte.
Jika Anda khawatir tentang artefak kompresi, pilih format lossless. Jika Anda khawatir tentang sumber daya CPU, pilih format yang tidak mengganggu kompresi - hanya piksel ARGB mentah, misalnya. Tapi tentu saja itu akan menghasilkan array byte yang lebih besar.
Perhatikan bahwa jika Anda memilih format yang tidak termasuk kompresi, tidak ada gunanya di kemudian mengompresi array byte setelah itu - itu hampir pasti tidak berpengaruh menguntungkan.
sumber
imageIn.RawFormat
yang mencoba menyimpan byte gambar mentah tanpa encoding ulang lebih lanjut.Ada properti RawFormat dari parameter Gambar yang mengembalikan format file gambar. Anda dapat mencoba yang berikut ini:
sumber
myObject.Dispose()
atauusing(myObject){}
- keduanya melakukan hal yang sama, tetapi menggunakan pernyataan pada dasarnya menciptakan ruang lingkup yang akan membersihkan untuk Anda.Saya tidak yakin apakah Anda akan mendapatkan keuntungan besar karena alasan yang ditunjukkan Jon Skeet. Namun, Anda dapat mencoba dan mengukur metode TypeConvert.ConvertTo dan melihat perbandingannya dengan metode Anda saat ini.
sumber
sumber
sumber
Cara tercepat yang bisa saya temukan adalah ini:
Semoga bermanfaat
sumber
System.Windows.Controls.Image
objek. Jika Anda ingin mengubah salah satunya menjadi byte, dan Anda meneruskannya ke baris ini karenaInputImg
, ini tidak akan berhasil. Ia mengharapkan sebuahSystem.Drawing.Image
objek.