PNGファイルを読み込んでもう一方のチャンネル(R、G、B)を可能な選択。Golang - 画像と画像/ PNGを使用している画像のPNGチャンネルを入れ替えよう
しかし、image.At(x、y)によって返されたcolor.Colorオブジェクトから整数を抽出する方法はわかりません。それを書き戻すことは、スワップされたチャンネルで新しいRGBAカラーを作成できるようになると、おそらくimage.Set(x、y、color)で簡単になります。ここで
私は(あなたはかなり最後のループにスキップすることができます)今の私:
package main
import (
"flag"
"fmt"
//"image"
"image/color"
"image/png"
"os"
)
type Choice struct {
value string
valid bool
}
func (c *Choice) validate() {
goodchoices := []string{"R", "G", "B"}
for _, v := range goodchoices {
if c.value == v {
c.valid = true
}
}
}
func main() {
var fname string
var c1 Choice
var c2 Choice
flag.StringVar(&c1.value, "c1", "", "The color channel to swap - R or G or B ")
flag.StringVar(&c2.value, "c2", "", "The color channel to swap with - R or G or B ")
flag.StringVar(&fname, "f", "", "A .png image (normal map)")
flag.Parse()
c1.validate()
c2.validate()
if c1.valid == true && c2.valid == true {
fmt.Println("We could proceed..")
fmt.Println("Swapping channels:", c1.value, "<->", c2.value, "In", fname) //for testing
} else {
fmt.Println("Invalid channel... Please use R, G or B.")
return
}
file, err := os.Open(fname)
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
pic, err := png.Decode(file)
if err != nil {
fmt.Fprintf(os.Stderr, "%s: %v\n", fname, err)
return
}
b := pic.Bounds()
for y := b.Min.Y; y < b.Max.Y; y++ {
for x := b.Min.X; x < b.Max.X; x++ {
col := pic.At(x, y)
???? How do I swap the channels in col ????
}
}
}
私はあなたの答えでそれを考慮してください、一般的に移動し、プログラミングは本当に新しいです。ありがとうございました。
私はRGBA png画像を使用しています(これはBlender3Dからエクスポートされたノーマルマップです)。 – Zoltan