简体   繁体   English

QPainter 仅在 QImage 上绘制矩形的一部分

[英]QPainter paints only part of the rectangle over QImage

I'm loading image into QImage from data in memory, I've managed successfully paint it with QPainter onto QWidget.我正在从 memory 中的数据将图像加载到 QImage 中,我已经成功地将 QPainter 绘制到 QWidget 上。 Then I'm trying to change some pixels of this QImage to highlight rectangle area using rubber band.然后我尝试更改此 QImage 的一些像素以使用橡皮筋突出显示矩形区域。 My problem is that I'm getting only part of the rectangle, and sometimes nothing at all (see picture below).我的问题是我只得到了矩形的一部分,有时什么也没有(见下图)。 应该是四行的时候只有一行 Code.h:代码.h:

class PaintWidget : public QWidget
{
    Q_OBJECT
public:
    using QWidget::QWidget;

    void setSourceSample(Sample src) ;
    void drawRectangle(OCRRectangle rect);
protected:
    void paintEvent(QPaintEvent *event) override;
    void mousePressEvent(QMouseEvent *ev) override;
    void mouseMoveEvent(QMouseEvent *ev) override;
    void mouseReleaseEvent(QMouseEvent *ev) override;

private:
    QRectF target=QRectF(0, 0, 1000, 1000);
    QImage p_source;
    QPoint origin, end;
    QRubberBand * rubberBand;
    QPair<float, float> rsz_ratio;
    void calcROI();
    QPoint translateCoordinates(cv::Point point);
};

Code.cpp:代码.cpp:

void PaintWidget::paintEvent(QPaintEvent *event) {
    QPainter p(this);
    p.drawImage(target, p_source);
}
void PaintWidget::mousePressEvent(QMouseEvent *ev) {
    origin=ev->pos();
    rubberBand=new QRubberBand(QRubberBand::Rectangle, this);
    rubberBand->setGeometry(QRect(origin, QSize()));
    rubberBand->show();
}
void PaintWidget::mouseMoveEvent(QMouseEvent *ev) {
    rubberBand->setGeometry(QRect(origin, ev->pos()).normalized());
}
void PaintWidget::mouseReleaseEvent(QMouseEvent *ev) {
    end=ev->pos();
    rubberBand->hide();
    delete rubberBand;
    calcROI();
}
void PaintWidget::calcROI() {
    int p1x=min(end.x(),origin.x())*rsz_ratio.first;
    int p2x=max(end.x(),origin.x())*rsz_ratio.first;
    int p1y=min(end.y(), origin.y())*rsz_ratio.second;
    int p2y=max(end.y(), origin.y())*rsz_ratio.second;
    drawRectangle(OCRRectangle(cv::Point(p1x, p1y),cv::Point(p2x, p2y)));
}
void PaintWidget::setSourceSample(Sample src) {
    QImage inter=src.toQImage();
    p_source=inter.convertToFormat(QImage::Format::Format_RGB32);
    rsz_ratio.first=(float)src.size().width/(float)(target.width());
    rsz_ratio.second=(float)src.size().height/(float)target.height();
}
QPoint PaintWidget::translateCoordinates(cv::Point point) {
    QPoint qtpoint;
    qtpoint.setX(point.x);
    qtpoint.setY(point.y);
    return qtpoint;
}
void PaintWidget::drawRectangle(OCRRectangle rect) {
    QPoint p1(translateCoordinates(rect.p1)), p2(translateCoordinates(rect.p2));
    for (int i=p1.x(); i<=p2.x(); i++) {
       p_source.setPixelColor(i,p1.y(),QColor(255,0,0));
       p_source.setPixelColor(i, p2.y(), QColor(255,0,0));
    }
    for (int i=p1.y(); i<=p2.y(); i++) {
       p_source.setPixelColor(p1.x(),i,QColor(255,0,0));
       p_source.setPixelColor(p2.x(),i,QColor(255,0,0));
    }
}

UPDATE: it seems that the problem lies within rescaling of original image.更新:似乎问题在于原始图像的重新缩放。 When I'm drawing filled red rectangle it goes absolutely fine, my guess is that rescaling 1px border rectangle is just erasing borders.当我绘制填充的红色矩形时,它绝对没问题,我的猜测是重新缩放 1px 边框矩形只是擦除边框。 But setting thicker borders (up to 5 pixels) doesn't provide me with solution.但是设置更厚的边框(最多 5 个像素)并没有为我提供解决方案。

Making thicker borders solved this problem.制作更厚的边框解决了这个问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 通过qtcpsocket发送qimage:仅接收部分数据 - sending qimage over qtcpsocket: received only part of the data 在QPainter :: end()之前调用QImage :: save()是否安全? - Is it safe to call QImage::save() before QPainter::end() 使用旋转的QPainter绘画将剪辑裁剪到QImage的错误区域 - Painting with rotated QPainter clips to incorrect region of QImage 如何在QScrollArea上绘制QImage? 做到了这一点,但有一些小问题QPainter :: begin:小部件绘画只能作为paintEvent的结果开始 - How to draw QImage on QScrollArea? Did this, but have some minor problems QPainter::begin: Widget painting can only begin as a result of a paintEvent 使用一个QPainter一次绘制多个输出:SVG和QImage - Use one QPainter to paint multiple outputs at once: SVG and QImage 当QDeclarativeItem上的X,Y不为0时,QPainter :: drawImage()剪辑QImage - QPainter::drawImage() clips QImage when X, Y are not 0 on a QDeclarativeItem 使用QPainter确定在绘制时QImage的哪些像素被更改 - Determine which pixels of QImage were changed while painting on it with QPainter BeginDraw() 在状态栏上绘制 - 不考虑调整 renderTarget 的大小 - BeginDraw() paints over statusbar - resizing of renderTarget not respected 限制通过pixmap绘制qpainter - Restrict drawing of qpainter over pixmap 在 QImage 上执行深复制 - Perform deep copy over QImage
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM