Używając C #, czy jest lepszy sposób na konwersję systemu Windows Bitmap
na byte[]
niż zapisywanie do pliku tymczasowego i odczytywanie wyniku za pomocą FileStream
?
233
Istnieje kilka sposobów.
ImageConverter
public static byte[] ImageToByte(Image img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
Ten jest wygodny, ponieważ nie wymaga dużo kodu.
Strumień pamięci
public static byte[] ImageToByte2(Image img)
{
using (var stream = new MemoryStream())
{
img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
return stream.ToArray();
}
}
Ten jest równoważny z tym, co robisz, z wyjątkiem tego, że plik jest zapisywany w pamięci zamiast na dysku. Chociaż więcej kodu masz opcję ImageFormat i można go łatwo modyfikować między zapisywaniem w pamięci lub na dysku.
ImageConverter
metoda zapisze obraz jako Png, co spowoduje OGROMNE pliki.ImageConverter
nie jest standardem .net, którego możesz użyćMemoryStream
MemoryStream może być pomocne w tej sprawie. Możesz umieścić go w metodzie rozszerzenia:
Możesz po prostu użyć go w następujący sposób:
Częściowo nie zgadzam się z odpowiedzią prestomanifto dotyczącą ImageConverter. Nie używaj ImageConverter. Nie ma w tym nic złego pod względem technicznym, ale sam fakt, że używa on boksowania / rozpakowywania z obiektu, mówi mi, że to kod ze starych ciemnych miejsc .NET Framework i nie jest idealny do użycia z przetwarzaniem obrazu (to przesada w przypadku konwersji na bajt [] przynajmniej), zwłaszcza jeśli weźmiesz pod uwagę następujące kwestie.
Przyjrzałem się
ImageConverter
kodowi używanemu przez platformę .Net i wewnętrznie używa kodu prawie identycznego z tym, który podałem powyżej. Tworzy nowyMemoryStream
, zapisujeBitmap
w jakimkolwiek formacie, w jakim był, gdy go podałeś, i zwraca tablicę. Pomiń dodatkowe koszty związane z tworzeniemImageConverter
klasy za pomocąMemoryStream
źródło
Możesz także po prostu Marshal. Skopiować dane mapy bitowej. Brak pośredniego memorystream itp. I szybka kopia pamięci. Powinno to działać zarówno na bitmapach 24-bitowych, jak i 32-bitowych.
.
źródło
Zapisz obraz w MemoryStream, a następnie chwyć tablicę bajtów.
http://msdn.microsoft.com/en-us/library/ms142148.aspx
źródło
System.Drawing.Image
(patrz: docs.microsoft.com/en-us/dotnet/api/... )System.Drawing.Image does not exist
. Więc .. nie, nie działa :(Użyj
MemoryStream
zamiast aFileStream
, jak poniżej:źródło
ToArray
, nieGetBuffer
.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.
teraz tablica bajtów zGetBuffer
zwróci obraz plus nieużywane bajty, co prawdopodobnie spowoduje uszkodzenie obrazu.Spróbuj wykonać następujące czynności:
Upewnij się, że używasz:
źródło
Wierzę, że możesz po prostu zrobić:
źródło
źródło
Prościej:
źródło
Bardzo proste użycie tego tylko w jednym wierszu:
źródło