用较小的QPixMap替换QPixMap的一部分

时间:2016-11-21 15:25:37

标签: c++ qt

我是Qt和Qt Graphics API的新手。

我有一个更大的QPixMap和一个更小的QPixMap。我需要用较小的部分替换较大部分(QRect)。

我该如何实现这个目标?

感谢。

更新

QPainter::drawPixmap()不会更新由pImage-> p_PixMap表示的图像。

代码

class GraphicImage : public QObject,
    public QGraphicsPixmapItem
{
    Q_OBJECT

public:
    GraphicImage(QPixmap* oImage,GraphiItemCtrl* pParent);
    virtual ~GraphicImage(void);
    QPixmap* p_PixMap;
};
- - - - 
GraphicImage::GraphicImage(QPixmap* oImage,GraphiItemCtrl* pParent)
    :QGraphicsPixmapItem(*oImage), p_Parent(pParent)
{
    p_PixMap = oImage;
}
- - - - 
void GraphiItemCtrl::SetImagePortion( QString sFileName, QRect rect, QPixmap pChildPixMap )
{
    GraphicImage* pImage = map_CurrentImages[sFileName];

    if ( !pImage )
        return;

    pChildPixMap.save("test.jpg");
    QPixmap* pMap = pImage->p_PixMap;
    QPainter pPainter(pMap);

    pPainter.drawPixmap(rect, pChildPixMap);
    qDebug() << rect.topLeft();
}

pChildPixMap.save("test.jpg");可以毫无问题地保存图像所需的部分。

注意pImage继承自QObject和QGraphicsPixmapItem。 pMap不是NULL

3 个答案:

答案 0 :(得分:2)

快速伪代码:

QPainter painter(pixmap1);
painter.drawPixmap(QRect, pixmap2);

查看文档here

答案 1 :(得分:2)

您正在寻找的功能是:

void QPainter::drawPixmap(const QRect &rectangle, const QPixmap &pixmap)

它会将pixmap绘制到画家目标的rectangle部分。

您可能还想使用这个:

void QPainter::drawPixmap(const QRect &target, const QPixmap &pixmap, const QRect &source)

将把一部分光源绘制到目标的一部分中。

在这两种情况下,如果尺寸不匹配,图像将被缩放,因此如果结果不佳,您还需要调整缩放方法。

正如this answer中所确定的那样,单独设置setRenderHint(QPainter::SmoothPixmapTransform);似乎不会产生最佳结果。如果你想要最好的质量,你需要手动scale()像素图然后绘制它,这比在绘画时动态缩放它产生更好的结果。

答案 2 :(得分:0)

您需要在目标像素图上使用画家在给定目标矩形中绘制源像素图:

void draw(QPixmap &dst, const QRect &dstRect, const QPixmap &src) {
  QPainter(dst).drawPixmap(dstRect, src); 
}

如果你在一个目的地上绘制多个这样的像素图,你应该坚持画家 - 在一个循环中一遍又一遍地构建新画家是浪费的:

struct Replacement {
  QRect dstRect;
  QPixmap source;
};

void draw(QPixmap &dst, const QList<Replacement> &replacements) {
  QPainter painter{dst};
  for (auto & r : replacements)
    painter.drawPixmap(r.dstRect, r.source);
}