Image 从RGB32和索引类型图像获取图像颜色信息

Image 从RGB32和索引类型图像获取图像颜色信息,image,qt,colors,pixel,scanline,Image,Qt,Colors,Pixel,Scanline,我正在尝试访问QImage中的图像颜色 我在文档中找到最多的方法是基于扫描线函数 我试过了,成功了。。。在RGB32图像上。当使用精确的方法获取8位索引或单色图像的颜色数据时,我得到了令人惊讶和不愉快的结果 这是我的密码: // note RGBTriple is a struct containing unsigned R, G, B // rgbImage.pixels is a RGBTriple* array RGBTriple* pTriple = rgbImage.pixels;

我正在尝试访问QImage中的图像颜色

我在文档中找到最多的方法是基于扫描线函数

我试过了,成功了。。。在RGB32图像上。当使用精确的方法获取8位索引或单色图像的颜色数据时,我得到了令人惊讶和不愉快的结果

这是我的密码:

// note RGBTriple is a struct containing unsigned R, G, B
// rgbImage.pixels is a RGBTriple* array

RGBTriple* pTriple = rgbImage.pixels;
for (int y = 0; y < source.height(); y++)
{
    const unsigned char* pScanLine = source.scanLine(y);
    for (int x = 0; x < source.width(); x++)
    {
         QRgb* color = (QRgb*)pScanLine;
         pTriple->R = qRed(*color);
         pTriple->G = qGreen(*color);
         pTriple->B = qBlue(*color);
         ++pTriple;
         pScanLine += 4;
    }
}
//注意RGBTriple是一个包含无符号R、G、B的结构
//rgbImage.pixels是一个RGBTriple*数组
RGBTriple*pTriple=rgbImage.pixels;
对于(int y=0;yR=qRed(*颜色);
pTriple->G=qGreen(*颜色);
pTriple->B=qBlue(*颜色);
++pTriple;
pScanLine+=4;
}
}
使用8位索引或单色图像运行相同的代码时,我在创建和获取颜色时出错。文件上说扫描线是32b的倍数,但既然是8和2的倍数,我认为这不会有问题

一旦我发现我没有得到所有类型输入图像的正确结果,我将其更改为

RGBTriple* pTriple = rgbImage.pixels;
for (int y = 0; y < source.height(); y++)
{
    for (int x = 0; x < source.width(); x++)
    {
        pTriple->R = qRed(source.pixel(x, y));
        pTriple->G = qGreen(source.pixel(x, y));
        pTriple->B = qBlue(source.pixel(x, y));
        ++pTriple;
    }
}
RGBTriple*pTriple=rgbImage.pixels;
对于(int y=0;yR=qRed(源像素(x,y));
pTriple->G=qGreen(源像素(x,y));
pTriple->B=qBlue(源像素(x,y));
++pTriple;
}
}
工作完美。。。我想知道它是慢了还是会有其他意想不到的行为?毕竟,我正在使用pixel()函数——甚至在索引图像上——来获取颜色信息,这些信息实际上应该以不同的方式存储。。。看来它应该失败了

有没有办法让第一个版本,使用扫描线,适用于其他类型的图像

为什么使用扫描线获取数据似乎是首选方法

我试过了,成功了。。。在RGB32图像上。我吃了一顿令人惊讶的晚餐 当使用精确方法获取8的颜色数据时,会产生令人不快的结果 位索引或单色图像

您不应该感到惊讶,因为索引图像和单色图像的格式不同。您发布的第一个代码片段基于有关
RGB32
(仅限
RGB32
)如何在内存中布局的知识

想想看。在单色图像中
R=G=B
。因此,只需在内存中保存一个通道

如果您的目标是在
rgbImage.pixels
内获得rgb图像,请使用:


rgbImage.pixels的内容是什么?它会变成一个无符号字符*的am数组,每种颜色有一个字符-大小是字节数的3倍吗?是的,它是一个arrawy rgbrgbrgb。。。。其中每种颜色都是一个无符号字符。rgb24的dest.byteCount已为3*宽*高字节长。我希望rgbImage.pixels大小相同。关于“较慢”,至少只调用
pixel
一次,并将返回值存储到一个临时变量。。。
QImage source;
QImage dest =  source.convertToFormat( QImage::Format_RGB888 );
memcpy(rgbImage.pixels, dest.bits(),dest.byteCount () );