私はWindows Phone 7カメラアプリで作業しています。キャプチャしたストリームを変換し、exifヘルパーを使用して回転を修正し、品質、方向、出力サイズパラメーターを使用してjpegとして保存する必要があります 。回転を修正するためにexif回転の記事に従いました。しかし、中心的な問題は、画像をメディア ライブラリに保存するために、最初にストリームを 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 メソッドには、リンクで指定された回転ロジックがありますが、次のようにソースから新しい WritableBitmap オブジェクトを作成します。
WritablBitmap target = new WritableBitmap(soure.width,source.height); //source is the bitmap passed in argument.
問題は
PictureDecoder.decodejpeg -- カメラでキャプチャしたストリームに 30 mb を消費し、回転ストリーム メソッドで新しいビットマップを作成すると、さらに 30 mb を消費します。その結果、60 mb のアプリケーション メモリが増加します。
これにより、ローエンド (256 MB) の Windows Phone デバイスのメモリが原因で、アプリケーションがクラッシュします。jpeg のデコードに 30MB かかり、ストリームのローテーションに 30MB かかるのはなぜですか。 ??
任意のアイデア..?これらの場合にメモリ消費を最適化する方法???
注:出力サイズ、品質でjpegとして保存するには、そのビットマップを使用する必要があるため、結果としてrotatestreamメソッドからビットマップを取得する必要があります。