문제

모바일 장치를 사용하여 사진을 찍고 웹 서비스를 사용하여 보내는 응용 프로그램을 개발하고 있습니다. 하지만 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, 당신은해야합니다 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 등급이 최대한 빨리 출시되도록합니다.

다른 팁

모바일 장치에는 일반적으로 디스크 옵션으로 메모리 스왑이 없으므로 디스크의 파일이 아닌 메모리에 이미지를 비트 맵으로 저장하기로 선택하므로 휴대 전화의 메모리를 빠르게 소비합니다. "New BitMap ()"라인은 큰 메모리 덩어리를 할당하므로 예외를 던질 가능성이 높습니다. 또 다른 경쟁자는 카메라입니다. Imagetobytearray는 많은 양의 메모리를 할당합니다. 이것은 아마도 당신이 컴퓨터에서 익숙한 것에 크지 않지만 모바일의 경우 이것은 거대합니다.

사진을 사용할 때까지 디스크에 사진을 보관하십시오. 표시하려면 내장 컨트롤을 사용하면 가장 메모리 효율적 일 수 있으며 일반적으로 이미지 파일을 가리킬 수 있습니다.

건배

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top