Image 确定图像是否具有alpha通道的最佳方法是什么?

Image 确定图像是否具有alpha通道的最佳方法是什么?,image,go,alpha,Image,Go,Alpha,我需要决定一个图像是否有alpha通道,所以我这样写代码 var HaveAlpha = func(Image image.Image) bool { switch Image.ColorModel() { case color.YCbCrModel, color.CMYKModel: return false case color.RGBAModel: return !Image.(*image.RGBA).Opaque() }

我需要决定一个图像是否有alpha通道,所以我这样写代码

var HaveAlpha = func(Image image.Image) bool {
    switch Image.ColorModel() {
    case color.YCbCrModel, color.CMYKModel:
        return false
    case color.RGBAModel:
        return !Image.(*image.RGBA).Opaque()
    }
    // ...
    return false
}
因此,我需要列出所有的
ColorModel
类型,并使用
obaque()
来确定图像是否具有alpha通道(因为我不能直接在type
image.image
中使用
obaque()
方法)。如果图像具有alpha通道,但图像中的所有像素都是不透明的(该图像中像素的所有RGBA类似于
(*,*,*,255)
),则该代码可能返回错误答案

是否有正确或更好的方法来确定图像是否在Golang中具有alpha通道?

您可以使用它来检查存储在接口类型中的具体值是否具有
不透明()bool
方法,如果是,只需调用该方法并返回其结果。请注意,包中的所有具体图像类型都有一个
不透明()
方法,因此这将涵盖大多数情况

如果图像没有这样的
不透明()
方法,则在图像的所有像素上循环,并检查是否有任何像素具有除
0xff
以外的alpha值,这意味着它是非不透明的

注意,
Image.At()
有一个通用接口类型的返回类型,它只保证一个方法:
Color.RGBA()
。这个
RGBA()
方法返回alpha预乘的红色、绿色、蓝色和alpha分量,因此如果一个像素具有
0xff
alpha值,那么当“alpha预乘”时,它等于
0xffff
,所以这就是我们需要比较的

func Opaque(im image.Image) bool {
    // Check if image has Opaque() method:
    if oim, ok := im.(interface {
        Opaque() bool
    }); ok {
        return oim.Opaque() // It does, call it and return its result!
    }

    // No Opaque() method, we need to loop through all pixels and check manually:
    rect := im.Bounds()
    for y := rect.Min.Y; y < rect.Max.Y; y++ {
        for x := rect.Min.X; x < rect.Max.X; x++ {
            if _, _, _, a := im.At(x, y).RGBA(); a != 0xffff {
                return false // Found a non-opaque pixel: image is non-opaque
            }
        }

    }
    return true // All pixels are opaque, so is the image
}
func不透明(im image.image)bool{
//检查图像是否具有不透明()方法:
如果是oim,则ok:=im。(接口{
不透明的
});好的{
return oim.Opaque()//确实如此,调用它并返回其结果!
}
//没有不透明()方法,我们需要循环所有像素并手动检查:
rect:=im.Bounds()
对于y:=rect.Min.y;y
如果图像没有alpha通道,或者图像有alpha通道,但所有像素都是不透明的,则上述
Opaque()
函数将返回
true
。当且仅当图像具有alpha通道且至少有1个像素(完全)不透明时,它返回
false


注意:如果一个图像确实有一个
不透明()
方法,您可以确保它考虑了现有像素及其alpha值,因此,例如,也可以像我们上面所做的那样扫描整个图像;但是我们必须以一种通用的方式来实现,而具体图像的
Opaque()
实现可能会更高效(因此强烈建议使用“shipped”
Opaque()
方法(如果可用)。例如,的实现是一个简单的
return true
语句,因为
YCbCr
图像没有alpha通道。

Opaque()方法意味着所有像素alpha都是0xff return true,但使用Opaque()选择图像是否有alpha通道可能会有异常。如果我有一个png,它有alpha通道,所有的像素都是不透明的。或者不必担心这一点?@YurinaShirahane如果图像没有alpha通道,或者它有alpha通道,但所有像素都是不透明的,那么上面的
不透明()
将返回
true
。当且仅当图像具有alpha通道且至少有1个像素(完全)不透明时,它返回false。因此不透明()为:true==“图像没有alpha通道”或“图像具有alpha通道但所有像素都不透明”,false==“图像具有alpha通道且至少有1个像素(完全)不透明”。但我想制作一个HaveAlpha(),即:true==图像有一个alpha通道,不管所有像素是否不透明,false==图像没有alpha通道。!不透明()可以用在HaveAlpha()中,我想在“图像没有alpha通道”和“图像有alpha通道,并且至少有1个像素(完全)不透明”中使用。但当“图像有一个alpha通道,但所有像素都是不透明的”时!不透明()不能在HaveAlpha()中使用。@YurinaShirahane
image.image
界面不强制所有像素具有相同的
color.color
具体类型。
图像
实现可以为一个像素返回
color.RGBA
,为另一个像素返回
color.Gray16
(因为两者都实现
color.color
)。