Tworzę aplikację do udostępniania pulpitu zdalnego, w której przechwytuję obraz pulpitu, kompresuję go i wysyłam do odbiornika. Aby skompresować obraz, muszę go przekonwertować na bajt [].
Obecnie używam tego:
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;
}
Ale nie podoba mi się to, ponieważ muszę zapisać go w ImageFormat, a to może również zużywać zasoby (spowolnienie), a także powodować różne wyniki kompresji. Czytałem o użyciu Marshal.Copy i memcpy, ale nie jestem w stanie tego zrobić zrozumieć ich.
Czy jest więc jakaś inna metoda osiągnięcia tego celu?
MemoryStream
; jest to zasób w pełni zarządzany, chyba że używasz go w zdalnej obsłudze. W obu tych przypadkach pozbycie się zasobów byłoby niewłaściwe.Odpowiedzi:
Nie. Aby przekonwertować obraz na tablicę bajtów, musisz określić format obrazu - tak samo jak musisz określić kodowanie podczas konwersji tekstu na tablicę bajtów.
Jeśli martwisz się artefaktami kompresji, wybierz format bezstratny. Jeśli martwisz się o zasoby procesora, wybierz format, który nie przeszkadza kompresji - na przykład tylko surowe piksele ARGB. Ale oczywiście doprowadzi to do większej tablicy bajtów.
Zauważ, że jeśli wybrać format, który robi to kompresja, nie ma sensu, a następnie kompresji tablicę bajtów potem - to prawie pewne, że nie mają korzystny wpływ.
źródło
imageIn.RawFormat
które z prób mają zostać zapisane w bajtach nieprzetworzonego obrazu bez dalszego ponownego kodowania.Istnieje właściwość RawFormat parametru Image, która zwraca format pliku obrazu. Możesz spróbować następujących rzeczy:
źródło
myObject.Dispose()
lubusing(myObject){}
- oba zrobić to samo, ale instrukcja using w zasadzie tworzy zakres, który wyczyści za Ciebie.Nie jestem pewien, czy osiągniesz jakieś ogromne zyski z powodów, które wskazał Jon Skeet. Możesz jednak spróbować przetestować metodę TypeConvert.ConvertTo i zobaczyć, jak wypada w porównaniu z użyciem bieżącej metody.
źródło
źródło
źródło
Najszybszy sposób, w jaki mogłem się dowiedzieć, jest następujący:
Mam nadzieję, że będę przydatny
źródło
System.Windows.Controls.Image
obiekty. Jeśli chcesz przekonwertować jeden z nich na bajty i przekażesz go do tej linii jakoInputImg
, to nie zadziała. OczekujeSystem.Drawing.Image
obiektu.