Windows Phone 7.1: разделить изображение [] и преобразовать его в BitmapImage - PullRequest
0 голосов
/ 07 января 2012

Редактировать: Для тех, кому нужно переместить изображение (т.е. скопировать часть карты WriteableBitmap в другую), вы можете использовать Buffer.BlockCopy и использовать массивы Pixels int [] WriteableBitmaps в качестве аргумента.

Iзадал этот вопрос раньше: Изображение не будет полностью загружено на Windows Phone 7.5

Я работаю над этой проблемой уже несколько часов и пробовал несколько вещей.Я не знаком с типами изображений и т. Д., Поэтому, возможно, мне не хватает базовой теории (например, я не могу разделить изображение байта [] и преобразовать их в BitmapImage).

Что я пытаюсьdo is:

  1. Загрузить изображение (JPEG) из Интернета с помощью WebClient.
  2. Декодировать JPEG из потока, который мне вернул WebClient, с помощью PictureDecoder.DecodeJpeg и получить объект WriteableBitmap
  3. Преобразовать массив WriteableBitmap.Pixels из int [] в byte []
  4. Разделить массив byte [] на несколько частей, чтобы они не превышали ограничение размера 2000x2000
  5. Преобразоватькаждый фрагмент в 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;
    }

1 Ответ

3 голосов
/ 07 января 2012

После записи на MemoryStream позиция продвигается.Перед настройкой источника сбросьте положение.

ms.Position = 0;

Редактировать - вы можете использовать WriteableBitmapEx .Это очень быстрая библиотека, которая может выполнять преобразование байтов в WriteableBitmaps и из него.Вы также можете создать новый WriteableBitmap путем копирования разделов большего изображения с помощью функции blitting.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...