画像がグレイスケールかRGBAかを調べたい


Goのimageで入力された画像がグレイスケールかRGBAかを判定したいです。どのようにすれば実現できるのでしょうか。  
`image.ColorModel()`で判定できるかと考えましたができませんでした。

[code]

    switch img.ColorModel() {
            case color.GrayModel:
                res = make([][][]float32, 1)
                res[0] = make([][]float32, height)
            case color.RGBAModel:
                res = make([][][]float32, 3)
                for i := 0; i < 3; i++ {
                    res[i] = make([][]float32, height)
                }
            case color.RGBA64Model:
                res = make([][][]float32, 3)
                for i := 0; i < 3; i++ {
                    res[i] = make([][]float32, height)
                }
            case color.NRGBAModel:
                fmt.Println("NRGBAModel")
            case color.NRGBA64Model:
                fmt.Println("NRGBA64Model")
            default:
                fmt.Println(img.ColorModel())
            }
    
[/code]

上のようなコードでは動きませんでした。

**追記**  
グレイスケールの画像は上記コードで判定できました。しかし、RGBAのものを判定できませんでした。




問題を再現できるコードにしてください。imgをどうやって作成したのかが重要なのです。  
例えばNewRGBAした結果を入力して意図した結果が出るのか出ないのかというとちゃんと判定できるようです。

<https://play.golang.org/p/wKrgig-J1D>

[code]

    package main
    
    import (
        "fmt"
        "image"
        "image/color"
    )
    
    func ModelName(m image.Image) string {
        switch m.ColorModel() {
        case color.RGBAModel:
            return "rgba"
        case color.RGBA64Model:
            return "rgba64"
        case color.NRGBAModel:
            return "nrgba"
        case color.NRGBA64Model:
            return "nrgba64"
        case color.AlphaModel:
            return "alpha"
        case color.Alpha16Model:
            return "alpha16"
        case color.GrayModel:
            return "gray"
        case color.Gray16Model:
            return "gray16"
        case color.CMYKModel:
            return "cmyk"
        case color.YCbCrModel:
            return "YCbCr"
        }
        if _, ok := m.(image.PalettedImage); ok {
            return "paletted"
        }
        return "unknown"
    }
    
    func main() {
        fmt.Println(ModelName(image.NewRGBA(image.Rect(0, 0, 16, 16))))
        fmt.Println(ModelName(image.NewRGBA64(image.Rect(0, 0, 16, 16))))
        fmt.Println(ModelName(image.NewAlpha(image.Rect(0, 0, 16, 16))))
        fmt.Println(ModelName(image.NewAlpha16(image.Rect(0, 0, 16, 16))))
        fmt.Println(ModelName(image.NewCMYK(image.Rect(0, 0, 16, 16))))
        fmt.Println(ModelName(image.NewGray(image.Rect(0, 0, 16, 16))))
        fmt.Println(ModelName(image.NewGray16(image.Rect(0, 0, 16, 16))))
        fmt.Println(ModelName(image.NewNRGBA(image.Rect(0, 0, 16, 16))))
        fmt.Println(ModelName(image.NewNRGBA64(image.Rect(0, 0, 16, 16))))
        fmt.Println(ModelName(image.NewPaletted(image.Rect(0, 0, 16, 16), nil)))
        fmt.Println(ModelName(image.NewYCbCr(image.Rect(0, 0, 16, 16), image.YCbCrSubsampleRatio422)))
    }
    
[/code]




問題を再現できるコードにしてください。imgをどうやって作成したのかが重要なのです。  
例えばNewRGBAした結果を入力して意図した結果が出るのか出ないのかというとちゃんと判定できるようです。

<https://play.golang.org/p/wKrgig-J1D>

[code]

    package main
    
    import (
        "fmt"
        "image"
        "image/color"
    )
    
    func ModelName(m image.Image) string {
        switch m.ColorModel() {
        case color.RGBAModel:
            return "rgba"
        case color.RGBA64Model:
            return "rgba64"
        case color.NRGBAModel:
            return "nrgba"
        case color.NRGBA64Model:
            return "nrgba64"
        case color.AlphaModel:
            return "alpha"
        case color.Alpha16Model:
            return "alpha16"
        case color.GrayModel:
            return "gray"
        case color.Gray16Model:
            return "gray16"
        case color.CMYKModel:
            return "cmyk"
        case color.YCbCrModel:
            return "YCbCr"
        }
        if _, ok := m.(image.PalettedImage); ok {
            return "paletted"
        }
        return "unknown"
    }
    
    func main() {
        fmt.Println(ModelName(image.NewRGBA(image.Rect(0, 0, 16, 16))))
        fmt.Println(ModelName(image.NewRGBA64(image.Rect(0, 0, 16, 16))))
        fmt.Println(ModelName(image.NewAlpha(image.Rect(0, 0, 16, 16))))
        fmt.Println(ModelName(image.NewAlpha16(image.Rect(0, 0, 16, 16))))
        fmt.Println(ModelName(image.NewCMYK(image.Rect(0, 0, 16, 16))))
        fmt.Println(ModelName(image.NewGray(image.Rect(0, 0, 16, 16))))
        fmt.Println(ModelName(image.NewGray16(image.Rect(0, 0, 16, 16))))
        fmt.Println(ModelName(image.NewNRGBA(image.Rect(0, 0, 16, 16))))
        fmt.Println(ModelName(image.NewNRGBA64(image.Rect(0, 0, 16, 16))))
        fmt.Println(ModelName(image.NewPaletted(image.Rect(0, 0, 16, 16), nil)))
        fmt.Println(ModelName(image.NewYCbCr(image.Rect(0, 0, 16, 16), image.YCbCrSubsampleRatio422)))
    }
    
[/code]

