C # Недостаточно памяти при создании растрового изображения - PullRequest
11 голосов
/ 30 ноября 2010

Я создаю приложение (форма Windows), которое позволяет пользователю делать снимок экрана в зависимости от выбранного местоположения (перетащите, чтобы выбрать область).Я хотел добавить небольшую «панель предварительного просмотра», которая увеличена, чтобы пользователь мог выбрать область, которую он хочет более точно (большие пиксели).При событии mousemove у меня есть следующий код ...

private void falseDesktop_MouseMove(object sender, MouseEventArgs e)
    {
        zoomBox.Image = showZoomBox(e.Location);
        zoomBox.Invalidate();
        bmpCrop.Dispose();
    }

private Image showZoomBox(Point curLocation)
    {
        Point start = new Point(curLocation.X - 50, curLocation.Y - 50);
        Size size = new Size(100, 90);
        Rectangle rect = new Rectangle(start, size);
        Image selection = cropImage(falseDesktop.Image, rect);
        return selection;
    }

private static Bitmap bmpCrop;
private static Image cropImage(Image img, Rectangle cropArea)
    {
        if (cropArea.Width != 0 && cropArea.Height != 0)
        {
            Bitmap bmpImage = new Bitmap(img);
            bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);
            bmpImage.Dispose();
            return (Image)(bmpCrop);
        }
        return null;
    }

Строка, которая дает сбой и имеет исключение Out of Memory:

bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);

В основном это то, что это делаетберет прямоугольник 100x90 вокруг указателя мыши и вытягивает его в zoomBox, который является элементом управления picturebox.Тем не менее, в процессе, я получаю ошибку Out Of Memory.Что я здесь делаю неправильно?

Спасибо за вашу помощь.

Ответы [ 6 ]

16 голосов
/ 01 декабря 2010

Недостаточно памяти в C # -изображениях, обычно это признак неправильного прямоугольника или точки - немного красной сельди .Бьюсь об заклад, start имеет отрицательный X или Y при возникновении ошибки или Размер. Высота + Y или Размер. Ширина + X больше, чем высота или ширина изображения .

8 голосов
/ 01 декабря 2010

MSDN объясняет, что OutOfMemoryException означает

rect вне границ исходного растрового изображения

, где rect -первый параметр метода Bitmap.Clone.

Поэтому убедитесь, что параметр cropArea не больше вашего изображения.

В GDI + значение OutOfMemoryException на самом деле не означает "изобъем памяти";код ошибки GDI + OufOfMemory был перегружен для обозначения разных вещей.Причины этого являются историческими и хорошо описаны Гансом Пассантом в другом ответе .

4 голосов
/ 27 декабря 2013

Используйте растровый объект следующим образом:

using (Bitmap bmpImage = new Bitmap(img))
{
    // Do something with the Bitmap object
}
0 голосов
/ 01 декабря 2010

Если поле зума выходит за пределы области рабочего стола, то при попытке обрезки вы просите систему создать новое изображение, содержащее пиксели за пределами области видеопамяти.Обязательно ограничьте поле зума, чтобы ни один из его экстентов не был меньше 0 или больше краев экрана.

0 голосов
/ 01 декабря 2010

вы должны проверить, если curLocation.X больше 50, иначе ваш прямоугольник начнется в отрицательной области (и, конечно, curLocation.Y)

0 голосов
/ 01 декабря 2010

Если вы создаете новые растровые изображения снова и снова, вам может потребоваться вызвать GC.Collect();, что заставит C # собирать мусор

...