QImage學習學習


QImage這個類之前用過,無外乎是加載一個圖片文件顯示出來,並沒有做過多的研究,目前工作中用到了灰度圖以及圖片的像素操作,重新學習了下,記錄記錄。

一些基本操作方法

  • 獲取圖像的首地址:
    const uchar *QImage::bits() const
    
  • 獲取圖像的總字節數
    int QImage::byteCount() const
    
  • 獲取圖像每行字節數
    int QImage::bytesPerLine() const  
    還可以這樣計算(width:圖像寬度,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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM