//for starf study
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include <QImage>
#include <QSize>
#include <QRect>
#include <QString>
#include <QVector>
#include <QImageReader>
//QImage类提供独立于硬件的图像表示,允许直接访问像素数据,并可用作绘制设备。
//Qt提供了四个处理图像数据的类:QImage、QPixmap、QBitmap和QPicture。
//QImage是为I/O、直接像素访问和操作而设计和优化的
//QPixmap是为在屏幕上显示图像而设计和优化的。
//QBitmap只是一个继承QPixmap的方便类,确保深度为1。
//QPicture类是一个绘画设备,用于记录和重放QPaint命令。
//像素深度是指存储每个像素所需要的比特数。假定存储每个像素需要8bit,则图像的像素深度为8。
//图像深度是指像素深度中实际用于存储图像的灰度或色彩所需要的比特位数,
//假定图像的像素深度为16bit,但用于表示图像的灰度或色彩的位数只有15位,则图像的图像深度为15。
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QImage img = QImage(QSize(300, 200), QImage::Format_ARGB32); //图像使用32位ARGB格式(0xAARRGGBB)存储。
//第一个参数指定图像尺寸 也可以用 两个整数(width,height)替换
//第二个参数设置图像模式 QImage::Format ,可选项有:
//QImage::Format_Invalid(0) 图像无效
//QImage::Format_Mono 图像以每像素1位的方式存储。字节首先被最高有效位(MSB)压缩。
//QImage::Format_MonoLSB 图像以每像素1位的方式存储。字节首先被低有效位(LSB)压缩。
//QImage::Format_Indexed8 使用8位索引将图像存储到颜色映射中。
//QImage::Format_RGB32 图像使用32位RGB格式(0xffRRGGBB)存储。
//QImage::Format_ARGB32 图像使用32位ARGB格式(0xAARRGGBB)存储。
//QImage::Format_ARGB32_Premultiplied 图像使用预乘32位ARGB格式(0xAARRGBB)存储
//即红色、绿色和蓝色通道乘以alpha分量除以255。
//某些操作(例如使用alpha混合的图像合成)使用预乘ARGB32比使用普通ARGB32更快。
//QImage::Format_RGB16 图像使用16位RGB格式(5-6-5)存储。
//QImage::Format_ARGB8565_Premultiplied 图像使用预乘24位ARGB格式(8-5-6-5)存储。
//QImage::Format_RGB666 图像使用24位RGB格式(6-6-6)存储。未使用的最高有效位始终为零。
//QImage::Format_ARGB6666_Premultiplied 图像使用预乘24位ARGB格式(6-6-6-6)存储。
//QImage::Format_RGB555 图像使用16位RGB格式(5-5-5)存储。未使用的最高有效位始终为零。
//QImage::Format_ARGB8555_Premultiplied 图像使用预乘24位ARGB格式(8-5-5-5)存储。
//QImage::Format_RGB888 图像使用24位RGB格式(8-8-8)存储。
//QImage::Format_RGB444 图像使用16位RGB格式(4-4-4)存储。未使用的位始终为零。
//QImage::Format_ARGB4444_Premultiplied 图像使用预乘16位ARGB格式(4-4-4-4)存储。
//QImage::Format_RGBX8888 图像使用32位字节顺序的RGB(x)格式(8-8-8-8)存储。这与格式_RGBA8888相同,只是alpha必须始终为255。
//QImage::Format_RGBA8888 图像使用32位字节顺序的RGBA格式(8-8-8-8)存储。
//与ARGB32不同,这是一种字节顺序格式,这意味着32位编码在大端和小端体系结构之间有所不同,分别为(0xRRGGBBAA)和(0xAABBGGRR)。
//QImage::Format_RGBA8888_Premultiplied 图像使用预乘32位字节顺序RGBA格式(8-8-8-8)存储。
//QImage::Format_BGR30 图像使用32位BGR格式(x-10-10-10)存储
//QImage::Format_A2BGR30_Premultiplied 图像使用32位预乘ABGR格式(2-10-10-10)存储。
//QImage::Format_RGB30 图像使用32位RGB格式(x-10-10-10)存储。
//QImage::Format_A2RGB30_Premultiplied 图像使用32位预乘ARGB格式(2-10-10-10)存储。
//QImage::Format_Alpha8 图像使用8位纯alpha格式存储。
//QImage::Format_Grayscale8 图像以8位灰度格式存储。
//QImage::Format_RGBX64 图像使用64位半字有序RGB(x)格式(16-16-16-16)存储。这与格式_RGBX64相同,只是alpha必须始终为65535。
//QImage::Format_RGBA64 图像使用64位半字有序RGBA格式(16-16-16-16)存储。
//QImage::Format_RGBA64_Premultiplied 图像使用预乘64位半字有序RGBA格式(16-16-16-16)存储。
const QString filename = QString("D:/test.jpge");
QImage img2 = QImage(filename); //直接通过一个现有的图片创建图片对象 对象会尝试加载该图片 如果加载映像失败,则此对象为空图片。
img2 = QImage(QSize(100,1), QImage::Format_ARGB32);
qDebug() <<img2.allGray(); //如果图像中的所有颜色都是灰色(即红色、绿色和蓝色分量相等),则返回true;
qDebug()<<img2.bitPlaneCount(); //返回图像中的位平面数。位平面数是每个像素的颜色和透明度信息的位数。
uchar *start = nullptr;
start = img2.bits(); //返回指向第一个像素数据的指针。这相当于扫描线(0)。
//使用uchar*类型接收时候,返回的指针执行共享像素数据的深度复制,、
//也就是通过start遍历,修改数据 和原图img2没有关系 ,而是重新复制了一个空间,将首指针返回给start
const uchar *costart = img2.bits(); //返回指向第一个像素数据的指针。
//返回类型为const uchar* 返回的指针不执行深度复制,
//也就是返回原图的首指针
qDebug()<<img2.bytesPerLine(); //返回每个图像扫描线的字节数。即一行的字节数(一个像素点有4个字节)
//那么如果是50*100的图片,宽是50px,就有50 * 4 = 200 个字节
qDebug()<< img2.cacheKey(); // 返回一个数字(key),该数字标识此QImage对象的内容。
//不同的QImage对象只有在引用相同的内容时才能具有相同的密钥。
//当图片更改时,key值将更改
qDebug()<<img2.colorCount(); //返回图像颜色表的大小。colorCount()对32 bpp图像返回0,因为这些图像不使用颜色表,而是将像素值编码为ARGB四元组
qDebug()<<img2.color(0); //返回颜色表中索引为1的地方的颜色。如果这个图的colorCount() 返回0, 那么此函数可能报错
QVector<QRgb> rgbTable = img2.colorTable(); //返回图像颜色表中包含的颜色列表,如果图像没有颜色表,则返回空列表
const uchar *consstart = img2.constBits(); //返回指向第一个像素数据的指针。返回数据是常量,不进行深度复制
const uchar* scan = img2.constScanLine(2); //返回索引为i的扫描线处的像素数据指针。第一条扫描线位于索引0处。
//扫描线数据在32位边界上对齐。返回数据是常量,不进行深度复制
QImage img3 = img2.convertToFormat(QImage::Format_ARGB32, rgbTable, Qt::AutoColor); //使用指定的颜色表返回转换为给定格式的图像副本。
//从RGB格式到索引格式的转换是一个缓慢的操作,将使用直接的最近颜色方法,没有抖动。
//图像用于修改图片的颜色表 并且返回修改后的新的图片 不影响旧的图片
//第三个参数为 Qt::ImageConversionFlags 可选项为:
//Qt::AutoColor 如果图像的深度为1,并且仅包含黑白像素,则pixmap将变为单色
//Qt::ColorOnly pixmap会转换为本机显示深度。
//Qt::MonoOnly pixmap变成单色。
QImage img4 = img2.copy(QRect(10,10,100,50)); //将图像的子区域作为新图像返回。截图函数
//返回的图像是从位置(x(),y()),并且始终具有给定矩形的大小。
//QImage QImage::copy(int x, int y, int width, int height) const
//重载的截图函数 参数不同 意义一样
QImage mask = img2.createMaskFromColor(0xff00008a);//根据给定颜色给图片创建一个遮罩图片
qDebug()<<img2.depth(); //返回图像深度
qDebug()<<img2.devicePixelRatio(); //返回图像的设备像素比。
qDebug()<<img2.dotsPerMeterX(); //获得图片的水平分辨率
qDebug()<<img2.dotsPerMeterY(); //获得图片的垂直分辨率
img2.fill(0xff0000aa); //用给定的像素值填充整个图像
qDebug()<<img2.format(); //返回图像的格式
qDebug()<<QImageReader::supportedImageFormats(); //获得可能的图片格式
//该函数返回 ("bmp", "cur", "gif", "icns", "ico", "jpeg", "jpg", "pbm", "pgm", "png", "ppm", "svg", "svgz", "tga", "tif", "tiff", "wbmp", "webp", "xbm", "xpm")
QImage img5 = img2.fromData(consstart,100,"jpg"); //从给定二进制数据的第一个大小字节构造一个QImage。
//加载程序尝试使用指定的格式读取图像。
//如果未指定格式(这是默认设置),加载程序将探测数据的头,以猜测文件格式。
//指定的格式字符串必须是supportedImageFormats()函数的返回值之一
//[static] QImage QImage::fromData(const QByteArray &data, const char *format = nullptr) 使用数据流作为参数的重载
qDebug()<<img2.hasAlphaChannel(); //如果图像的格式符合alpha通道,则返回true,否则返回false。
qDebug()<< img2.height(); //返回图像的高度
img2.invertPixels(QImage::InvertRgb); //图像像素反转 指的是RGB 变成255-R,255-G,255-B
//参数可选有QImage::InvertRgb 仅反转RGB值,保持alpha通道不变
//QImage::InvertRgba 反转所有通道,包括阿尔法通道
img2.isGrayscale(); //对于32位图像,此函数相当于allGray()。
img2.isNull(); //如果是空图像,则返回true
QImage img7 = QImage();
qDebug()<<img7.load("D://test.png","png"); //从磁盘上加载图片
//如果没有第二个参数,那么系统根据图片后缀自动设置类型
//如果有第二个参数,那么根据参数设置图片类型
//第二个参数的可选字符串和fromData()的第三个参数一样
qDebug()<<img7.loadFromData(consstart, 100, "jpg");//同fromData函数
//bool QImage::loadFromData(const QByteArray &data, const char *format = nullptr) 数据流格式的重载
qDebug()<<img7.offset(); //返回图像相对于其他图像定位时要偏移的像素数。
qDebug()<<img7.pixel(QPoint(15,15)); //返回给定位置的像素颜色。找寻多个像素点,函数消耗将会非常大
//QRgb QImage::pixel(int x, int y) const 参数为 x,y的重载
QColor rl = img7.pixelColor(QPoint(15,15)); //返回给定位置的颜色对象。
//QColor QImage::pixelColor(int x, int y) const 参数为x,y点重载
qDebug()<<img7.pixelIndex(15,15); //返回给定位置的像素索引。
//int QImage::pixelIndex(const QPoint &position) const 参数为QPoint的重载
qDebug()<<img7.rect(); //返回图像的矩形对象
qDebug()<<img7.reinterpretAsFormat(QImage::Format_RGB32);//在不更改数据的情况下更改图像的格式。
//只能在相同深度的格式之间工作。
qDebug()<<img7.save("D://newtest.jpg","jpg"); //使用给定的文件名和格式保存图片
QImage img8 = img7.rgbSwapped(); //返回一个QImage,其中所有像素的红色和蓝色分量的值都已交换,从而有效地将RGB图像转换为BGR图像。
QImage img9 = img8.scaled(QSize(200,50), Qt::IgnoreAspectRatio,Qt::FastTransformation); //缩放控制函数
//参数1设置预期放大后的尺寸
//参数2设置放大模式 Qt::IgnoreAspectRatio 忽视纵横比 调整为设置的大小
// Qt::KeepAspectRatio 保持纵横比 调整为尽可能大的图像
// Qt::KeepAspectRatioByExpanding 保持纵横比 调整为尽可能小的图像
//参数3设置变换模式 Qt::FastTransformation 变换执行得很快,没有平滑
// Qt::SmoothTransformation 变换执行有过程,比较平滑
QImage img10 = img8.scaledToHeight(150, Qt::FastTransformation); //图像保持纵横比变换图片
//将图像的高度设置为指定值
//如果参数为0,那么图形对象会变成空对象
//QImage QImage::scaledToWidth(int width, Qt::TransformationMode mode = Qt::FastTransformation) const 指定宽度的调整函数
uchar* starLine = img10.scanLine(0); //返回索引为i的扫描线处的像素数据指针。第一条扫描线位于索引0处。
//const uchar *QImage::scanLine(int i) const 返回常量的重载
img2.setColor(1, 0xff0000aa); //将颜色表中给定索引处的颜色设置为给定的to colorValue。
img2.setColorCount(150); //调整颜色表的大小为 指定个条目。多余的以QColor(0,0,0,0)即透明设置
img2.setDevicePixelRatio(1); //设置图像的设备像素比率。默认的scaleFactor为1.0。
img2.setDotsPerMeterX(100); //设置水平分辨率
img2.setDotsPerMeterY(100); //设置垂直分辨率
img2.setOffset(QPoint(10,10)); //将图像相对于其他图像定位时要偏移的像素数设置为偏移。
img2.setPixelColor(QPoint(20,20), QColor(111,111,111)); //将给定位置的颜色设置为指定颜色
img2.setText("时间","2022.3.26"); //将图像文本设置为给定文本,并将其与给定键关联。
//如果只想存储单个文本块(即“注释”或描述),可以传递空键,或使用“description”之类的通用键。
qDebug()<<img2.size(); //返回尺寸
qDebug()<<img2.sizeInBytes(); //返回图片大小的字节数
img2.swap(img7); //使用此图像交换其他图像。这个操作非常快,从来不会失败。
qDebug()<<img2.text("时间"); //返回与给定键关联的图像文本。如果指定的键是空字符串,则返回整个图像文本,每个键文本对之间用换行符分隔。
qDebug()<<img2.textKeys(); //返回所有的键列表
qDebug()<<img2.valid(14,14); //如果pos是图像中的有效坐标对,则返回true;否则返回false
qDebug()<<img2.width(); //返回图像宽度
}
MainWindow::~MainWindow()
{
delete ui;
}
QImage方法功能(QT5.12)
最新推荐文章于 2024-04-27 16:49:54 发布