2010-07-20 4 views
12

J'ai un tableau d'octets pour une image (stockée dans la base de données). Je veux créer un objet Image, créer plusieurs images de différentes tailles et les stocker dans la base de données (en le sauvegardant dans un tableau d'octets).Obtention d'un objet Image à partir d'un tableau d'octets

Je ne suis pas inquiet au sujet de la partie de base de données, ou le redimensionnement. Mais existe-t-il un moyen facile de charger un objet Image sans enregistrer le fichier sur le système de fichiers, puis de le replacer dans un tableau d'octets quand j'ai fini de le redimensionner? Je voudrais tout faire en mémoire si je peux.

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

Répondre

20

Vous souhaitez utiliser un MemoryStream pour ce faire:

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

Cela fonctionne très bien. Connaissez-vous un moyen de le récupérer dans le tableau d'octets? Après le redimensionnement, je dois replacer les images redimensionnées dans la base de données. –

+0

@Dan: S'il vous plaît modifier votre question pour inclure cela. –

+0

Je l'ai eu :) Merci Image.Save (Stream, ImageFormat) - http://msdn.microsoft.com/en-us/library/ms142147.aspx –

2

Sur la base de vos commentaires à une autre réponse, vous pouvez essayer d'effectuer une transformation sur une image qui est stocké dans un byte[] puis retour le résultat est un autre 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(); 
      } 
     } 
    } 
} 

Cela vous permettra de passer dans le byte[] stocké dans la base de données, effectuer toutes les transformations que vous devez, puis retourner une nouvelle byte[] qui peut être stocké en arrière dans la base de données.

0

Je pensais que j'ajouterais ceci comme réponse pour le rendre plus visible.

Avec enregistrer de nouveau à un tableau d'octets:

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

Reproduction du commentaire de l'arbitre: la ResizeImage doit se trouver dans le bloc ImageStream using, car les appels à localImage peuvent nécessiter l'accès à ImageStream avant d'être éliminés, et vous devez également disposer le (probablement nouveau?) LocalImage retourné par ResizeImage. – Douglas

2

répondre que la première moitié de la question: Voici une solution d'une doublure qui fonctionne très bien pour moi avec un tableau d'octets qui contient une image d'un Fichier JPEG

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

EDIT: Et voici une solution un peu plus avancé: https://stackoverflow.com/a/16576471/253938

Questions connexes