QPixmap功能方法(QT5.12)

本文详细探讨了QPixmap类在图像处理中的关键操作,如加载、绘制、裁剪、蒙版创建、转换和保存,适合理解和实践Qt图像处理技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


//for starf study

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include<QDebug>
#include<QPainter>
#include<QPixmap>
#include<QRect>
#include<QImage>
#include<QBitmap>
#include<QImageReader>
#include<QRegion>
#include<QTransform>

//QPixmap 类是一种屏幕外图像表示,可以用作绘制设备。
//QPixmap是为在屏幕上显示图像而设计和优化的。
//QPixmap几乎和QImage提供相同的功能
//区别:1、QPixmap依赖于硬件,QImage不依赖
//          2、在除了Windows的其他一些平台上,两种类的底层原理可能不同,
//                        这会导致计算、绘画修改图片的时候,qimage更快;显示的时候qpixmap更快
//          3、QPixmap不可以在显示线程之外访问,而QImage可以
//用法:当要操作图像对象的时候,就使用QImage,最后渲染的时候,使用QPixmap::convertFromImage 函数转换为QPixmap对象进行渲染
//这里面提到的mask指的是图像蒙版,详情请查询:PS教程 - 蒙版
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::paintEvent(QPaintEvent *)
{
    QPixmap pix = QPixmap(":/new/prefix1/D:/test.png");
    //用现成的图片创建一个pix对象

    QPainter paint(this);
    QRect rc = QRect(15,15,200,200);
    //paint.drawPixmap(rc,pix);

    //QPixmap QPixmap::alphaChannel() const
    //void QPixmap::setAlphaChannel(const QPixmap &p)
            //一般不使用的一对方法
    qDebug()<< pix.cacheKey();//返回标识此QPixmap的数字。
                //如果不同的QPixmap对象引用相同的内容,则它们只能具有相同的KEY。
               //更改pixmap时,cacheKey()将更改。

    paint.drawEllipse(QRect(20,20,15,15));
    paint.fillRect(rc,QColor(0,0,0,0));
    QImage img = QImage(150,150,QImage::Format_ARGB32);
    img.fill(QColor(0,0,0,0));
    qDebug()<<pix.convertFromImage(img);//参数2设置色彩模式
            //Qt::AutoColor  (默认)-如果图像的深度为1且仅包含黑白像素,则pixmap将变为单色
            //Qt::ColorOnly  pixmap会抖动/转换为本机显示深度。
            //Qt::MonoOnly  pixmap变成单色。
    //[static] QPixmap QPixmap::fromImage(QImage &&image, Qt::ImageConversionFlags flags = Qt::AutoColor)
    QPixmap copy = pix.copy(rc); //返回给定矩形指定的像素贴图子集的深度副本。
        //QPixmap QPixmap::copy(int x, int y, int width, int height) const
    QBitmap mask = pix.createHeuristicMask(true);//创建并返回此pixmap的遮罩。
                    //从一个角点选择一种颜色,然后从所有边缘开始去除该颜色的像素。这个函数很慢

    QBitmap mask2 = pix.createMaskFromColor(QColor(0xffff0000), Qt::MaskInColor); //基于给定的颜色创建并返回此pixmap的遮罩
        // Qt::MaskInColor 则与maskColor匹配的所有像素都将是透明的
        //Qt::MaskOutColor 与maskColor匹配的所有像素都将不透明。
    qDebug()<<pix.defaultDepth(); //返回应用程序使用的默认pixmap深度。
    qDebug()<<pix.depth(); //返回此图的深度。
    pix.detach(); //从共享的pixmap数据中分离pixmap。这个函数在其他很多函数中被隐式调用 一般不手动调用
    qDebug()<<pix.devicePixelRatio(); //返回pixmap的设备像素比率。
    pix.fill(QColor(0,0,0,0));
    QImageReader* re = new QImageReader();
    QPixmap reader = pix.fromImageReader(re);//直接从imageReader读取的图像创建QPixmap
    //在某些系统上,直接将图像读取到QPixmap比读取QImage以将其转换为QPixmap使用的内存更少。
    qDebug()<<pix.hasAlpha();//如果此pixmap具有alpha通道或掩码,则返回true,否则返回false。
    qDebug()<<pix.hasAlphaChannel(); //如果pixmap的格式符合alpha通道,则返回true,否则返回false。
    qDebug()<<pix.height(); //返回pixmap的高度。
    qDebug()<<pix.isNull();//如果这是一个空的pixmap,则返回true;
    qDebug()<<pix.isQBitmap(); //如果这是QBitmap,则返回true;否则返回false。
    pix.load(":/new/prefix1/D:/test.png","jpg"); //加载一个图像
        //参数2指定格式,如果不指定,那么系统将更具数据头猜测类型
    uchar* temp = (uchar *) malloc(10000);
    qDebug()<<pix.loadFromData(temp, 10000,"jpg");//从给定二进制数据中加载一个pixmap。pixmap加载成功,则返回true;
           //加载程序尝试使用指定的格式读取pixmap。如果不指定,那么系统将更具数据头猜测类型
        //bool QPixmap::loadFromData(const QByteArray &data, const char *format = nullptr, Qt::ImageConversionFlags flags = Qt::AutoColor)
    QBitmap mas = pix.mask(); //从pixmap的alpha通道提取位图遮罩。
    qDebug()<<pix.rect(); //返回像素贴图的封闭矩形。
    qDebug()<<pix.save("D:\\testpix.jpg","jpg");//使用指定的图像文件格式,将pixmap保存到具有给定文件名的文件中。
    //bool QPixmap::save(QIODevice *device, const char *format = nullptr, int quality = -1) const
    QPixmap scald = pix.scaled(40,40,Qt::IgnoreAspectRatio,Qt::FastTransformation);
        //参数3指定缩放类型,是否考虑纵横比
        //参数4指定变换类型,变换是瞬变还是渐变
    //QPixmap QPixmap::scaled(const QSize &size, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation) const
    QPixmap scaldh = pix.scaledToHeight(59);//返回图像的缩放副本。使用指定的变换模式将返回的图像缩放到给定的高度。
                                                                //pixmap的宽度将自动计算,以便保留pixmap的纵横比。
    //QPixmap QPixmap::scaledToWidth(int width, Qt::TransformationMode mode = Qt::FastTransformation) const
    QRegion region = QRegion(QRect(20,50,20,20));
    pix.scroll( 50,20,QRect(20,20,40,40),&region); //按(参数1,参数2)滚动此pixmap的区域矩形。原区域保持不变。
                                                //参数3用来保存滚动后的区域 当pixmap上有活动画师时,无法滚动。
    pix.setMask(mask2);//设置遮罩位图。此函数将遮罩与pixmap的alpha通道合并。
                                //遮罩上的像素值为1表示pixmap的像素不变;值为0表示像素是透明的。遮罩的大小必须与此pixmap相同。
                                //设置空遮罩会重置遮罩,使以前透明的像素保持黑色。
    qDebug()<<pix.size(); //返回图片尺寸
    qDebug()<<pix.width(); //返回图片宽度
    pix.swap(scald); //用这个pixmap交换另一个pixmap。
    pix.swap(scald);
    QImage img2 = pix.toImage();//将pixmap转换为QImage。如果转换失败,则返回空图像。
    QPixmap trans = pix.transformed(QTransform()); //返回使用给定转换和转换模式转换的pixmap的副本
            //原图不变,返回变换后的图片
    //QPixmap QPixmap::transformed(const QMatrix &matrix, Qt::TransformationMode mode = Qt::FastTransformation) const

    free(temp);



}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值