2010-07-20 14 views
12

Tengo una matriz de bytes para una imagen (almacenada en la base de datos). Quiero crear un objeto de imagen, crear varias imágenes de diferentes tamaños y almacenarlas de nuevo en la base de datos (guardarlo de nuevo en una matriz de bytes).Obtener un objeto de imagen de una matriz de bytes

No me preocupa la parte de la base de datos o el cambio de tamaño. Pero, ¿hay una manera fácil de cargar un objeto Imagen sin guardar el archivo en el sistema de archivos y luego volver a colocarlo en una matriz de bytes cuando termine de redimensionarlo? Me gustaría hacerlo todo en la memoria si puedo.

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

Respuesta

20

que tendría que utilizar un MemoryStream para hacer esto:

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

Este será un gran trabajo. ¿Conoces una forma de regresarlo a la matriz de bytes? Después de cambiar el tamaño, necesito volver a colocar las imágenes redimensionadas en la base de datos. –

+0

@Dan: edite su pregunta para incluir eso. –

+0

lo tengo :) Gracias Image.Save (Stream, ImageFormat) - http://msdn.microsoft.com/en-us/library/ms142147.aspx –

2

Sobre la base de sus comentarios a otra respuesta, puede intentar esto para realizar una transformación en una imagen que se almacena en un byte[] luego regresar el resultado es otro 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(); 
      } 
     } 
    } 
} 

Esto le permitirá pasar en el byte[] almacenada en la base de datos, realizar transformaciones lo que necesita para, a continuación, devolver una nueva byte[] que se pueden almacenar de nuevo en la base de datos.

0

Pensé en agregar esto como respuesta para hacerlo más visible.

con el horario de vuelta a una matriz de bytes:

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

La reproducción del árbitro: el ResizeImage debe estar dentro de la ImageStream utilizando el bloque, ya que las llamadas a localImage podrían requerir el acceso a la ImageStream antes de que se dispone, y se debe disponer el (presumiblemente nuevo?) localImage devuelto por ResizeImage también. – Douglas

2

responder Sólo la primera parte de la pregunta: he aquí una solución de una sola línea que funciona bien para mí con una matriz de bytes que contiene una imagen de una Archivo JPEG.

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

EDIT: Y he aquí una solución un poco más avanzada: https://stackoverflow.com/a/16576471/253938

Cuestiones relacionadas