28562


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のものを判定できませんでした。


CC BY-SA 3.0
2016-08-10T03:50:12.747
28167
2016-11-28T18:02:50.207
2016-08-10T15:47:46.100
5519
7232
question
go
画像がグレイスケールか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]


CC BY-SA 3.0
2016-08-29T14:27:36.833
28562
2016-08-29T14:27:36.833
11051
28167
answer