Control.DrawToBitmap всегда будет пытаться нарисовать весь элемент управления или форму и всегда будет начинаться сверху.Параметр:
targetBounds Тип: System.Drawing.Rectangle
The bounds within which the control is rendered.
, как следует из названия, устанавливает target , а не источник прямоугольник.Отсюда пробел над вашим результатом.
Переместите линию перед кадрированием с помощью прямоугольника, который содержит всю область, возможно, так:
DrawToBitmap(bm, ClientRectangle);
, а затем обрежьте нижнюю часть, как и раньше..
Обратите внимание, что уловка обрезки по вашей ссылке не будет работать для DrawToBitmap
;использование прямоугольника с отрицательным смещением вызовет исключение параметра.
Кстати: для безопасного удаления растрового изображения в PictureBox используйте следующее:
Bitmap dummy = (Bitmap )somePictureBox.Image;
somePictureBox.Image = null;
if (dummy != null) dummy.Dispose;
И, действительно,ответ ChrisJJ в ссылке утечка объекта Graphics
.
Обновление:
Поскольку вы, кажется, потеряли контроль над различными изменениями и предложениями, вот минимальное изменение кода по сравнению с исходным сообщением:
Bitmap bm = new Bitmap(frmPrint.ClientWidth, frmPrint.ClientHeight);
DrawToBitmap(bm, frmPrint.ClientRectangle);
Rectangle rec = new Rectangle(0, 200, 576, 300);
Bitmap bitmap = cropImg(bm, rec);
frmPrint._img = bitmap;
frmPrint.setImage();
С помощью:
public void setImage()
{
Bitmap dummy = pictureBox3.BackgroundImage;
pictureBox3.BackgroundImage = null;
if (dummy != bnull) dummy.Dispose();
pictureBox3.BackgroundImage = _img;
this.ShowDialog();
}
В функции cropImg
добавьте g.Dispose
перед возвратом.