Редактировать: Для тех, кому нужно переместить изображение (т.е. скопировать часть карты WriteableBitmap в другую), вы можете использовать Buffer.BlockCopy и использовать массивы Pixels int [] WriteableBitmaps в качестве аргумента.
Iзадал этот вопрос раньше: Изображение не будет полностью загружено на Windows Phone 7.5
Я работаю над этой проблемой уже несколько часов и пробовал несколько вещей.Я не знаком с типами изображений и т. Д., Поэтому, возможно, мне не хватает базовой теории (например, я не могу разделить изображение байта [] и преобразовать их в BitmapImage).
Что я пытаюсьdo is:
- Загрузить изображение (JPEG) из Интернета с помощью WebClient.
- Декодировать JPEG из потока, который мне вернул WebClient, с помощью PictureDecoder.DecodeJpeg и получить объект WriteableBitmap
- Преобразовать массив WriteableBitmap.Pixels из int [] в byte []
- Разделить массив byte [] на несколько частей, чтобы они не превышали ограничение размера 2000x2000
- Преобразоватькаждый фрагмент в BitmapImage, чтобы я мог использовать их в своем приложении WP7.1 Silverlight.
Но я получаю System.Exception с Unspecified error в System.Windows.dll в этих строках:
firstImg.SetSource(ms);
newImg.SetSource(ms2);
Кстати, jpeg, который я загружаю, является допустимым jpeg, я могу отобразить его, не пытаясь разделить его.
Редактировать: Jpeg, который я загружаю, имеет ширину меньше 2000 и больше 2000в высоту.
Вот мой код:
private void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
WriteableBitmap rawImg = PictureDecoder.DecodeJpeg(e.Result);
byte[] arr;
int height = rawImg.PixelHeight;
int count = 0;
if (height < 2000)
images.Add(new MyImage(rawImg));
else
{
arr = ConvertToByte(rawImg);
MemoryStream ms = new MemoryStream();
ms.Write(arr, 0, 4 * rawImg.PixelWidth * 2000);
count++;
BitmapImage firstImg = new BitmapImage();
firstImg.SetSource(ms);
images.Add(new MyImage(firstImg));
while (height > 2000)
{
MemoryStream ms2 = new MemoryStream();
ms2.Write(arr, count*2000, 4 * rawImg.PixelWidth * Math.Min(arr.Length - count*2000, 2000));
count++;
height -= 2000;
BitmapImage newImg = new BitmapImage();
newImg.SetSource(ms2);
images.Add(new MyImage(newImg));
}
}
}
private byte[] ConvertToByte(WriteableBitmap wb)
{
int w = wb.PixelWidth;
int h = wb.PixelHeight;
int[] p = wb.Pixels;
int len = p.Length;
byte[] result = new byte[4 * w * h];
for (int i = 0, j = 0; i < len; i++, j += 4)
{
int color = p[i];
result[j + 0] = (byte)(color >> 24);
result[j + 1] = (byte)(color >> 16);
result[j + 2] = (byte)(color >> 8);
result[j + 3] = (byte)(color);
}
return result;
}