zoukankan      html  css  js  c++  java
  • QImage学习学习

    QImage这个类之前用过,无外乎是加载一个图片文件显示出来,并没有做过多的研究,目前工作中用到了灰度图以及图片的像素操作,重新学习了下,记录记录。

    一些基本操作方法

    • 获取图像的首地址:
      const uchar *QImage::bits() const
      
    • 获取图像的总字节数
      int QImage::byteCount() const
      
    • 获取图像每行字节数
      int QImage::bytesPerLine() const  
      还可以这样计算(图像宽度,img.depth是图图像深度):
      int bytePerLine = (width * img.depth()  +  31) / 32 * 4;
      
    • 存入图像,格式为R,G,B,A(0,1,2,3)
      QImage::Format_RGB32
      
    • 存入图像,格式为R,G,B(0,1,2)
      QImage::Format_RGB888
      
    • 存入图像,此时需要设定一张颜色表QVector<QRgb>,如下
      QImage::Format_Indexed8  
      灰度颜色表:
      QVector<QRgb> vtrColor;
      for(int k = 0;k < 256;++k)
      {`
        vtrColor.push_back( qRgb(k,k,k) );
      }
      

    相关概念

    灰度图

    普通彩色图片中每个像素中有R、G、B三个分量,而每个分量有256种(0~255)值可以选择,这样一个像素点就可以有1600多万(255255255)的颜色变化范围。

    而灰度图就是R、G、B三分分量的值相同的一种特殊彩色图像。即R=G=B.

    位深

    位深是指存储每个像素所用的位数.

    如上面介绍的QImage方法,img.depth(),该方法可以返回当前图像的位深.

    ##处理算法

    • 常规处理
    unsigned char *grayData;
        QImage img;
        img.load (m_strPath+"/2.jpg");
    
        QPixmap pixmap(QPixmap::fromImage (img));
    
        ui->label->setPixmap (pixmap);
    
        unsigned char *data = img.bits ();
    
        int w = img.width ();
        int h = img.height ();
    
        int bytePerLine = (w * 24 + 31) / 8;
        //存储处理后的数据
        grayData = new unsigned char [bytePerLine * h];
        unsigned char r,g,b;
        for ( int i = 0; i < h; i++ )
        {
            for ( int j = 0; j < w; j++ )
            {
                r =  *(data + 2);
                g = *(data + 1);
                b = *data;
    
                grayData[i * bytePerLine + j * 3] = (r * 30 + g*59 +b*11)/100;
                grayData[i*bytePerLine+j*3+1]=(r*30+g*59+b*11)/100;
                grayData[i*bytePerLine+j*3+2]=(r*30+g*59+b*11)/100;
    
                data+=4;
    
                //ui->textEdit->append (QString("%1 %2 %3").arg (r).arg (g).arg (b));
            }
        }
    
        QImage grayImage(grayData,w,h,bytePerLine,QImage::Format_RGB888);
    
        QPixmap pixmap2(QPixmap::fromImage (grayImage));
    
        ui->label_2->setPixmap (pixmap2);
    
    

    http://kevinlq.com/2017/11/14/QImage-learn/

  • 相关阅读:
    阿里的面试官都喜欢问哪些问题?
    Spring AOP中的JDK和CGLib动态代理哪个效率更高?
    招聘季!送你21套经典面试题!助你一臂之力!
    Spring AOP中的JDK和CGLib动态代理哪个效率更高?
    为什么需要分布式配置中心?
    线上出故障了!我慌得一匹!教大家如何应对在线故障!
    阿里巴巴的26款超神Java开源项目!
    完了!生产事故!几百万消息在消息队列里积压了几个小时!
    十大经典排序算法(动图演示)
    用户画像学习笔记
  • 原文地址:https://www.cnblogs.com/findumars/p/8197080.html
Copyright © 2011-2022 走看看