Frage

Ich entwickle eine Anwendung, die ein mobiles Gerät verwendet ein Foto aufzunehmen und es unter Verwendung eines Webservice zu senden. Aber nachdem ich 4 Fotos gemacht habe Ich erhalte eine OutOfMemoryException im Code unten. Ich habe versucht, GC.Collect() Aufruf aber es hat auch nicht geholfen. Vielleicht hier jemand mir einen Rat geben könnte, wie dieses Problem zu behandeln.

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

Die Funktion wird durch einen Event-Handler aufgerufen wird:

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);
}
War es hilfreich?

Lösung

Ich vermute, Sie auf Referenzen halten. Als kleine Ursache, beachten Sie, dass Dialoge nicht selbst entsorgen, wenn ShowDialog verwenden, so sollten Sie den Dialog using werden (obwohl ich würde erwarten, dass GC noch eine undisposed aber nicht referenzierten Dialog sammeln).

Ebenso sollten Sie wahrscheinlich das Bild using werden, aber auch hier: nicht sicher, ob ich dies erwarten würde Make-or-break; einen Versuch wert, aber ...

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

ich auch ein wenig vorsichtig von der CutBitmap etc sein würde, um sicherzustellen, dass die Dinge so schnell wie möglich freigegeben werden.

Andere Tipps

Ihr mobiles Gerät hat in der Regel keinen Speicherplatz auf der Festplatte Option tauschen, so da Sie wählen Ihre Bilder als Bitmaps im Speicher zu speichern, anstatt Dateien auf der Festplatte, können Sie den Speicher Ihres Telefons schnell verbrauchen. Ihre „neue Bitmap ()“ Linie weist einen großen Teil des Speichers, so ist es sehr wahrscheinlich, dass die Ausnahme dort werfen. Ein weiterer Anwärter ist Ihr Camera.ImageToByteArray, die eine große Menge an Speicher zugewiesen wird. Dies ist wahrscheinlich nicht groß, was Sie mit Ihrem Computer gewohnt sind, aber für dein Handy das ist gigantisch

Versuchen Sie, die Bilder auf der Festplatte zu halten, bis Sie sie verwenden, das heißt, bis sie an den Webservice zu senden. Für sie anzuzeigen, verwenden Sie die eingebauten Kontrollen, sie sind wahrscheinlich die meisten Speicher effizient und Sie können sie in der Regel auf die Bilddateien verweisen.

Jubel

Nik

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top