Заранее спасибо за помощь. Поэтому ниже я пытаюсь создать снайперский инструмент. Я создал виджет с помощью Qt и сделал его почти прозрачным. Пользователь использует свою мышь, чтобы создать квадрат области, которую он хочет скопировать. Я могу заставить его скопировать раздел, но не раздел записи. Я использовал функцию getcursor, чтобы получить пользовательские курсоры positiona, а также конечную и начальную точки квадрата. Я установил свой виджет на размер экрана, а затем сфотографировал весь рабочий стол (используя размер окна моего виджета в качестве размера изображения), используя мою функцию void. Однако значения x, y экрана и изображений не «перекрываются», вместо того, чтобы получить то, что находится в квадрате пользователя dr aws, он получает другой квадрат на экране. Есть ли способ исправить это?
Frame_Record::Frame_Record(QWidget* parent) : QWidget(parent)
{
//this->setStyleSheet("background-color:rgba(0,0,0,0)");
this->setWindowState(Qt::WindowFullScreen);
this->setWindowOpacity(0.1);
this->setStyleSheet("QWidget{background:#000000}");
x_size = this->size().width();
y_size = this->size().height();
//cv::waitKey(0);
//setAttribute(Qt::WA_TranslucentBackground);
/*setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
setAttribute(Qt::WA_NoSystemBackground);
setAttribute(Qt::WA_TranslucentBackground);
//setAttribute(Qt::WA_PaintOnScreen);
//setAttribute(Qt::transparent);
setAttribute(Qt::WA_MouseNoMask,true);
setAttribute(Qt::WA_MouseTracking,true);*/
}
void Frame_Record::mousePressEvent(QMouseEvent* events)
{
POINT start;
GetCursorPos(&start);
qDebug() << "Mouse pressed PRessed";
x_start = start.x;
y_start = start.y;
}
void Frame_Record::mouseReleaseEvent(QMouseEvent* events)
{
qDebug() << "Mouse unpressed";
qDebug() << x_start;
qDebug() << y_start;
qDebug() << x_end;
qDebug() << y_end;
POINT end;
GetCursorPos(&end);
x_end = end.x;
y_end = end.y;
get_Image(y_size, x_size); //y then x
this->close();
}
void Frame_Record::mouseMoveEvent(QMouseEvent* events)
{
POINT end;
GetCursorPos(&end);
x_end = end.x;
y_end = end.y;
qDebug() << "mouse is moving";
}
void Frame_Record::get_Image(int screen_w, int screen_h)
{
HBITMAP bitmap;
cv::Mat pic;
HDC hdcSys = GetDC(NULL);
HDC hdcMem = CreateCompatibleDC(hdcSys);
void* ptrBitmapPixels;
BITMAPINFO bInfo;
HDC hdc{};
ZeroMemory(&bInfo, sizeof(BITMAPINFO));
bInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bInfo.bmiHeader.biWidth = screen_w;
bInfo.bmiHeader.biHeight = -screen_h;
bInfo.bmiHeader.biPlanes = 1;
bInfo.bmiHeader.biBitCount = 32;
bitmap = CreateDIBSection(hdc, &bInfo, DIB_RGB_COLORS, &ptrBitmapPixels, NULL, 0);
SelectObject(hdcMem, bitmap);
pic =cv::Mat(screen_h, screen_w, CV_8UC4, ptrBitmapPixels, 0);
BitBlt(hdcMem, 0, 0, screen_w, screen_h, hdcSys, 0, 0, SRCCOPY);
cv::Mat mod_pic(pic, cv::Range(x_start, x_end), cv::Range(y_start, y_end));
// pic(cv::Rect(x_start, y_start, x_start - x_end, y_start - y_end));
// Mat matRef=matBitmap(Range(100,200), Range(100,200));
//bitwise_not(matRef,matRef);
cv::imshow("Title", mod_pic);
cv::waitKey(0);
cv::destroyAllWindows();
}