這學期學數圖,作業需要做界面,於是開始學習Qt。
QRgb
Qt中,QRgb是unsigned int的別名
Qt中用一個unsigned int存儲像素值,格式爲0xFFRRGGBB
可以使用函數來方便地構造像素值
qDebug() << hex <<qRgb(0, 0, 0) << '\n';
輸出爲0xff000000
QImage
QImage類有三種修改像素值的方法
0、setPixel()
函數聲明:void setPixel(int i, int j, qRgb rgb)
直接填入行列像素值即可
但用此函數修改大量像素值的效率必然是極低的
1、scanLine()
函數聲明: unsigned char *scanLine(int i)
i爲行號,從0開始
返回值爲第i行第一個字節的地址
實際使用時可以把返回值強制類型轉換爲,通過qRgb函數進行賦值
2、bits()
直接返回圖像第一個字節的地址
用法與scanLine類似
一開始考慮到字節對齊,我是這樣寫的
QImage img(fileName);
int r = 30, ox = 50, oy = 50;
QRgb *pixs = (QRgb*)img.bits();
int W = (img.width() + 3) / 4 * 4;
pixs[i * W + j] = qRgb(0, 0, 0);
但輸出的圖像上的像素位置不對,把W改爲img.width()後位置正確
我的猜測:QImage中的像素是按行存儲的,並沒有存儲字節對齊的部分。