C++ QT QImage,如何提取RGB?
我想从QImage中的每个像素中提取RGB。理想情况下,我希望使用img.bits()函数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 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;
}