C # / WPF - Использование Bitmap / SystemArgumentException Ошибка

1

По сути, мне нужно создать новый растровый рисунок из существующего (this.Document.Bitmap), а затем заменить существующий на новый в том же свойстве. Я также предпочел бы избавиться от любой дополнительной памяти, которую может вызвать этот клон, но я получаю эту ошибку.

Заявления вне блока использования вызывают это исключение, и я не могу понять, почему. Помогите?

Необработанное исключение типа "System.ArgumentException" произошло в System.Drawing.dll.

            using (Bitmap b = this.Document.Bitmap.Clone(new RectangleF() { Width = (int)this.croppingBorder.Width, Height = (int)this.croppingBorder.Height, X = (int)Canvas.GetLeft(this.croppingBorder), Y = (int)Canvas.GetTop(this.croppingBorder) }, this.Document.Bitmap.PixelFormat))
            {
                this.Document.Bitmap = b;
                BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(b.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
                image1.Source = bs;
            }

            canvas1.Width = this.Document.Bitmap.Width;
            canvas1.Height = this.Document.Bitmap.Height;
Теги:
wpf
bitmap

3 ответа

0
Лучший ответ

Вот что вы делаете по всем возникающим вопросам:

  • вы клонируете оригинальное растровое изображение в b
  • вы перезаписываете Document.B с клоном, но забываете утилизировать старое значение
  • то, когда вы выходите using блока, битбап b который также является Document.B, расположен, поэтому попытка получить размеры этого растрового изображения завершается с ошибкой.
  • кроме того, вы должны b.GetHBitmap() после копирования пикселей.
2

Использование using растровое изображение. Когда вы назначаете this.Document.Bitmap = b; , вы просто устанавливаете ссылку. Но тогда оператор using заканчивается и удаляет растровое изображение b, которое является растровым изображением, на которое ссылается this.Document.Bitmap.

Я думаю, что вы хотите:

Bitmap b = this.Document.Bitmap.Clone(...);
this.Document.Bitmap.Dispose();
this.Document.Bitmap = b;
1

Используя инструкцию "using", вы удаляете только что созданный объект Bitmap. Как только вы попытаетесь получить к нему доступ (например, извлекая его ширину для присвоения "canvas1.Width"), вы получите сообщение об ошибке.

Вместо этого вам, вероятно, следует сохранить ссылку на исходный битмап во временной переменной, назначив новый экземпляр Bitmap свойству Document.Bitmap, а затем явно удалив исходный битмап. Все без использования инструкции "using".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню