2009-12-24 2 views
6

Я в состоянии преобразовать байт [] к изображению:Silverlight: изображение в байт []

byte[] myByteArray = ...; // ByteArray to be converted 

MemoryStream ms = new MemoryStream(my); 
BitmapImage bi = new BitmapImage(); 
bi.SetSource(ms); 

Image img = new Image(); 
img.Source = bi; 

Но я не в состоянии преобразовать изображение обратно в байт []! я нашел в Интернете решение, которое работает для WPF:

var bmp = img.Source as BitmapImage; 
int height = bmp.PixelHeight; 
int width = bmp.PixelWidth; 
int stride = width * ((bmp.Format.BitsPerPixel + 7)/8); 

byte[] bits = new byte[height * stride]; 
bmp.CopyPixels(bits, stride, 0); 

Silverlight, libary настолько мал, что класс BitmapImage не имеет свойство Format!

Есть ли идея, которая решает мою проблему.

Я искал в Интернете долгое время, чтобы найти решение, но нет решения, которое работает в silverlight!

Спасибо!

ответ

7

(биты в методе пикселя вам не хватает только детали, как информация о цвете хранится на пиксель)

Как предложил Антони, WriteableBitmap будет самым простым способом - проверить http://kodierer.blogspot.com/2009/11/convert-encode-and-decode-silverlight.html для метода чтобы получить ARGB байтовый массив из:

public static byte[] ToByteArray(this WriteableBitmap bmp) 
{ 
    // Init buffer 
    int w = bmp.PixelWidth; 
    int h = bmp.PixelHeight; 
    int[] p = bmp.Pixels; 
    int len = p.Length; 
    byte[] result = new byte[4 * w * h]; 

    // Copy pixels to buffer 
    for (int i = 0, j = 0; i < len; i++, j += 4) 
    { 
     int color = p[i]; 
     result[j + 0] = (byte)(color >> 24); // A 
     result[j + 1] = (byte)(color >> 16); // R 
     result[j + 2] = (byte)(color >> 8); // G 
     result[j + 3] = (byte)(color);  // B 
    } 

    return result; 
} 
3

Нет решения, которое работает в Silverlight по дизайну. Изображения могут быть извлечены без необходимости соответствовать какой-либо политике доступа к перекрестному домену, как это требуется другим HTTP-запросам. Основой этой релаксации правил перекрестных доменов является то, что данные, составляющие изображение, не могут быть извлечены в исходное. Его можно использовать только как изображение.

Если вы хотите просто написать и прочитать из растрового изображения, используйте класс WriteableBitmap вместо BitmapImage. WriteableBitmap предоставляет объект Pixels, который недоступен на BitmapImage.

2
public static void Save(this BitmapSource bitmapSource, Stream stream) 
    { 
     var writeableBitmap = new WriteableBitmap(bitmapSource); 

     for (int i = 0; i < writeableBitmap.Pixels.Length; i++) 
     { 
      int pixel = writeableBitmap.Pixels[i]; 

      byte[] bytes = BitConverter.GetBytes(pixel); 
      Array.Reverse(bytes); 

      stream.Write(bytes, 0, bytes.Length); 
     } 
    } 

    public static void Load(this BitmapSource bitmapSource, byte[] bytes) 
    { 
     using (var stream = new MemoryStream(bytes)) 
     { 
      bitmapSource.SetSource(stream); 
     } 
    } 

    public static void Load(this BitmapSource bitmapSource, Stream stream) 
    { 
     bitmapSource.SetSource(stream); 
    } 
+0

есть ли у вас это работает? Особенно bitmapSource.SetSource (поток); часть? Выдает мне исключение. – jayarjo

Смежные вопросы