C# wp7中jpeg解码的内存问题

C# wp7中jpeg解码的内存问题,c#,windows-phone-7,jpeg,C#,Windows Phone 7,Jpeg,我正在使用windows phone 7摄像头应用程序。我需要转换捕获的流,使用exif helper修复它的旋转,并使用质量、方向和输出大小参数另存为jpeg。我按照文章修复旋转。但核心问题是我需要先将流解码为jpeg,然后执行前面提到的旋转修复,以便将图片保存到媒体库 我使用以下代码: private WriteableBitmap DecodeImage(Stream photo, int angle) { WriteableBitmap source = Pic

我正在使用windows phone 7摄像头应用程序。我需要转换捕获的流,使用exif helper修复它的旋转,并使用质量、方向和输出大小参数另存为jpeg。我按照文章修复旋转。但核心问题是我需要先将流解码为jpeg,然后执行前面提到的旋转修复,以便将图片保存到媒体库

我使用以下代码:

private WriteableBitmap DecodeImage(Stream photo, int angle)
 {
            WriteableBitmap source = PictureDecoder.DecodeJpeg(photo);

            photo.Seek(0, SeekOrigin.Begin);           

            System.GC.Collect();

            UiDispatcher.BeginInvoke(() =>
            {
                MessageBox.Show(App.LogMemory("after decode"));
            });
            switch (angle)
            {
                case 90:
                case 270:
                    return RotateBitmap(source, source.PixelHeight,
                        source.PixelWidth, angle);
                case 180:
                    return RotateBitmap(source, source.PixelWidth,
                        source.PixelHeight, angle);
                default:
                    return source;
            }
            return null;
        }
在RotateBitMap方法中,我有链接中指定的旋转逻辑,但它创建了一个新的 源中的可写位图对象,如下所示:

WritablBitmap target = new WritableBitmap(soure.width,source.height); //source is the bitmap passed in argument.
问题是

PictureDecoder.decodejpeg--我的相机捕获的流消耗30 mb 而在旋转流方法中创建新的位图要多消耗30 mb,这导致应用程序内存增加了60 mb

由于低端(256mb)windows phone设备内存不足,导致应用程序崩溃。 为什么解码jpeg需要30mb,而流的旋转需要30mb。(我试图在旋转流方法中将位图的来源和目标设置为null,并强制gc,但没有用。应用程序在设备上很难获得60mb。我如何满足这一要求

有什么想法吗?在这种情况下如何优化内存消耗


注意:我需要从rotatestream方法中获取位图,因为我需要使用该位图以输出大小和质量保存为jpeg。

使用jpeg解码时,通常会得到完整大小的照片。 如果是用8MP(约8000000像素)摄像机拍摄的,计算如下:

8000000*32位=内存中一张图片的256 000位(约为30MB)

(让我提醒你,HTC Titan II有一个16MP的摄像头,所以如果你使用全尺寸的照片,它将占用大约62MB的内存!!)

显然,要创建一个可写位图,需要30MB。为了以某种方式操纵照片,通常无法就地操作。换句话说,您需要创建副本,这就是它复制的原因。Windows Phone有一种方法可以通过自动降低加载图片的分辨率来防止如此大的内存消耗,但仅当您将其与BitmapImage和SetSource方法一起使用时,该方法将JPEG流作为参数

我不久前在我的文章中写到了这一点,在

因此,基本上,你应该减少加载照片的大小(你需要它的全尺寸吗?),并且可以很容易地为你做,自动将它保持在2000x2000像素以下,大约是15MB(最大),所以如果你不想为此烦恼,你应该很好