Я подозреваю, что вы держитесь за ссылки. В качестве незначительной причины, обратите внимание, что диалоги не располагаются сами по себе при использовании ShowDialog
, поэтому вы должны быть using
диалогом (хотя я бы ожидал, что GC по-прежнему будет собирать неиспользуемый, но не имеющий ссылки диалог).
Аналогично, вы, вероятно, должны быть 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
и т. Д., Чтобы гарантировать, что все будет выпущено как можно скорее.