QPixmap类用于绘图设备的图像显示,它即可以作为一个绘图对象,也可以加载到一个控件中,通常是标签或按钮,用于在标签或按钮上显示图像。
QPixmap可以读取的图像文件类型有BMP、GIF、JPG、JPEG、PNG、PBM、PGM、PPM、XBM、XPM等
QPixmap与QImage的区别:
QPixmap依赖于硬件,QImage不依赖于硬件
QPixmap主要是用于绘图,针对屏幕显示而最佳化设计,QImage主要是为图像I/O、图片访问和像素修改而设计的
当图片小的情况下,直接用QPixmap进行加载,画图时无所谓,当图片大的时候如果直接用QPixmap进行加载,会占很大的内存,一般一张几十K的图片,用QPixmap加载进来会放大很多倍,所以一般图片大的情况下,用QImage进行加载,然后转乘QPixmap用户绘制。QPixmap绘制效果是最好的
#include <QPixmap>
载入图像和显示
QLabel* label=new QLabel(this); label->move(10,10); label->resize(500,500); QPixmap pm("./ma.jpg"); //创建QPixmap对象并读取图像 QPixmap p; //创建QPixmap对象 p.load("./laohu.jpg"); //载入图像 //重复load同一图像时,容易出错,解决办法看:https://blog.csdn.net/doupi2008/article/details/44960003/ label->setPixmap(p); //在label标签中显示图像 label->adjustSize();
QPixmap(const QString &fileName, const char *format = 0, Qt::ImageConversionFlags flags = Qt::AutoColor);//从指定的文件中加载图像并生成QPixmap对象
参数2:format:字符串,表示图像文件的格式,如果为0,将进行自动识别
参数3:flags:表示颜色的转换模式
1) Qt::AutoColor:由系统自动决定。
2) Qt::ColorOnly:彩色模式。
3) Qt::MonoOnly:单色模式
常用操作
QLabel* label=new QLabel(this); label->move(10,10); label->resize(400,400); QLabel* label1=new QLabel(this); label1->move(450,10); label1->resize(400,400); QPixmap p("./ma.jpg"); QRect r=QRect(150,150,300,300); QPixmap p1=p.copy(r); //返回指定区域的图像 QPixmap p2=p.copy(150,150,300,200); //返回指定区域的图像 p1.save("./ss.jpg"); //保存图像 //p2.fill(QColor(0,0,255)); //用给定的颜色填充pixmap //默认:Qt::white bool b=p2.hasAlpha(); //如果此pixmap有alpha通道或有掩码,则返回true,否则返回false int n=p2.height(); //返回图像的高 n=p2.width(); //返回图像的宽 QSize s1=p2.size();//返回图像的宽高 b=p2.isNull(); //如果这是空的pixmap,则返回true;否则返回false //空pixmap具有零宽度、零高度和无内容。不能在空pixmap中绘制 QSize s(200,100); QPixmap p3=p2.scaled(s);//将p2缩放成指定大小,然后返回新图像 QPixmap p4=p1.scaled(s,Qt::KeepAspectRatio); //缩放图像 /* 参数2:可选 IgnoreAspectRatio 默认 矩形框有多大,图片就缩放成多大,不限制原图片的长宽比 KeepAspectRatio 保持原图片的长宽比,且不超过矩形框的大小 KeepAspectRatioByExpanding 根据矩形框的大小最大缩放图片 参数3:可选 Qt::FastTransformation 默认 转换快速执行,没有任何平滑处理 Qt::SmoothTransformation 使用双线性滤波对生成的图像进行转换 */ p4=p1.scaledToHeight(200); //按照高度缩放 /* 参数2:可选 Qt::FastTransformation 默认 转换快速执行,没有任何平滑处理 Qt::SmoothTransformation 使用双线性滤波对生成的图像进行转换 */ p4=p1.scaledToWidth(200); //按照宽度缩放 /* 参数2:可选 Qt::FastTransformation 默认 转换快速执行,没有任何平滑处理 Qt::SmoothTransformation 使用双线性滤波对生成的图像进行转换 */ QImage im=p1.toImage(); //将QPixmap对象转换为QImage对象 //fromImage() 将QImage对象转换为QPixmap对象 QTransform tf; //坐标变换 tf.rotate(30.5,Qt::YAxis); //参数1:旋转角度 //参数2:旋转轴 Qt::XAxis Qt::YAxis Qt::ZAxis默认 QPixmap p5=p4.transformed(tf,Qt::FastTransformation); //返回旋转后的图像 /* 参数1:旋转角度 正数:顺时针 负数:逆时针 参数2:Qt::FastTransformation 默认 变换执行迅速,无需平滑 Qt::SmoothTransfor 利用双线性滤波对得到的图像进行变换 */ qDebug()<<s1; label->setPixmap(p1); //在label标签中显示图像 label->adjustSize(); label1->setPixmap(p5); label1->adjustSize();
作为绘图设备
QLabel* label=new QLabel(this); label->move(10,10); label->resize(400,400); QPixmap p(300,300); //创建QPixmap空白图像对象 //参数:图像大小 QPainter painter(&p); //创建画家 //参数:绘图设备 painter.fillRect(100,100,100,50,Qt::blue);//在pix上绘制正方形 label->setPixmap(p); //在label标签中显示图像 label->adjustSize();