Get pixel array from golang image.Image

I need to get an array of pixels in the form []byte , which will be passed to the texImage2D Contex method from / mobile / gl .

He needs a pixel array, where the rgba values ​​of each pixel are added in pixel order from left to right, from top to bottom. I currently have an image loaded from a file.

 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) } 

I'm looking for something like img.Pixels()

+7
go
source share
2 answers

You can simply use img.At(x, y).RGBA() to get the RBGA values ​​for the pixel, you just need to divide them by 257 to get an 8-bit representation. I would recommend creating your own two-dimensional array of pixels. Here's a possible implementation, change it as needed:

 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 } 
+5
source share

This is what I ended up doing. I use image / draw package Draw to replenish the image.RGBA instance

 rect := img.Bounds() rgba := image.NewRGBA(rect) draw.Draw(rgba, rect, img, rect.Min, draw.Src) 

Now rgba.Pix contains the array I want, and it can be used in the TexImage2D method.

 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) 

On the other hand

Image instances contain an At method that returns Color . Thus, you can scroll through each pixel and collect colors. But converting rgba return values ​​from Color can be tricky. Quotation documentation:

  // 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. 
+3
source share

All Articles