2010-07-20 23 views
12

Mam tablicę bajtów dla obrazu (przechowywanego w bazie danych). Chcę utworzyć obiekt obrazu, utworzyć kilka obrazów o różnych rozmiarach i zapisać je w bazie danych (zapisz go z powrotem do tablicy bajtów).Uzyskiwanie obiektu obrazu z tablicy bajtów

Nie martwię się częścią bazy danych ani zmianą rozmiaru. Ale czy istnieje prosty sposób załadowania obiektu Image bez zapisywania pliku w systemie plików, a następnie umieszczenia go w tablicy bajtów po zakończeniu zmiany rozmiaru? Chciałbym zrobić to wszystko w pamięci, jeśli mogę.

Something like: 
Image myImage = new Image(byte[]); 
or 
myImage.Load(byte[]); 

Odpowiedz

20

Można by użyć MemoryStream to zrobić:

byte[] bytes; 
... 
using (var ms = new System.IO.MemoryStream(bytes)) { 
    using(var img = Image.FromStream(ms)) { 
     ... 
    } 
} 
+0

to będzie działać świetnie. Czy znasz sposób, aby go z powrotem do tablicy bajtowej? Po zmianie rozmiaru należy umieścić ponownie zmienione obrazy w bazie danych. –

+0

@Dan: Edytuj pytanie, aby je uwzględnić. –

+0

Mam to :) Dzięki Image.Save (Stream, ImageFormat) - http://msdn.microsoft.com/en-us/library/ms142147.aspx –

2

oparciu o komentarze do innej odpowiedzi, można spróbować to dla przeprowadzania transformacji na obrazie, który jest przechowywany w byte[] następnie powrót wynik jako inny byte[].

public byte[] TransformImage(byte[] imageData) 
{ 
    using(var input = new MemoryStream(imageData)) 
    { 
     using(Image img = Image.FromStream(input)) 
     { 
      // perform your transformations 

      using(var output = new MemoryStream()) 
      { 
       img.Save(output, ImageFormat.Bmp); 

       return output.ToArray(); 
      } 
     } 
    } 
} 

To pozwoli Ci zdać w byte[] przechowywane w bazie danych, należy wykonać co transformacje trzeba, a następnie powrócić nową byte[] które mogą być przechowywane z powrotem w bazie.

0

Pomyślałem, że dodam to jako odpowiedź, aby było bardziej widoczne.

Z zapisując go z powrotem do tablicy bajtów:

public Image localImage; 
    public byte[] ImageBytes; 

    public FUU_Image(byte[] bytes) 
    { 
     using (MemoryStream ImageStream = new System.IO.MemoryStream(bytes)) 
     { 
      localImage = Image.FromStream(ImageStream); 
     } 

     localImage = ResizeImage(localImage); 

     using (MemoryStream ImageStreamOut = new MemoryStream()) 
     { 
      localImage.Save(ImageStreamOut, ImageFormat.Jpeg); 
      ImageBytes = ImageStreamOut.ToArray(); 
     } 

    } 
+0

Powielanie komentarza arbitra: ResizeImage powinien znajdować się wewnątrz bloku ImageStream za pomocą bloku, ponieważ wywołania localImage mogą wymagać dostępu do ImageStream przed jego usunięciem, a także należy pozbyć się (prawdopodobnie nowego?) Obrazu lokalnego zwróconego przez ResizeImage. – Douglas

2

Tylko sekretarki pierwszą połowę pytanie: Oto rozwiązanie jedno-liner, że działa dobrze dla mnie z tablicy bajtów, który zawiera obraz z Plik JPEG.

Image x = (Bitmap)((new ImageConverter()).ConvertFrom(jpegByteArray)); 

EDIT: A oto nieco bardziej zaawansowane rozwiązanie: https://stackoverflow.com/a/16576471/253938

Powiązane problemy