pavd
pavd

Reputation: 173

How to get the geometry of a specific pixel in an image.RGBA or any other type?

I wish there was something like image.Point struct but instead it was pixel based, if that makes sense.

Say I have loaded and decoded an image.RGBA with size(bounds) of 300x300. How can I get the exact coordinate of the middle of the image in image.Point or fixed.Point26_6?

Upvotes: 1

Views: 395

Answers (1)

icza
icza

Reputation: 417612

image.RGBA is a concrete implementation of the general image.Image interface.

It has an Image.Bounds() method:

// Bounds returns the domain for which At can return non-zero color.
// The bounds do not necessarily contain the point (0, 0).
Bounds() Rectangle

Important to note that the top-left corner of the image might not be at the zero point (0, 0) (although generally it is).

So the geometry of the image is handed to you as a value of image.Rectangle:

type Rectangle struct {
    Min, Max Point
}

To handle the general case (where top-left might not be (0, 0)), you have to account both the Min and Max points to to calculate the center point:

cx := (r.Min.X + r.Max.X)/2
cy := (r.Min.Y + r.Max.Y)/2

Another solution is to use Rectangle.Dx() and Rectangle.Dy():

cx := r.Min.X + r.Dx()/2
cy := r.Min.Y + r.Dy()/2

And there is an image.Point struct type. To get the center point as a value of image.Point:

cp := image.Point{(r.Min.X + r.Max.X) / 2, (r.Min.Y + r.Max.Y) / 2}

Or:

cp := image.Point{r.Min.X + r.Dx()/2, r.Min.Y + r.Dy()/2}

See this example:

r := image.Rect(0, 0, 300, 100)
fmt.Println(r)
cp := image.Point{(r.Min.X + r.Max.X) / 2, (r.Min.Y + r.Max.Y) / 2}
fmt.Println(cp)

cp = image.Point{r.Min.X + r.Dx()/2, r.Min.Y + r.Dy()/2}
fmt.Println(cp)

Output (try it on the Go Playground):

(0,0)-(300,100)
(150,50)
(150,50)

Upvotes: 2

Related Questions