检查QImage是否具有Alpha通道

3

我想知道一个已加载的QImage是否包含alpha通道。我已经知道QImage::hasAlphaChannel()可以告诉我正在使用的图像格式是否支持alpha通道,但是有没有办法知道它是否实际上在加载的图像中使用?


2
“used”是什么意思?至少有一个像素的alpha通道不是不透明的吗? - vines
@vines 是的,那就是我想表达的意思。 - Pieter
2个回答

4

这里是检查 alpha 是否真正被使用的代码片段。当图像在 ARGB32 格式时非常有用。

bool useAlpha = false;
const uchar* pixelData = image.bits();
int bytes = image.byteCount();

for (const QRgb* pixel = reinterpret_cast<const QRgb*>(pixelData); bytes > 0; pixel++, bytes -= sizeof(QRgb)) {
    if (qAlpha(*pixel) != UCHAR_MAX) {
        useAlpha = true;
        break;
    }
}

还要记住,这里有一个format()方法。


据我所知,应该尽可能使用 static_cast 而不是 reinterpret_cast。但是我的编译器在这种情况下不允许我使用 static_cast。您能否解释一下在这种情况下 reinterpret_cast 的用途以及为什么 static_cast 无法使用? - Pieter
@Pieter QRgbunsigned int)是与uchar(unsigned char)不同的类型,因此指针不兼容。 static_cast仅适用于相关类型(例如类及其子类)。请参阅:http://www.cplusplus.com/doc/tutorial/typecasting/。[bits()](http://doc.qt.nokia.com/4.7/qimage.html#bits)返回指向第一个像素数据的指针,并且如我之前所说,我假设图像以32bpp格式存在,因此将其转换为QRgb*是安全的,实际上是必需的,因为[scanline()](http://doc.qt.nokia.com/4.7/qimage.html#scanLine)的描述已经解释了这一点。 - przemoc

1
如果您加载 QImage 的格式具有 Alpha 通道,则您的 QImage 将具有 Alpha 通道。
如果您想检查具有 Alpha 通道的图像中是否存在任何像素实际上将任何像素设置为不透明,请尝试使用 QImage::createAlphaMask() 生成 Alpha 掩码并检查其像素值。

1
createAlphaMask() 在这里增加了无法被证明的开销。换句话说:没有必要创建另一个 QImage 来检查其内容,因为您可以在原始图像中进行检查。此方法生成的图像是 1bpp 的,因此存在信息损失。 - przemoc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接