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/