• 图像处理 QImage


    在Qt中有四种处理图像的方法:

    • QImage  :使用I/O ,可以对像素进行处理
    • QPixmap:主要用在屏幕的显示
    • QBitmap: QPixmap的子类,处理颜色深度,只能显示黑白两种颜色,用于遮罩
    • QPicture:用来重演QPainter命令

    QPainter绘制图像的方法:

    • QPainter::drawImage()    绘制Image
    • QPainter::drawPixmap()  绘制Pixmap
    • QPainter::drawPixmap()  绘制Bitmap
    • QPainter::drawPicture()   绘制Picture

    QImage

    • QImage 类提供独立于硬件的图像表示形式,允许直接访问像素数据,并可用作绘画设备
    • QImage是QPaintDevice的子类,所以QPainter可以直接在图像上绘制。在 QImage 上使用Qpainter时,可以在当前 GUI 线程以外的其他线程中执行绘制。
    • QImage 对象可以按值传递,因为 QImage 类使用隐式数据共享。Qmage对象也可以流式传输和比较。

    Qt中支持的图像格式:

    格式支持的操作
    BMP读/写
    GIF
    JPG读/写
    JPEG读/写
    PNG读/写
    PBM
    PGM
    PPM读/写
    XBM读/写
    XPM读/写

    QImage::Format

    有几十种图像格式,可以去查看官方文档。

    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.直接设置颜色

    1. QImage image(3,3,QImage::Format_Indexed8);
    2. //直接设置像素点位颜色
    3. image.setPixel(0,0,qRgb(0,255,255));
    4. image.setPixel(0,1,qRgb(255,0,255));
    5. image.setPixel(0,2,qRgb(255,255,0));

    2.通过setColor()存储颜色然后再添加

    setColor()会存储索引处的颜色

    1. QImage image(3,3,QImage::Format_Indexed8);
    2. //直接设置像素点位颜色
    3. image.setColor(0,qRgb(0,255,255));//索引0对应的元素为qRgb(0,255,255)
    4. image.setColor(1,qRgb(255,0,255));//索引1对应的元素为qRgb(255,0,255)
    5. image.setColor(2,qRgb(255,255,0));//索引2对应的元素为qRgb(255,255,0)
    6. //设置颜色
    7. image.setPixel(0,0,0);
    8. image.setPixel(0,1,1);
    9. image.setPixel(0,2,2);

    遍历像素 :

    1.直接遍历

    1. QImage image(10,10,QImage::Format_Indexed8);
    2. //遍历像素
    3. for(int x=0;x<image.width();x++)
    4. {
    5. for(int y=0;y<image.height();y++)
    6. {
    7. image.setPixel(x,y,qRgb(100,100,100));//把全部像素的颜色修改为qRgb(100,100,100)
    8. }
    9. }

    2.按行遍历

    使用scanLine()获取一行的像素

    • uchar*QImage::scanLine(inti) 返回的是一个指针
    • 访问32bpp 图像数据,请将返回的指针转换为(QRgb具有 32 位大小)并使用它来读取/写入像素值
    • 使用参数时使用qRed()、qGreen()、qBlue()和qAlpha() 访问像素
    1. QImage image(10,10,QImage::Format_RGB32);
    2. //遍历像素
    3. //读取行
    4. for(int y=0;y<image.height();y++)
    5. {
    6. QRgb* line=(QRgb *)image.scanLine(y);//读取行
    7. for(int x=0;x<image.height();x++)
    8. {
    9. //遍历像素颜色
    10. qDebug()<<qRed(line[x]);
    11. qDebug()<<qGreen(line[x]);
    12. qDebug()<<qBlue(line[x]);
    13. }
    14. }

    实例的话请看点击以下链接:

     基于Qt的图像处理技术和算法_拳四郎的博客-CSDN博客_qt 滤波

    一些其他的函数:

    allGray()判断颜色是灰色阴影(红绿蓝相同)
    colorTable()返回图像中的颜色表
    depth()返回图像的深度
    fill()给定颜色填充整个像素
    invertPixels()反转图像的像素值
    load()读取设备的图像
    save()保存图像
    scaled()缩放
    setText()将图像文本设置为给定文本,并将其与给定关联
    valid判断点位是否在图像上

    打开或保存图片:load  save

    1. QImage image(10,10,QImage::Format_RGB32);
    2. image.load("D:/Qt_Android_work/data_082/456.png");//打开图像文件
    3. image.save("D:/123.png0");//保存图像文件

    fill填充的使用:

    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. QPainter painter(this);
    4. QImage image(100,100,QImage::Format_RGB32);
    5. image.fill(qRgb(200,200,200));//填充
    6. painter.drawImage(0,0,image);
    7. }

     缩放的使用:

    •  该函数返回的是一个副本
    • size() 为图像大小
    • 后面的参数为设置纵横比

     

    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. QPainter painter(this);
    4. QImage image(100,100,QImage::Format_RGB32);
    5. image.fill(qRgb(200,200,200));//填充
    6. image=image.scaled(image.width()*5,image.height()*5);//放大5
    7. painter.drawImage(0,0,image);
    8. }


    QImage可以用来绘图

    QImage 也可以作为设备进行绘图

    1. void Widget::paintEvent(QPaintEvent *event)
    2. {
    3. QPainter painter;
    4. QImage image(200,200,QImage::Format_ARGB32);
    5. painter.begin(&image);
    6. painter.setPen(QPen(Qt::red,3));
    7. painter.setBrush(Qt::cyan);
    8. painter.drawRect(0,0,100,100);
    9. painter.drawEllipse(100,100,100,100);
    10. painter.end();
    11. painter.begin(this);
    12. painter.drawImage(0,0,image);//绘制
    13. }

     

  • 相关阅读:
    【JavaSE】Java基础语法(二十四):时间日期类
    计算机组成原理知识总结(四)指令系统
    7、乐趣国学—趣谈“圣贤”
    自定义组件 - Message 消息提示
    29.4K star! 仅需几行代码快速构建机器学习 Web 应用项目,无需前端技能!
    AV1 视频编码标准资源
    使用 Kubeadm 部署 Kubernetes(K8S) 安装
    狂神说-Springcloud笔记
    day5:Node.js 第三方库
    关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?
  • 原文地址:https://blog.csdn.net/qq_45303986/article/details/128021368