//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),®ion); //按(参数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);
}
QPixmap功能方法(QT5.12)
最新推荐文章于 2025-06-08 23:33:21 发布