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 настолько мала, что у класса BitmapImage нет свойства с именем Format!
Есть у кого-нибудь идея, которая решает мою проблему.
Я долго искал в интернете, чтобы найти решение, но нет решения, которое работает в silverlight!
Спасибо!
3 ответа
(метод битов на пиксель, который вам не хватает, просто подробно описывает, как информация о цвете сохраняется на пиксель)
Как предположил Энтони, 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;
}
Не существует решения, которое работает в Silverlight по замыслу. Изображения могут быть получены без необходимости соответствовать какой-либо политике междоменного доступа, как это требуется другим HTTP-запросам. Основой этого ослабления междоменных правил является то, что данные, составляющие изображение, не могут быть получены в сыром виде. Он может быть использован только в качестве изображения.
Если вы хотите просто писать и читать из растрового изображения, используйте WriteableBitmap
класс вместо BitmapImage
, WriteableBitmap
подвергает Pixels
собственность не доступна на BitmapImage
,
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);
}