Qt5 QImage像素操作

這學期學數圖,作業需要做界面,於是開始學習Qt。

QRgb

Qt中,QRgb是unsigned int的別名
Qt中用一個unsigned int存儲像素值,格式爲0xFFRRGGBB
可以使用qRgb(intr,intg,intb)qRgb(int r, int g, int b)函數來方便地構造像素值

	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行第一個字節的地址
實際使用時可以把返回值強制類型轉換爲qRgbqRgb*,通過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中的像素是按行存儲的,並沒有存儲字節對齊的部分。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章