我正在尝试使用变量中的RGB值创建一个新的Color
对象:
http://golang.org/pkg/image/color/
package main
import (
"fmt"
"image"
_ "image/gif"
_ "image/jpeg"
_ "image/png"
"os"
)
func main() {
reader, err := os.Open("test-image.jpg")
if err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
}
image, _, err := image.Decode(reader)
if err != nil {
fmt.Fprintf(os.Stderr, "%s", err)
}
bounds := image.Bounds()
for i := 0; i <= bounds.Max.X; i++ {
for j := 0; j <= bounds.Max.Y; j++ {
pixel := image.At(i, j)
if i == 0 && j == 0 {
red, green, blue, _ := pixel.RGBA()
averaged := (red + green + blue) / 3
// This FromRGBA function DOES NOT EXIST!
grayColor := Color.FromRGBA(averaged, averaged, averaged, 1)
// Then I could do something like:
grayColor.RGBA() // This would work since it's a type Color.
}
}
}
}
我似乎无法找到任何包给出rgba值的生成新Color对象的包。
有什么建议吗?
答案 0 :(得分:1)
image/color
包中的类型具有导出字段,因此您可以直接实例化它们。对于您的示例,您可以使用以下命令创建颜色值:
grayColor := color.Gray16{Y: uint16(averaged)}
(red
,green
和blue
值都在0..0xffff
范围内,因此16位灰色实现似乎是合适的。)
答案 1 :(得分:1)
image.Color实际上是一个界面。您可以使用任何满足它的结构。甚至是你自己的结构。
例如,您可以使用image.Gary:
grayColor := image.Gray{averaged}
或你自己的grayColor:
type MyGray struct {
y uint32
}
func (gray *MyGray) FromRGBA(r, g, b, a uint32) {
gray.y = (r + g + b) / 3
}
func (gray *MyGray) RGBA() (r, g, b, a uint32) { // to satisfy image.Color
return gray.y, gray.y, gray.y, 1
}
grayColor := &MyGray{}
grayColor.FromRGBA(pixel.RGBA())
grayColor.RGBA()
// blablabla