Захват изображения за прямоугольником
Я написал небольшое приложение, которое будет использоваться в моей рабочей среде для обрезки изображений. Форма окна (.NET 3.5), которая содержит изображение, имеет прозрачный прямоугольник, который я использую для перетаскивания части изображения и нажатия кнопки, чтобы получить то, что было за прямоугольником.
В настоящее время я использую приведенный ниже код, это вызывает у меня проблемы, потому что область захвата отключена на несколько пикселей, и я думаю, что это как-то связано с моей функцией CopyFromScreen.
//Pass in a rectangle
private void SnapshotImage(Rectangle rect)
{
Point ptPosition = new Point(rect.X, rect.Y);
Point ptRelativePosition;
//Get me the screen coordinates, so that I get the correct area
ptRelativePosition = PointToScreen(ptPosition);
//Create a new bitmap
Bitmap bmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb);
//Sort out getting the image
Graphics g = Graphics.FromImage(bmp);
//Copy the image from screen
g.CopyFromScreen(this.Location.X + ptPosition.X, this.Location.Y + ptPosition.Y, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy);
//Change the image to be the selected image area
imageControl1.Image.ChangeImage(bmp);
}
Если кто-то может заметить, почему, когда изображение перерисовывается совсем немного, я был бы вечно благодарен за это. Так же ChangeImage
Функция в порядке - она работает, если я использую форму в качестве области выбора, но использование прямоугольника немного потрясает.
2 ответа
Интересно, что это произошло из-за пространства между основной формой и элементом управления, на котором было изображение, и панелью инструментов в верхней части формы, разделяющей элемент управления и верхнюю часть основной формы. Чтобы обойти это, я просто изменил одну строку на экране захвата, чтобы учесть эти пиксели, как показано ниже:
g.CopyFromScreen(relativePosition.X + 2, relativePosition.Y+48, Point.Empty.X, Point.Empty.Y, bmp.Size);
ура
Вы получили относительное положение на экране как ptRelativePosition
, но вы на самом деле никогда не используете это - вы добавляете местоположение прямоугольника к местоположению вашей формы, которое не учитывает границы формы.
Вот это исправлено с несколькими оптимизациями:
// Pass in a rectangle
private void SnapshotImage(Rectangle rect)
{
// Get me the screen coordinates, so that I get the correct area
Point relativePosition = this.PointToScreen(rect.Location);
// Create a new bitmap
Bitmap bmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb);
// Copy the image from screen
using(Graphics g = Graphics.FromImage(bmp)) {
g.CopyFromScreen(relativePosition, Point.Empty, bmp.Size);
}
// Change the image to be the selected image area
imageControl1.Image.ChangeImage(bmp);
}