从golang image.Image获取像素数组

Aru*_*ath 10 go

我需要从/ mobile/gl包中获取一个像素数组,[]byte以传递给ContextexImage2D方法.

它需要一个像素阵列,其中每个像素的rgba值按从左到右,从上到下的像素顺序附加.目前我有一个从文件加载的图像.

a, err := asset.Open("key.jpeg")
if err != nil {
    log.Fatal(err)
}
defer a.Close()

img, _, err := image.Decode(a)
if err != nil {
    log.Fatal(err)
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找类似的东西 img.Pixels()

Aru*_*ath 6

这就是我最终要做的。我正在使用image/draw包的 Draw 函数来重新填充image.RGBA实例

rect := img.Bounds()
rgba := image.NewRGBA(rect)
draw.Draw(rgba, rect, img, rect.Min, draw.Src)
Run Code Online (Sandbox Code Playgroud)

现在rgba.Pix包含我想要的数组并且可以在TexImage2D方法中使用。

glctx.TexImage2D(gl.TEXTURE_2D, 0, rect.Max.X-rect.Min.X, rect.Max.Y-rect.Min.Y, gl.RGBA, gl.UNSIGNED_BYTE, rgba.Pix)
Run Code Online (Sandbox Code Playgroud)

交替

Image实例包含一个At返回Color的方法。因此可以遍历每个像素并收集颜色。但是从 转换返回的 rgba 值Color可能很复杂。引用文档:

    // RGBA returns the alpha-premultiplied red, green, blue and alpha values
    // for the color. Each value ranges within [0, 0xffff], but is represented
    // by a uint32 so that multiplying by a blend factor up to 0xffff will not
    // overflow.
    //
    // An alpha-premultiplied color component c has been scaled by alpha (a),
    // so has valid values 0 <= c <= a.  
Run Code Online (Sandbox Code Playgroud)


Kes*_*ion 6

您可以简单地使用img.At(x, y).RGBA()获取像素的RBGA值,您只需将它们除以257即可获得8位表示.我建议你建立自己的二维像素数组.这是一个可能的实现,根据需要进行修改:

package main

import (
    "fmt"
    "image"
    "image/png"
    "os"
    "io"
    "net/http"
)

func main() {
    // You can register another format here
    image.RegisterFormat("png", "png", png.Decode, png.DecodeConfig)

    file, err := os.Open("./image.png")

    if err != nil {
        fmt.Println("Error: File could not be opened")
        os.Exit(1)
    }

    defer file.Close()

    pixels, err := getPixels(file)

    if err != nil {
        fmt.Println("Error: Image could not be decoded")
        os.Exit(1)
    }

    fmt.Println(pixels)
}

// Get the bi-dimensional pixel array
func getPixels(file io.Reader) ([][]Pixel, error) {
    img, _, err := image.Decode(file)

    if err != nil {
        return nil, err
    }

    bounds := img.Bounds()
    width, height := bounds.Max.X, bounds.Max.Y

    var pixels [][]Pixel
    for y := 0; y < height; y++ {
        var row []Pixel
        for x := 0; x < width; x++ {
            row = append(row, rgbaToPixel(img.At(x, y).RGBA()))
        }
        pixels = append(pixels, row)
    }

    return pixels, nil
}

// img.At(x, y).RGBA() returns four uint32 values; we want a Pixel
func rgbaToPixel(r uint32, g uint32, b uint32, a uint32) Pixel {
    return Pixel{int(r / 257), int(g / 257), int(b / 257), int(a / 257)}
}

// Pixel struct example
type Pixel struct {
    R int
    G int
    B int
    A int
}
Run Code Online (Sandbox Code Playgroud)