Saya ingin mengubah array byte menjadi gambar.
Ini adalah kode database saya dari mana saya mendapatkan array byte:
public void Get_Finger_print()
{
try
{
using (SqlConnection thisConnection = new SqlConnection(@"Data Source=" + System.Environment.MachineName + "\\SQLEXPRESS;Initial Catalog=Image_Scanning;Integrated Security=SSPI "))
{
thisConnection.Open();
string query = "select pic from Image_tbl";// where Name='" + name + "'";
SqlCommand cmd = new SqlCommand(query, thisConnection);
byte[] image =(byte[]) cmd.ExecuteScalar();
Image newImage = byteArrayToImage(image);
Picture.Image = newImage;
//return image;
}
}
catch (Exception) { }
//return null;
}
Kode konversi saya:
public Image byteArrayToImage(byte[] byteArrayIn)
{
try
{
MemoryStream ms = new MemoryStream(byteArrayIn,0,byteArrayIn.Length);
ms.Write(byteArrayIn, 0, byteArrayIn.Length);
returnImage = Image.FromStream(ms,true);//Exception occurs here
}
catch { }
return returnImage;
}
Ketika saya mencapai baris dengan komentar, pengecualian berikut terjadi: Parameter is not valid.
Bagaimana cara memperbaiki apa pun yang menyebabkan pengecualian ini?
c#
arrays
byte
bytebuffer
Tanzeel ur Rahman
sumber
sumber
Jawaban:
Anda menulis ke aliran memori Anda dua kali, juga Anda tidak akan membuang aliran setelah digunakan. Anda juga meminta dekoder gambar untuk menerapkan koreksi warna tersemat.
Coba ini sebagai gantinya:
sumber
Mungkin saya melewatkan sesuatu, tetapi bagi saya baris satu ini berfungsi dengan baik dengan array byte yang berisi gambar file JPEG.
EDIT:
Lihat di sini untuk versi terbaru dari jawaban ini: Bagaimana mengkonversi gambar dalam array byte
sumber
sumber
Saya ingin mencatat bahwa ada bug dalam solusi yang disediakan oleh @ isaias-b.
Solusi tersebut mengasumsikan bahwa
stride
sama dengan panjang baris. Tapi itu tidak selalu benar. Karena penyelarasan memori yang dilakukan oleh GDI, langkah bisa lebih besar dari panjang baris. Ini harus diperhitungkan. Jika tidak, gambar bergeser yang tidak valid akan dihasilkan. Byte pengisi di setiap baris akan diabaikan.Kode tetap:
Untuk mengilustrasikan apa yang bisa ditimbulkannya, mari buat
PixelFormat.Format24bppRgb
gambar gradien 101x101:Jika kita akan menyalin seluruh array apa adanya ke alamat yang ditunjuk
bmpData.Scan0
, kita akan mendapatkan gambar berikut. Gambar bergeser karena bagian gambar ditulis ke padding byte, yang diabaikan. Juga itulah mengapa baris terakhir tidak lengkap:Tetapi jika kita akan menyalin pointer tujuan bergeser baris demi baris dengan
bmpData.Stride
nilai, gambar yang valid akan dihasilkan:Langkah juga bisa negatif:
Tetapi saya tidak bekerja dengan gambar seperti itu dan ini di luar catatan saya.
Jawaban terkait: C # - Buffer RGB dari Bitmap berbeda dari C ++
sumber
Semua jawaban yang disajikan mengasumsikan bahwa array byte berisi data dalam representasi format file yang dikenal, seperti: gif, png atau jpg. Tetapi saya baru-baru ini mengalami masalah saat mencoba mengubah
byte[]
s, yang berisi informasi BGRA yang dilinearisasi, secara efisien menjadiImage
objek. Kode berikut menyelesaikannya menggunakanBitmap
objek.Ini adalah sedikit variasi dari solusi yang telah diposting di situs ini .
sumber
Ada pendekatan sederhana seperti di bawah ini, Anda dapat menggunakan
FromStream
metode gambar untuk melakukan triknya, Ingatlah untuk menggunakanSystem.Drawing
;sumber
coba (UPDATE)
sumber
Anda belum mendeklarasikan returnImage sebagai variabel apa pun :)
Ini akan membantu:
sumber
Ini terinspirasi oleh jawaban Holstebroe, ditambah komentar di sini: Mendapatkan objek Gambar dari array byte
sumber
Satu liner:
sumber
Sebagian besar waktu ketika ini terjadi itu adalah data yang buruk di kolom SQL. Ini adalah cara yang tepat untuk memasukkan ke dalam kolom gambar:
Kebanyakan orang salah melakukannya dengan cara ini:
sumber
[SixLabors.ImageSharp] [1] [1]: https://www.nuget.org/packages/SixLabors.ImageSharp
sumber