У меня есть функция, которая изменяет размер растрового изображения. Это такая "хлеб с маслом" операция, что я просто скопировал ее из другого проекта:
private Bitmap ResizeBitmap(Bitmap orig)
{
Bitmap resized = new Bitmap(this.Xsize, this.Ysize, PixelFormat.Format16bppGrayScale);
resized.SetResolution(orig.HorizontalResolution, orig.VerticalResolution);
using (Graphics g = Graphics.FromImage(resized))
{
g.DrawImage(orig, 0, 0, resized.Width, resized.Height);
}
return resized;
}
Однако я продолжал получать исключения OutOfMemory на Graphics g = Graphics.FromImage(resized)
.
Я знаю, что когда речь идет о GDI, исключения OutOfMemory обычно маскируют другие проблемы. Я также очень хорошо понимаю, что изображение, которое я пытаюсь изменить, невелико и что (насколько мне известно) сборщик мусора не должен иметь проблем со сбором экземпляров, когда они покидают текущую область.
Во всяком случае, я немного поиграл с ним, и в настоящее время он выглядит так:
private Bitmap ResizeBitmap(Bitmap orig)
{
lock(orig)
{
using (Bitmap resized = new Bitmap(this.Xsize, this.Ysize, PixelFormat.Format16bppGrayScale))
{
resized.SetResolution(orig.HorizontalResolution, orig.VerticalResolution);
using (Graphics g = Graphics.FromImage(resized))
{
g.DrawImage(orig, 0, 0, resized.Width, resized.Height);
}
return resized;
}
}
}
Но теперь я получаю исключение InvalidOperation на resized.SetResolution(orig.HorizontalResolution, orig.VerticalResolution);
Мне надоело ковыряться в темноте. Есть ли лучший способ справиться с этими надоедливыми операциями GDI?