По сути, мне нужно создать новый растровый рисунок из существующего (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;
Вот что вы делаете по всем возникающим вопросам:
b
Document.B
с клоном, но забываете утилизировать старое значениеusing
блока, битбап b
который также является Document.B
, расположен, поэтому попытка получить размеры этого растрового изображения завершается с ошибкой.b.GetHBitmap()
после копирования пикселей. Использование using
растровое изображение. Когда вы назначаете this.Document.Bitmap = b;
, вы просто устанавливаете ссылку. Но тогда оператор using
заканчивается и удаляет растровое изображение b
, которое является растровым изображением, на которое ссылается this.Document.Bitmap
.
Я думаю, что вы хотите:
Bitmap b = this.Document.Bitmap.Clone(...);
this.Document.Bitmap.Dispose();
this.Document.Bitmap = b;
Используя инструкцию "using", вы удаляете только что созданный объект Bitmap. Как только вы попытаетесь получить к нему доступ (например, извлекая его ширину для присвоения "canvas1.Width"), вы получите сообщение об ошибке.
Вместо этого вам, вероятно, следует сохранить ссылку на исходный битмап во временной переменной, назначив новый экземпляр Bitmap свойству Document.Bitmap, а затем явно удалив исходный битмап. Все без использования инструкции "using".