2010-07-20 28 views
12

Bir görüntü için bayt dizilim var (veritabanında saklanır). Bir Image nesnesi oluşturmak, farklı boyutlarda birkaç Görüntü oluşturmak ve bunları veritabanına geri kaydetmek (bir bayt dizisine geri kaydetmek) istiyorum.Resim nesnesini bir bayt dizisinden alma

Veritabanı bölümü veya yeniden boyutlandırma konusunda endişelenmiyorum. Ancak, bir dosya nesnesini dosya sistemine kaydetmeden bir Image nesnesini yüklemek için kolay bir yol var ve yeniden boyutlandırılırken bir bayt dizisine geri yerleştirmek mümkün mü? Yapabiliyorsam hepsini bellekte yapmak isterim.

başka yanıta Yorumlarınıza dayanarak
byte[] bytes; 
... 
using (var ms = new System.IO.MemoryStream(bytes)) { 
    using(var img = Image.FromStream(ms)) { 
     ... 
    } 
} 

cevap

20

Bunu yapmak için bir MemoryStream kullanırım Başka bir byte[] olarak sonuç.

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(); 
      } 
     } 
    } 
} 

Bu, veritabanında saklanan byte[] geçmek, sonra geri veritabanında saklanabilir yeni byte[] dönmek için ne gerekiyorsa dönüşümler yapmak için izin verecektir.

+0

Bu büyük çalışacaktır: Burada Ve biraz daha gelişmiş bir çözüm. Bayt dizisine geri döndürmenin bir yolunu biliyor musun? Yeniden boyutlandırıldıktan sonra, yeniden boyutlandırılan görüntüleri veritabanına geri koymam gerekiyor. –

+0

@Dan: Lütfen bunu eklemek için sorunuzu düzenleyin. –

+0

Anladım :) Teşekkürler Image.Save (Stream, ImageFormat) - http://msdn.microsoft.com/en-us/library/ms142147.aspx –

2

, daha sonra dönen bir byte[] saklanan bir görüntü üzerinde bir dönüşüm gerçekleştirmek için bu deneyebilirsiniz:

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

Bunu daha görünür kılmak için bir yanıt olarak ekleyebilirim.

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

Arbiter'in yorumunun yeniden üretilmesi: ResImagege bloğu ImageStream bloğu içinde olmalıdır, çünkü localImage aramaları imha edilmeden önce ImageStream'e erişim gerektirebilir ve ResizeImage tarafından döndürülen (muhtemelen yeni?) LocalImage öğelerini de atmalısınız. – Douglas

2

Sadece soru ilk yarısını yanıtlayan: bir bayt dizisi geri kaydederek ile

Burada bir görüntüsünü içeren bir bayt dizisi ile benim için iyi çalışan bir tek satırlık bir çözüm JPEG dosyası.

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

DÜZENLEME: https://stackoverflow.com/a/16576471/253938

İlgili konular