Захват изображения за прямоугольником

Я написал небольшое приложение, которое будет использоваться в моей рабочей среде для обрезки изображений. Форма окна (.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);  
}
Другие вопросы по тегам