2010-07-20 7 views
12

Ich habe ein Byte-Array für ein Bild (in der Datenbank gespeichert). Ich möchte ein Image-Objekt erstellen, mehrere Images unterschiedlicher Größe erstellen und diese in der Datenbank speichern (zurück in ein Byte-Array speichern).Ein Image-Objekt aus einem Byte-Array holen

Ich mache mir keine Sorgen über die Datenbank Teil oder die Größenanpassung. Aber gibt es eine einfache Möglichkeit, ein Image-Objekt zu laden, ohne die Datei im Dateisystem zu speichern, und es dann in ein Byte-Array zurückzulegen, wenn ich die Größe geändert habe? Ich würde gerne alles in Erinnerung behalten, wenn ich kann.

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

Antwort

20

würden Sie einen Memorystream verwenden, dies zu tun:

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

Dies wird große Arbeit. Weißt du, wie man es zurück in das Byte-Array bringt? Nach der Größenänderung muss ich die skalierten Bilder wieder in die Datenbank stellen. –

+0

@Dan: Bitte bearbeiten Sie Ihre Frage, um dies zu berücksichtigen. –

+0

Ich habe es :) Danke Image.Save (Stream, ImageFormat) - http://msdn.microsoft.com/en-us/library/ms142147.aspx –

2

Basierend auf Ihre Kommentare zu einer anderen Antwort, können Sie versuchen, diese für eine Transformation auf ein Bild durchführen, die dann in einem byte[] gespeichert wird zurückkehren das Ergebnis als ein anderes 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(); 
      } 
     } 
    } 
} 

Dies ermöglicht es Ihnen, in den byte[] in der Datenbank gespeichert passieren, führen, was Transformationen Sie müssen, dann ein neues byte[] zurück, die wieder in der Datenbank gespeichert werden kann.

0

Ich dachte, ich würde dies als eine Antwort hinzufügen, um es besser sichtbar zu machen.

Mit ihn zurück zu einem Byte-Array zu speichern:

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

Kommentar des Übersetzers: Die Größe von ResizeImage sollte innerhalb von ImageStream mit block liegen, da Aufrufe von localImage Zugriff auf den ImageStream erfordern könnten, bevor er entsorgt wird, und Sie sollten auch das von ResizeImage zurückgegebene (vermutlich neue?) LocalImage entfernen. – Douglas

2

nur die erste Hälfte der Frage zu beantworten: Hier ist eine Einzeiler-Lösung, die mit einem Byte-Array für mich funktioniert, die ein Bild eines enthält JPEG-Datei.

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

EDIT: Und hier ist eine etwas erweiterte Lösung: https://stackoverflow.com/a/16576471/253938