[英]Replace a part of a QPixMap with a smaller QPixMap
我是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
您要寻找的功能是:
void QPainter::drawPixmap(const QRect &rectangle, const QPixmap &pixmap)
它将把pixmap
绘制到画家目标的rectangle
部分。
您可能还想使用此代码:
void QPainter::drawPixmap(const QRect &target, const QPixmap &pixmap, const QRect &source)
这会将源的一部分吸引到目标的一部分中。
在这两种情况下,如果尺寸不匹配,图像将被缩放,因此,如果结果不佳,则还需要调整缩放方法。
如在此答案中所确定的,设置setRenderHint(QPainter::SmoothPixmapTransform);
本身似乎无法产生最佳结果。 如果要获得最佳质量,则需要手动scale()
像素图,然后绘制它,这比绘画时动态缩放它要好得多。
您需要在目标像素图上使用绘画工具以在给定的目标矩形中绘制源像素图:
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.