Reputation: 173
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
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