Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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++ QT QImage,如何提取RGB?_C++_Qt_Qimage - Fatal编程技术网

C++ QT QImage,如何提取RGB?

C++ QT QImage,如何提取RGB?,c++,qt,qimage,C++,Qt,Qimage,我想从QImage中的每个像素中提取RGB。理想情况下,我希望使用img.bits()函数 QImage img; if( img.load("Red.jpg") ) { uchar *bits = img.bits(); for (int i = 0; i < 12; i++) { std::cout << (int) bits[i] << std::endl; } } QImage-img; 如果(img.l

我想从QImage中的每个像素中提取RGB。理想情况下,我希望使用img.bits()函数

QImage img;

if( img.load("Red.jpg") )
{
    uchar *bits = img.bits();

    for (int i = 0; i < 12; i++)
    {
        std::cout << (int) bits[i] << std::endl;
    }
}
QImage-img;
如果(img.load(“Red.jpg”))
{
uchar*bits=img.bits();
对于(int i=0;i<12;i++)
{
标准::cout说:

返回指向第一个像素数据的指针。这相当于扫描线(0)

如果你查一下

如果要访问32 bpp图像数据,请将返回的指针强制转换为QRgb*(QRgb的大小为32位),并使用它读取/写入像素值。不能直接使用uchar*指针,因为像素格式取决于基础平台上的字节顺序。请使用qRed()、qGreen()、qBlue()和qAlpha()访问像素

另一个选择可能是成员函数

QImage img;

if( img.load("Red.jpg") )
{
    uchar *bits = img.bits();

    for (int i = 0; i < 12; i++)
    {
        std::cout << (int) bits[i] << std::endl;
    }
}
希望有帮助。

QImage img(“Red.jpg”);
QImage img( "Red.jpg" );

if ( false == img.isNull() )
{
    QVector<QRgb> v = img.colorTable(); // returns a list of colors contained in the image's color table.

    for ( QVector<QRgb>::const_iterator it = v.begin(), itE = v.end(); it != itE; ++it )
    {
        QColor clrCurrent( *it );
        std::cout << "Red: " << clrCurrent.red()
                  << " Green: " << clrCurrent.green()
                  << " Blue: " << clrCurrent.blue()
                  << " Alpha: " << clrCurrent.alpha()
                  << std::endl;
    }
}
if(false==img.isNull()) { QVector v=img.colorTable();//返回图像颜色表中包含的颜色列表。 对于(QVector::const_迭代器it=v.begin(),itE=v.end();it!=itE;++it) { QColor CLR电流(*it);
std::cout使用bits()函数的一个问题是,您需要知道原始图像的颜色。您应该使用将其转换为RGB

现在,当您调用bits()时,数据将采用RGB格式,并具有正确的数据对齐方式

uchar *bits = img.bits();

for (int i = 0; i < (img.width() * img.height() * 3); i++)
{
    std::cout << (int) bits[i] << std::endl;
}
uchar*bits=img.bits();
对于(int i=0;i<(img.width()*img.height()*3);i++)
{

Qt 5.6中引入了std::cout方法
QColor QImage::pixelColor(int x,int y)
方法,因此您可以直接从图像像素获取颜色信息。

使用
bits()进行读取。
很大程度上取决于图像格式。请尝试将格式转换为更适合您场景的格式,例如
img=img.convert(QImage::Format_ARGB32)
。然后字节应显示为
0,255,0,0,[loop]
如果我没弄错的话。为什么从行=1开始,而不是从行=0开始?因为我记得图像或pixmap从1开始索引,而不是从0开始。可能弄错了。你试过了吗?从0开始还是什么?在QT5上试过。
应该在0到宽度-1/高度-1的范围内。而且你还弄错了
宽度()
height()
在for循环中。Qt文档说明
QImage::pixel()
/
setPixel()
速度较慢。如果您计划处理大量像素,建议您使用
bits()
scanLine()
(及其各自的常量版本)。仅供参考:您可以强制转换img.bits()指向类型为
QRgb
的指针。因此您不需要知道图像的类型。只需迭代每个像素,然后使用qRed()、qGreen()、qBlue…等等on@501-未实现如何强制转换?我正在尝试
const QRgb*rawPixelData=static_强制转换(pixelSource.constBits())
但显然这是一个无效的静态转换…嗨@Troyseph,你可以使用
QRgb*rawPixelData=(QRgb*)(pixelSource.bits())
而不使用静态转换。@501未实现的C样式转换…gross=P这不就是重新解释转换吗?它必须是重新解释转换。所以使用C样式转换!
uchar *bits = img.bits();

for (int i = 0; i < (img.width() * img.height() * 3); i++)
{
    std::cout << (int) bits[i] << std::endl;
}