Chcę przekonwertować tablicę bajtów na obraz.
To jest mój kod bazy danych, z którego otrzymuję tablicę bajtów:
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;
}
Mój kod konwersji:
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;
}
Kiedy dochodzę do linii z komentarzem, pojawia się następujący wyjątek: Parameter is not valid.
Jak mogę naprawić wszystko, co powoduje ten wyjątek?
c#
arrays
byte
bytebuffer
Tanzeel ur Rahman
źródło
źródło
Odpowiedzi:
Piszesz do strumienia pamięci dwa razy, a także nie wyrzucasz strumienia po użyciu. Prosi się również dekoder obrazu o zastosowanie wbudowanej korekcji kolorów.
Spróbuj tego zamiast tego:
źródło
Może czegoś brakuje, ale dla mnie ta jednowierszowa działa dobrze z tablicą bajtów, która zawiera obraz pliku JPEG.
EDYTOWAĆ:
Zobacz tutaj zaktualizowaną wersję tej odpowiedzi: Jak przekonwertować obraz w tablicy bajtów
źródło
źródło
Chciałbym zauważyć, że jest błąd w rozwiązaniu dostarczonym przez @ isaias-b.
To rozwiązanie zakłada, że
stride
jest równa długości rzędu. Ale nie zawsze jest to prawda. Ze względu na wyrównywanie pamięci wykonywane przez GDI, krok może być większy niż długość wiersza. Należy to wziąć pod uwagę. W przeciwnym razie zostanie wygenerowany nieprawidłowy przesunięty obraz. Bajty wypełniające w każdym wierszu zostaną zignorowane.Naprawiono kod:
Aby zilustrować, do czego może to prowadzić, wygenerujmy
PixelFormat.Format24bppRgb
obraz gradientu 101x101:Jeśli skopiujemy całą tablicę bez zmian na adres wskazany przez
bmpData.Scan0
, otrzymamy następujący obraz. Przesunięcie obrazu, ponieważ część obrazu została zapisana w bajtach wypełniających, co zostało zignorowane. Dlatego też ostatni wiersz jest niekompletny:Ale jeśli skopiujemy wskaźnik docelowy przesuwający się wiersz po wierszu według
bmpData.Stride
wartości, zostanie wygenerowany prawidłowy obraz:Stride może być również ujemny:
Ale nie pracowałem z takimi obrazami i to jest poza moją uwagą.
Powiązana odpowiedź: C # - Bufor RGB z mapy bitowej różni się od C ++
źródło
Wszystkie przedstawione odpowiedzi zakładają, że tablica bajtów zawiera dane w znanym formacie pliku, takim jak: gif, png lub jpg. Ale ostatnio miałem problem z próbą
byte[]
wydajnej konwersji s, zawierających zlinearyzowane informacje BGRA, naImage
obiekty. Poniższy kod rozwiązuje to za pomocąBitmap
obiektu.Jest to nieznaczna odmiana rozwiązania, które zostało zamieszczone na tej stronie .
źródło
istnieje proste podejście, jak poniżej, możesz użyć
FromStream
metody obrazu, aby załatwić sprawę, po prostu pamiętaj, aby użyćSystem.Drawing
;źródło
spróbuj (AKTUALIZACJA)
źródło
Nie zadeklarowałeś returnImage jako żadnej zmiennej :)
To powinno pomóc:
źródło
Jest to zainspirowane odpowiedzią Holstebroe oraz komentarzami tutaj: Pobieranie obiektu Image z tablicy bajtów
źródło
Jedna wkładka:
źródło
W większości przypadków są to złe dane w kolumnie SQL. Oto właściwy sposób wstawiania do kolumny obrazu:
Większość ludzi robi to niepoprawnie w ten sposób:
źródło
[SixLabors.ImageSharp] [1] [1]: https://www.nuget.org/packages/SixLabors.ImageSharp
źródło