Ошибка Windows 7 TextureBrush..ctor () - PullRequest
5 голосов
/ 01 мая 2009

У меня есть приложение .NET 2.0, которое отлично работает на XP и Vista, но на Windows 7 RC (x64) оно вылетает со следующей ошибкой:

Информация об исключении


Тип исключения: System.OutOfMemoryException Сообщение: недостаточно памяти. Данные: System.Collections.ListDictionaryInternal TargetSite: Void .ctor (System.Drawing.Image, System.Drawing.Drawing2D.WrapMode) HelpLink: NULL Источник: System.Drawing

Информация StackTrace


в System.Drawing.TextureBrush..ctor (изображение изображения, WrapMode wrapMode) в System.Windows.Forms.ControlPaint.DrawBackgroundImage (Графика g, изображение backgroundImage, цвет backColor, ImageLayout backgroundImageLayout, границы прямоугольника, прямоугольник clipRect, точка scrollOffset, RightToLeft rightToLeft) в System.Windows.Forms.Control.PaintBackground (PaintEventArgs e, прямоугольник, цвет backColor, точка scrollOffset) в System.Windows.Forms.Control.PaintBackground (PaintEventArgs e, Прямоугольный прямоугольник) в System.Windows.Forms.Control.OnPaintBackground (PaintEventArgs pevent) в System.Windows.Forms.ScrollableControl.OnPaintBackground (PaintEventArgs e) в System.Windows.Forms.Control.PaintWithErrorHandling (PaintEventArgs e, слой Int16, логическое значение disposeEventArgs) в System.Windows.Forms.Control.WmPaint (Сообщение & m) в System.Windows.Forms.Control.WndProc (сообщение & m) в System.Windows.Forms.ScrollableControl.WndProc (Message & m)

Любые идеи о том, почему это происходит, или как я могу программировать вокруг этого? Это просто рисование стандартной формы без специального фона.

UPDATE: Я обнаружил, что это проблема, только когда BackgroundImageLayout = ImageLayout.Tile, который также используется по умолчанию. Установите Zoom или Center, и проблема исчезнет. Это довольно неудовлетворительно, потому что мне это нужно.

Ответы [ 3 ]

4 голосов
/ 22 июля 2009

У меня была похожая проблема. В моем случае я избавился от своего MemoryStream, с которого я загрузил изображение.

//The following throws and OutOfMemoryException at the TextureBrush.ctor():

    /*someBytes and g declared somewhere up here*/
    Bitmap myBmp = null;
    using(MemoryStream ms = new MemoryStream(someBytes))
       myBmp = new Bitmap(ms);

    if(myBmp != null) //that's right it's not null.
       using(TextureBrush tb = new TextureBrush(myBmp)) //OutOfMemoryException thrown
          g.FillRectangle(tb,0,0,50,50);

//This code does not throw the same error:

    /*someBytes and g declared somewhere up here*/
        MemoryStream ms = new MemoryStream(someBytes);
        Bitmap myBmp = new Bitmap(ms);

        if(myBmp != null)
           using(TextureBrush tb = new TextureBrush(myBmp))
              g.FillRectangle(tb,0,0,50,50);
1 голос
/ 15 февраля 2010

Пожалуйста, не удаляйте Image и не закрывайте объект файлового потока, из которого вы получили Image, прежде чем вызывать класс TextureBrush для тайлинга. В противном случае класс TextureBrush сгенерирует исключение «Недостаточно памяти».

Таким образом, лучший способ - показать мозаичное изображение, вызвав изображение TextureBrush, а затем закрыть объект filestream в событии Paint формы Windows.

1 голос
/ 13 июня 2009

Оказывается, решение этой проблемы было связано с самим файлом PNG, используемым для фона. Я просто открыл его с помощью Paint.NET и сохранил его, затем вернул обратно в проект, и он заработал.

Не уверен, что изменилось, но это решило проблему.

...