Windows Phone 7.1:拆分字节[]图像并转换为BitmapImage

本文关键字:图像 转换 BitmapImage 字节 Phone 拆分 Windows | 更新日期: 2023-09-27 18:19:37

Edit:对于那些需要对图像进行blit(即将WriteableBitmap的一部分复制到另一个)的人,可以使用Buffer.BlockCopy并使用WriteableBitmaps的Pixels-int[]数组作为参数。

我之前问过这个问题:Image won';t在Windows Phone 7.5 上完全加载

我已经在这个问题上工作了几个小时,我已经尝试了几种方法。我不熟悉图像类型等,所以我可能缺少一个基本理论(比如我不能分割byte[]图像并将其转换为BitmapImage)。

我想做的是:

  1. 使用WebClient从Web下载图像(JPEG)
  2. 使用PictureDecoder.DecodeJpeg从WebClient返回给我的流中解码JPEG,并获得WriteableBitmap对象
  3. 将WriteableBitmap.Pixels数组从int[]转换为byte[]
  4. 将byte[]数组拆分为多个部分,这样它们就不会超过2000x2000的大小限制
  5. 将每个片段转换为BitmapImage,这样我就可以在我的WP7.1 Silverlight应用程序中使用它们

但是我在System.Windows.dll中得到了一个带有未指定错误的System.Exception:

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

Windows Phone 7.1:拆分字节[]图像并转换为BitmapImage

在向MemoryStream写入后,位置将被推进。在设置震源之前,请重置位置。

ms.Position = 0;

编辑-您可以使用WriteableBitmapEx。这是一个非常快速的库,可以执行WriteableBitmaps之间的字节转换。您还可以使用blitting功能,通过复制较大图像的部分来创建一个新的WriteableBitmap。