- QImage :使用I/O ,可以对像素进行处理
- QPixmap:主要用在屏幕的显示
- QBitmap: QPixmap的子类,处理颜色深度,只能显示黑白两种颜色,用于遮罩
- QPicture:用来重演QPainter命令
- QPainter::drawImage() 绘制Image
- QPainter::drawPixmap() 绘制Pixmap
- QPainter::drawPixmap() 绘制Bitmap
- QPainter::drawPicture() 绘制Picture
- QImage 类提供独立于硬件的图像表示形式,允许直接访问像素数据,并可用作绘画设备
- QImage是QPaintDevice的子类,所以QPainter可以直接在图像上绘制。在 QImage 上使用Qpainter时,可以在当前 GUI 线程以外的其他线程中执行绘制。
- QImage 对象可以按值传递,因为 QImage 类使用隐式数据共享。Qmage对象也可以流式传输和比较。
格式 | 支持的操作 |
BMP | 读/写 |
GIF | 读 |
JPG | 读/写 |
JPEG | 读/写 |
PNG | 读/写 |
PBM | 读 |
PGM | 读 |
PPM | 读/写 |
XBM | 读/写 |
XPM | 读/写 |
有几十种图像格式,可以去查看官方文档。
QImage::Format_Invalid | 图像无效。 |
QImage::Format_Indexed8 | 图像使用 8 位索引存储到颜色图中 |
QImage::Format_RGB32 | 图像使用 32 位 RGB 格式 (0xffRRGGBB) 存储 |
QImage::Format_ARGB32 | 图像使用 32 位 ARGB 格式 (0xAARRGGBB) 存储。 |
QImage::Format_RGB16 | 图像使用 16 位 RGB 格式 (5-6-5) 存储。 |
构造函数:有两种
size() | 图片的大小 |
width() | 图片宽度 |
height() | 图片的高度 |
dotsPertMeterX() | 返回在物理计量中水平适合的像素数 |
dotsPertMeterY() | 返回在物理计量中竖直适合的像素数 |
valid() | 判断是否为有效位置 |
offset() | 返回偏移量 |
setPixelColor() | 设置指定坐标的颜色 |
setPixel(position,index_rgb) | 返回给定位置的像素颜色为index_rgb |
setColor() | 设置索引处的颜色 |
setColorCount() | 扩容 |
pixel() | 返回索引处的颜色 QRgb |
pixelColor() | 返回索引处的颜色 QColor |
pixelFromat() | 返回指定位置的格式 |
pixelIndex() | 返回指定位置的索引 |
scanLine() | 返回索引处的像素指针 |
bits() | 返回指向第一个像素数据的指针。这等效于scanLine(0) |
1.直接设置颜色
- QImage image(3,3,QImage::Format_Indexed8);
- //直接设置像素点位颜色
- image.setPixel(0,0,qRgb(0,255,255));
- image.setPixel(0,1,qRgb(255,0,255));
- image.setPixel(0,2,qRgb(255,255,0));
2.通过setColor()存储颜色然后再添加
setColor()会存储索引处的颜色
- QImage image(3,3,QImage::Format_Indexed8);
- //直接设置像素点位颜色
- image.setColor(0,qRgb(0,255,255));//索引0对应的元素为qRgb(0,255,255)
- image.setColor(1,qRgb(255,0,255));//索引1对应的元素为qRgb(255,0,255)
- image.setColor(2,qRgb(255,255,0));//索引2对应的元素为qRgb(255,255,0)
- //设置颜色
- image.setPixel(0,0,0);
- image.setPixel(0,1,1);
- image.setPixel(0,2,2);
1.直接遍历
- QImage image(10,10,QImage::Format_Indexed8);
- //遍历像素
- for(int x=0;x<image.width();x++)
- {
- for(int y=0;y<image.height();y++)
- {
- image.setPixel(x,y,qRgb(100,100,100));//把全部像素的颜色修改为qRgb(100,100,100)
- }
- }
2.按行遍历
使用scanLine()获取一行的像素
- uchar*QImage::scanLine(inti) 返回的是一个指针
- 访问32bpp 图像数据,请将返回的指针转换为(QRgb具有 32 位大小)并使用它来读取/写入像素值
- 使用参数时使用qRed()、qGreen()、qBlue()和qAlpha() 访问像素
- QImage image(10,10,QImage::Format_RGB32);
- //遍历像素
- //读取行
- for(int y=0;y<image.height();y++)
- {
- QRgb* line=(QRgb *)image.scanLine(y);//读取行
- for(int x=0;x<image.height();x++)
- {
- //遍历像素颜色
- qDebug()<<qRed(line[x]);
- qDebug()<<qGreen(line[x]);
- qDebug()<<qBlue(line[x]);
- }
-
- }
实例的话请看点击以下链接:
基于Qt的图像处理技术和算法_拳四郎的博客-CSDN博客_qt 滤波
allGray() | 判断颜色是灰色阴影(红绿蓝相同) |
colorTable() | 返回图像中的颜色表 |
depth() | 返回图像的深度 |
fill() | 给定颜色填充整个像素 |
invertPixels() | 反转图像的像素值 |
load() | 读取设备的图像 |
save() | 保存图像 |
scaled() | 缩放 |
setText() | 将图像文本设置为给定文本,并将其与给定键关联 |
valid | 判断点位是否在图像上 |
- QImage image(10,10,QImage::Format_RGB32);
- image.load("D:/Qt_Android_work/data_082/456.png");//打开图像文件
- image.save("D:/123.png0");//保存图像文件
- void Widget::paintEvent(QPaintEvent *event)
- {
- QPainter painter(this);
- QImage image(100,100,QImage::Format_RGB32);
- image.fill(qRgb(200,200,200));//填充
- painter.drawImage(0,0,image);
- }
- 该函数返回的是一个副本
- size() 为图像大小
- 后面的参数为设置纵横比
- void Widget::paintEvent(QPaintEvent *event)
- {
- QPainter painter(this);
- QImage image(100,100,QImage::Format_RGB32);
- image.fill(qRgb(200,200,200));//填充
- image=image.scaled(image.width()*5,image.height()*5);//放大5倍
- painter.drawImage(0,0,image);
- }
QImage 也可以作为设备进行绘图
- void Widget::paintEvent(QPaintEvent *event)
- {
- QPainter painter;
- QImage image(200,200,QImage::Format_ARGB32);
- painter.begin(&image);
- painter.setPen(QPen(Qt::red,3));
- painter.setBrush(Qt::cyan);
- painter.drawRect(0,0,100,100);
- painter.drawEllipse(100,100,100,100);
- painter.end();
- painter.begin(this);
- painter.drawImage(0,0,image);//绘制
- }