QT - 图像处理 ( 6 ) - QPainter 对 QPixmap 图像拼接、覆盖、写文字

本文介绍了使用QPainter在QPixmap上进行图像操作,包括字符串绘制、图片水平拼接、图片覆盖以及多图拼接等技术,详细展示了如何利用Qt库进行图像处理。

1. 把字符串绘制在QPixmap上

QPixmap MainWindow::text2Pixmap(QString text)
{
    QFontMetrics fmt(m_font);
    QPixmap result(fmt.width(text), fmt.height());
  
    QRect rect(0,0,fmt.width(text), fmt.height());
    result.fill(Qt::transparent);
    QPainter painter(&result);
    painter.setFont(m_font);
    painter.setPen(QColor(255,143,36));
    //painter.drawText(const QRectF(fmt.width(text), fmt.height()),Qt::AlignLeft, text);
    painter.drawText((const QRectF)(rect),text);
    return result;
}
QSize size(200,200); //指定图片大小;
QImage image(size,QImage::Format_ARGB32); //以ARGB32格式构造一个QImage

//image.fill(qRgba(0,0,0,100));//填充图片背景,120/250为透明度
QPainter painter(&image); //为这个QImage构造一个QPainter
painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);
//设置画刷的组合模式CompositionMode_SourceOut这个模式为目标图像在上。
//改变组合模式和上面的填充方式可以画出透明的图片。

//改变画笔和字体
QPen pen = painter.pen();
pen.setColor(Qt::red);
QFont font = painter.font();
font.setBold(true);//加粗
font.setPixelSize(50);//改变字体大小

painter.setPen(pen);
painter.setFont(font);

painter.drawText(image.rect(),Qt::AlignCenter,"Hello");//将Hello写在Image的中心

 

2. 对图片进行水平拼接

//多张图片拼接合成一张图片
QPixmap MainWindow::pinjie(QVector<QPixmap> image)
{
  int image_width=0;
  int max_height = 0;

  QVector <QPixmap > ::iterator it;
  for(it = image.begin();it!=image.end();++it)
  {
    int width = (*it).width();
    image_width += width;
    image_width +=5;

    if((*it).height()>max_height)
    {
      max_height =(*it).height();
    }
  }

  QPixmap result_image_h(image_width,max_height);
  result_image_h.fill(Qt::transparent);

  QPainter painter_h;
  painter_h.begin(&result_image_h);
  int x_number=0;
  for(it = image.begin();it!=image.end();++it)
  {
    painter_h.drawPixmap(x_number,0,(*it));
    x_number += (*it).width();
    x_number +=5;
  }
  painter_h.end();

  return result_image_h;
}

3. 把一张图片绘制在空白图片上

QPixmap  MainWindow::zoomOutPix(QPixmap pix ,int addWidth, int addHeight)
{
    // addWidth pix增加的宽度,addHeight pix增加的高度
    QPixmap res(pix.width() + addWidth, pix.height() + addHeight);
    res.fill(Qt::transparent);
    QPainter painter(&res);
    painter.drawPixmap(addWidth/2, addHeight/2, pix.width(), pix.height(), pix);
    return res;
}

4. 把一张图片绘制在另外一张图片上

//一张图片绘制在另外一张图片上
QPixmap MainWindow::dijia(QPixmap p1, QPixmap p2)
{
    //p1作为底片, p2绘制在p1图片上
    QPainter painter(&p1);
    painter.drawPixmap(0,0,p2.width(),p2.height(), p2);
    return p1;
 
}

 

Qt是一个强大的跨平台应用程序开发框架,它提供了丰富的图形用户界面组件和多媒体处理功能。在Qt中进行图像拼接,通常会涉及到QImage或QPixmap等类的使用,以及 QPainterQPainterPath来进行图像绘制操作。 以下是一个简单的例子,展示了如何使用Qt将两个QImage对象拼接在一起: ```cpp #include <QApplication> #include <QImage> #include <QPainter> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 加载两个图像 QImage img1("image1.jpg"); QImage img2("image2.jpg"); // 创建一个新的QImage,宽度等于两个图像宽度之和,高度等于较短的高度 QImage combinedImage(img1.width() + img2.width(), qMin(img1.height(), img2.height()), QImage::Format_RGB888); // 获取画笔并设置目标为新的图像 QPainter painter(&combinedImage); painter.setPen(Qt::NoPen); // 设置画笔无边框 // 在新图像上绘制第一个图像 painter.drawImage(0, 0, img1); // 将第二个图像绘制在第一个图像的右边缘 painter.drawImage(img1.width(), 0, img2); // 显示结果 QLabel label; label.setPixmap(QPixmap::fromImage(combinedImage)); label.show(); return app.exec(); } ``` 在这个例子中,我们首先加载两个图像,然后创建一个新的QImage来作为拼接后的容器。然后使用QPainter在新图像上逐个绘制这两个原图,并将第二个图像绘制在第一个图像的右边。最后,我们将结果转换成QPixmap并显示在QLabel上。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值