Qt 检查QImage是否具有alpha通道

Qt 检查QImage是否具有alpha通道,qt,Qt,我想知道我加载的QImage是否包含alpha通道。我已经知道QImage::hasAlphaChannel()可以告诉我我使用的图像格式是否支持alpha通道,但是有没有办法知道它是否在加载的图像中实际使用?如果加载的QImage格式有alpha通道,那么您的QImage就有alpha通道 如果您要检查具有alpha通道的图像中的任何像素是否实际将任何像素设置为不透明以外的内容,您可以尝试使用QImage::createAlphaMask()生成alpha遮罩并检查其像素值。这里有我的片段,用

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

如果加载的
QImage
格式有alpha通道,那么您的
QImage
就有alpha通道


如果您要检查具有alpha通道的图像中的任何像素是否实际将任何像素设置为不透明以外的内容,您可以尝试使用
QImage::createAlphaMask()
生成alpha遮罩并检查其像素值。

这里有我的片段,用于检查alpha是否真的被使用。当图像处于打开状态时,它很有用

bool-useAlpha=false;
常量uchar*pixelData=image.bits();
int bytes=image.byteCount();
对于(常量QRgb*pixel=reinterpret_cast(pixelData);字节>0;pixel++,bytes-=sizeof(QRgb)){
如果(qAlpha(*像素)!=UCHAR\u MAX){
useAlpha=真;
打破
}
}

还要记住,有方法。

你说的“使用”是什么意思?至少有一个像素的alpha与不透明不同?@vines是的,这就是我的意思。在此处添加不合理的开销。IOW:没有理由创建另一个QImage只是为了检查其内容,因为您可以在原始图像中执行此操作。重要的是,这种方法产生的图像是1bpp,因此会丢失信息。我已经读到,您应该尽可能使用
static\u cast
而不是
reinterpret\u cast
。我的编译器不允许我在此上下文中使用
static\u cast
。您能解释一下在这种情况下使用的是什么
reinterpret\u cast
,以及为什么
static\u cast
不起作用吗?@Pieter(
unsigned int
)与uchar(
unsigned char
)的类型不同,因此指针不兼容
static_cast
仅对相关类型(如类及其子类)有用。支票:。返回指向第一个像素数据的指针,正如我前面所说的,我假设图像是32bpp格式的,所以转换为QRgb*是安全的,并且实际上是必需的,正如描述所解释的。
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;
    }
}