Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QImage::pixel函数的10位数输出具体是什么意思?_C++_Image_Colors_Qt5_Pixel - Fatal编程技术网

C++ QImage::pixel函数的10位数输出具体是什么意思?

C++ QImage::pixel函数的10位数输出具体是什么意思?,c++,image,colors,qt5,pixel,C++,Image,Colors,Qt5,Pixel,我目前正在使用Qt5.12.3,在理解QImage::pixel函数的10位输出时遇到问题。对于此代码: QImage image; image.load("D:/qtProjects/../image.png", "PNG"); for(int i = 0 ; i < 1920; i++) for(int j = 0; j < 1080; j++) std:: cout << image.pixel(i, j) <<

我目前正在使用Qt5.12.3,在理解QImage::pixel函数的10位输出时遇到问题。对于此代码:

QImage image;
image.load("D:/qtProjects/../image.png", "PNG");

for(int i = 0 ; i < 1920; i++)
        for(int j = 0; j < 1080; j++)
            std:: cout << image.pixel(i, j) << "\n";
QImage图像;
image.load(“D:/qtProjects/./image.png”、“png”);
对于(int i=0;i<1920;i++)
对于(int j=0;j<1080;j++)

std::cout这些数字是4个颜色分量(红色、绿色、蓝色和alpha,每个分量8位,不一定按该顺序排列),压缩为32位无符号整数

要提取这些组件,本质上需要提取组成4字节整数的所有字节的值。要做到这一点,有几种方法,但最容易理解的可能是:连续除以256

由于每个字节的值都在[0..255]范围内,因此每次计算该大数字除以256后的剩余部分时,您将提取1个字节的信息(将一个字节视为基256位)

下面是代码:

unsigned char b0 = x % 256;
x = x / 256;
unsigned char b1 = x % 256;
x = x / 256;
unsigned char b2 = x % 256;
x = x / 256;
unsigned char b3 = x % 256;
在上述代码中,
b0
将接收
x
中最低有效字节的值,
b3
将接收最高有效字节的值。它们中的哪一个将是哪一个组件将取决于颜色组件的顺序(无论是RGBA、BGRA、ARGB还是ABGR),并且很可能还取决于机器的端部。但我认为这很容易弄明白


考虑到您发布的样本编号的外观,我认为编号中最重要的字节是alpha通道(即我代码中的
b3
为您提供alpha值,),这可能会使
b0
变为红色,
b1
变为绿色,
b2
变为蓝色。可能吧。

为了使图像处理更容易,您可以使用类
QColor
。与其他许多Qt类一样,您可以使用
qDebug()
将其输出到控制台。您需要包含
才能使用它。下面是如何将
QColor
QImage
一起使用的示例:

QImage image;
image.load("D:/qtProjects/../image.png", "PNG");

QColor colorRead(image.pixel(0, 0));    // get color of pixel 0,0
qDebug() << colorRead;                  // output color with float values 0 - 1
qDebug() << "R: " << colorRead.red();   // output components of color as int 0 - 255
qDebug() << "G: " << colorRead.green();
qDebug() << "B: " << colorRead.blue();
qDebug() << "A: " << colorRead.alpha();

QColor colorWrite(0, 0, 255);           // instantiate other color
image.setPixelColor(0, 0, colorWrite);  // set pixel 0,0 to the color

将数字转换为十六进制。一切都会揭晓!好的,会有消息的。线索:FF可能是“不透明的”,它的RGBA表示为32位无符号整数。用十六进制打印:write
cout Decimal是一个非常糟糕的打印RGBA值的基础。谢谢大家的帮助!谢谢你给我一个非常具体的答案,非常适合我使用。谢谢你的帮助!发现QImage::pixel以AARGGBB格式返回像素统计信息。在看到这两种数字格式后,我很清楚2^32-1是一个10位数的十进制数,而8位数的十六进制数(FFFFFFFF)->32位是正确表示任何ARGB统计数据所必需的,正如您所说的。
QColor(ARGB 1, 0.305882, 0.305882, 0.211765)
R:  78
G:  78
B:  54
A:  255