モバイルデバイス上でOutOfMemoryException
-
09-09-2019 - |
質問
私は写真を撮ると、Webサービスを使用して、それを送信するために、モバイルデバイスを使用するアプリケーションを開発しています。しかし、私は4枚の写真を撮影した後、私は以下のコードでOutOfMemoryException
を取得しています。私はGC.Collect()
を呼び出してみましたが、それはどちらか助けていません。たぶんここに誰かが私にこの問題に対処するためにどのようなアドバイスを与えることができます。
public static Bitmap TakePicture()
{
var dialog = new CameraCaptureDialog
{
Resolution = new Size(1600, 1200),
StillQuality = CameraCaptureStillQuality.Default
};
dialog.ShowDialog();
// If the filename is empty the user took no picture
if (string.IsNullOrEmpty(dialog.FileName))
return null;
// (!) The OutOfMemoryException is thrown here (!)
var bitmap = new Bitmap(dialog.FileName);
File.Delete(dialog.FileName);
return bitmap;
}
関数はイベントハンドラによって呼び出されます:
private void _pictureBox_Click(object sender, EventArgs e)
{
_takePictureLinkLabel.Visible = false;
var image = Camera.TakePicture();
if (image == null)
return;
image = Camera.CutBitmap(image, 2.5);
_pictureBox.Image = image;
_image = Camera.ImageToByteArray(image);
}
解決
私はあなたが言及上に保持されている疑いがあります。マイナーな原因として、ShowDialog
を使用しているときに(私はGCはまだundisposedが、非参照ダイアログを集めることを期待するだろうが)、ダイアログをusing
しなければならないので、ダイアログは、自分自身を配置していないことに注意します。
同様に、あなたはおそらく画像をusing
する必要がありますが、再び:私は、これはメイクやブレークを期待したいかわかりません。試してみる価値は、しかし...
public static Bitmap TakePicture()
{
string filename;
using(var dialog = new CameraCaptureDialog
{
Resolution = new Size(1600, 1200),
StillQuality = CameraCaptureStillQuality.Default
}) {
dialog.ShowDialog();
filename = dialog.FileName;
}
// If the filename is empty the user took no picture
if (string.IsNullOrEmpty(filename))
return null;
// (!) The OutOfMemoryException is thrown here (!)
var bitmap = new Bitmap(filename);
File.Delete(filename);
return bitmap;
}
private void _pictureBox_Click(object sender, EventArgs e)
{
_takePictureLinkLabel.Visible = false;
using(var image = Camera.TakePicture()) {
if (image == null)
return;
image = Camera.CutBitmap(image, 2.5);
_pictureBox.Image = image;
_image = Camera.ImageToByteArray(image);
}
}
私はまた、物事はできるだけ早く解放されることを保証するために、CutBitmap
などの少し慎重になると思います。
他のヒント
あなたのモバイルデバイスは、通常、任意のメモリをディスクオプションに交換する必要はありませんので、あなたは、メモリ内のビットマップではなく、ディスク上のファイルとしてあなたのイメージを格納するように選択するので、あなたはすぐにあなたの携帯電話のメモリを消費します。あなたの「新しいビットマップ()」ラインは、メモリの大きなチャンクを割り当て、例外をスローする可能性が非常に高いです。もう一つの候補は、大量のメモリを割り当てます、あなたのCamera.ImageToByteArrayです。これはおそらく、あなたのコンピュータに慣れているものとに大きくありませんが、あなたの携帯電話のために、これは巨大です。
あなたがそれらを使用するまで、すなわちWebサービスに送信されるまで、ディスク上の画像を維持してください。それらを表示するために、彼らはおそらく最もメモリ効率的な、あなたの組み込みコントロールを使用すると、あなたは、通常の画像ファイルにそれらを指すことができます。
乾杯
ニク