分析QImage::Format_ARGB32的内存排列
在利用Qt开发界面时,不可避免的用到qimage.其中QImage::Format_ARGB32是一种常见的格式。顾名思义,每个像素有四个分量:alpha red green blue.但是其内部如何安排各个分量的次序呢?这里先给出答案:其实次序是(从左到右)BGRA.下面做几个实验验证。先利用photoshop生成一个8乘8的bmp文件,文件左下角的两个像素涂灰,其他位置留白。现在用qt读取这个
·
在利用Qt开发界面时,不可避免的用到qimage.其中QImage::Format_ARGB32是一种常见的格式。顾名思义,每个像素有四个分量:alpha red green blue.但是其内部如何安排各个分量的次序呢?这里先给出答案:其实次序是(从左到右)BGRA.下面做几个实验验证。
先利用photoshop生成一个8乘8的bmp文件,文件左下角的两个像素涂灰,其他位置留白。
现在用qt读取这个文件,并载入QImage::Format_ARGB32格式的QImage.
#include "mainwindow.h"
#include <QPainter>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
QImage img("C:\\1.bmp");
m_img = QImage(8,8,QImage::Format_ARGB32);
QPainter qp;
qp.begin(&m_img);
qp.drawImage(m_img.rect(), img, img.rect());
qp.end();
}
MainWindow::~MainWindow()
{
}
void MainWindow::paintEvent(QPaintEvent *e)
{
unsigned char * pData = m_img.bits();//BGRA,且图片的第一行就是内存的第一行
pData[8 * 4 * 7 + 4 + 0] = 255;
//pData[8 * 4 * 7 + 4 + 2] = 255;
QPainter qp;
qp.begin(this);
qp.drawImage(rect(), m_img, m_img.rect());
qp.end();
}
在不对qimage的内存做任何编辑的情况下,这两个像素的内容为:4a 49 49 ff
接下来对最下一行的左起第二个像素进行编辑。
1)修改第一个分量至饱和255:
可见,像素变蓝,说明第一个分量是蓝色。
2) 修改第2个分量至饱和255:
第二个像素变绿,说明是绿色分量
3) 修改第3个分量至饱和255:
说明第三个分量是红色
4)剩下的第四个分量是alpha通道
更多推荐
所有评论(0)