0

我想在 Go 中做这样的事情:

for x := 0; x < width; x++ {
    for y := 0; y < height; y++ {
            // something similar to this:
            src_img[x, y] = color.Black
    }
}

是否可以这样做,只导入“图像”、“图像/jpeg”、“图像/颜色”?

4

2 回答 2

2

例如:

package main

import (
        "fmt"
        "image"
        "image/color"
)

func main() {
        const D = 12
        img := image.NewGray(image.Rect(1, 1, D, D))
        for x := 1; x <= D; x++ {
                img.Set(x, x, color.Gray{byte(2 * x)})
        }
        for x := 1; x < D; x++ {
            fmt.Printf("[%2d, %2d]: %5v\n", x, x, img.At(x, x))
        }
}

操场


输出:

[ 1,  1]: {    2}
[ 2,  2]: {    4}
[ 3,  3]: {    6}
[ 4,  4]: {    8}
[ 5,  5]: {   10}
[ 6,  6]: {   12}
[ 7,  7]: {   14}
[ 8,  8]: {   16}
[ 9,  9]: {   18}
[10, 10]: {   20}
[11, 11]: {   22}

推荐阅读Go 图像包文章(除了godocs 之外)。

于 2013-08-14T11:26:21.977 回答
1

如果要修改图像,则 image.RGBA 类型是在内存中存储图像的首选方式它实现了draw.Image接口,该接口具有设置像素的便捷方法:

Set(x, y int, c color.Color)

不幸的是,并非所有解码器都以 RGBA 格式返回图像。他们中的一些人将图像保留为压缩格式,其中并非每个像素都是可修改的。对于许多只读用例来说,这更快更好。但是,如果要编辑图像,则可能需要复制它。例如:

src, _, err := image.Decode(file)
if err != nil {
    log.Fatal(err)
}
rgba, ok := src.(*image.RGBA)
if !ok {
    b := src.Bounds()
    rgba = image.NewRGBA(image.Rect(0, 0, b.Dx(), b.Dy()))
    draw.Draw(rgba, rgba.Bounds(), src, b.Min, draw.Src)
}
// rgba is now a *image.RGBA and can be modified freely
rgba.Set(0, 0, color.RGBA{255, 0, 0, 255})
于 2013-08-14T18:41:54.523 回答