我是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
答案 0 :(得分:2)
答案 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);
}