へ
color.Model
は、色を異なる色の種類に変換することができますが、the docsでは:
インターフェイスColorModel
には、画像のカラーモデルが記載されています。
つまり、ピクセルのカラーモデルではありません。類似していますが、後で画像がに異なる色モデルのピクセルを含んでいる可能性があります。
image
は、均質な色の矩形グリッドを表します。つまり、すべてのピクセルが同じ色モデルを持っています。 のカラーモデルがimage
であることを理解したら、image
を特定の具体的な画像タイプにキャストしてから、その特定の画像を直接操作する方が効率的です。以下のスニペットは、アイデアを示しています
switch img.ColorModel() {
case color.RGBAModel:
// Try to cast to RGBA first
m, ok := img.(*image.RGBA)
if !ok {
//not an RGBA image, do generic/custom processing,
//e.g. using interface exposed by image.Image
return
}
//Direct pixel access for performance
for y := m.Rect.Min.Y; y < m.Rect.Max.Y; y++ {
yp := (y - m.Rect.Min.Y) * m.Stride
for x := m.Rect.Min.X; x < m.Rect.Max.X; x++ {
rgba := m.Pix[yp+(x-m.Rect.Min.X)*4:] //[]byte{r, g, b, a}
//get rgba component
r, g, b, a := rgba[0], rgba[1], rgba[2], rgba[3]
//set r channel to RED
rgba[0] = 255
//...
}
}
}
は、以下のコードは、正しいモデルにあなたの色を変換することができなかった場合は、あなたのイメージに色を設定する方法を
// Less efficient image processing
// a type-switch on the color returned by the `At` method
b := img.Bounds()
for y := b.Min.Y; y < b.Max.Y; y++ {
for x := b.Min.X; x < b.Max.X; x++ {
col := img.At(x, y)
switch col := col.(type) {
case color.RGBA:
//do something with pixel
}
}
}
に比べて、より効率的でしょうか? – JimB
イメージがこの情報を提供しない場合は、どのようにカラーモデルを決定しますか? – Volker
@JimB一般的に、イメージには色を設定できません。どのインタフェースメソッドも色の変更をサポートしておらず、すべての画像が変更可能な色の配列として格納されているわけではありません。 –