GDI + ошибка удаления битовой карты и неверные параметры - PullRequest
0 голосов
/ 12 апреля 2019

Я пишу приложение для рисования некоторых изображений для меня, используя некоторые промежуточные растровые изображения, но я получаю ошибку недопустимого параметра от GDI + (класс графики), если я избавляюсь от промежуточного растрового изображения, используемого для изменения размера изображения дорастровое изображение нарисовано.

Само приложение предназначено для приема входных изображений и вывода их обрезанных и измененных размеров в файл изображения.Теперь это означает, что в определенный момент времени измененное изображение сохраняется в промежуточном растровом изображении.Когда изменение размера выполнено, промежуточное растровое изображение назначается исходному растровому изображению, которое затем рисуется с помощью GDI +, и промежуточное изображение удаляется.Однако по какой-то причине, если посредник удаляется до того, как исходное изображение перерисовывается (несмотря на то, что его значения присваиваются другой переменной и теоретически не нужны), программа выдает ошибку неверного параметра, и мне было любопытно, почему.

Этоversion выдает неверный параметр error

using system.drawing;
Bitmap Background = new Bitmap(*filepath*);
Bitmap Image = new Bitmap(*another filepath*);
Bitmap ResizedImage = new Bitmap(825, 1125);
...Some code that clips and resizes Image and draws it onto ResizedImage...
Image = ResizedImage;
ResizedImage.Dispose();
using(Graphics g = Graphics.FromImage(Background)
{
  g.DrawImage(Image, 0, 0, 825, 1125);
}

Но эта версия не меняется, и изменяется только позиция одной строки

using system.drawing;
Bitmap Background = new Bitmap(*filepath*);
Bitmap Image = new Bitmap(*another filepath*);
Bitmap ResizedImage = new Bitmap(825, 1125);
...Some code that clips and resizes Image and draws it onto ResizedImage...
Image = ResizedImage;
using(Graphics g = Graphics.FromImage(Background)
{
  g.DrawImage(Image, 0, 0, 825, 1125);
  ResizedImage.Dispose();
}

Поскольку ResizedImage копирует свое содержимое в Image до его удаленияиз, изображение должно рисоваться очень хорошо, но я получаю ошибку неверного параметра, если я использую первый бит кода, и я просто хотел знать, почему.Я предполагаю, что это как-то связано с тем, как растровые назначения на самом деле работают, чем я не знаю, но некоторые более мудрые советы высоко ценятся.

1 Ответ

0 голосов
/ 12 апреля 2019

Вот ваша проблема

Image = ResizedImage;

Bitmap - это тип ссылки , на данный момент Image и ResizedImage оба указывают на один и тот же бит памяти.Оригинальный Image теряется и становится утечкой памяти

Затем вы звоните Dispose() на ResizedImage, который является ссылкой с Image сейчас (ResizedImage == Image)

ResizedImage.Dispose();

Затем попробуйте и используйте его снова (помня, что Image является утилизированным ResizedImage)

g.DrawImage(Image, 0, 0, 825, 1125);

Короче, не делайте этого Image = ResizedImage;, также используйте using заявлений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...