使用Color包从RGB值创建新颜色?

时间:2014-02-28 00:04:45

标签: colors go pixel rgba

我正在尝试使用变量中的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对象的包。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

image/color包中的类型具有导出字段,因此您可以直接实例化它们。对于您的示例,您可以使用以下命令创建颜色值:

grayColor := color.Gray16{Y: uint16(averaged)}

redgreenblue值都在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