我希望有一些像image.Point结构,但它是基于像素的,如果这是有道理的。
假设我已加载并解码了大小(边界)为300x300的image.RGBA
。如何在image.Point
或fixed.Point26_6
中获取图像中间的确切坐标?
答案 0 :(得分:2)
image.RGBA
是一般image.Image
接口的具体实现。
它有一个Image.Bounds()
方法:
// Bounds returns the domain for which At can return non-zero color.
// The bounds do not necessarily contain the point (0, 0).
Bounds() Rectangle
重要的是要注意图像的左上角可能不在零点(0, 0)
(尽管通常是这样)。
因此,图像的几何图形将作为image.Rectangle
的值传递给您:
type Rectangle struct {
Min, Max Point
}
要处理一般情况(左上角可能不是(0, 0)
),您必须同时考虑Min
和Max
点来计算中心点:
cx := (r.Min.X + r.Max.X)/2
cy := (r.Min.Y + r.Max.Y)/2
另一种解决方案是使用Rectangle.Dx()
和Rectangle.Dy()
:
cx := r.Min.X + r.Dx()/2
cy := r.Min.Y + r.Dy()/2
还有一个image.Point
结构类型。要将中心点设为值image.Point
:
cp := image.Point{(r.Min.X + r.Max.X) / 2, (r.Min.Y + r.Max.Y) / 2}
或者:
cp := image.Point{r.Min.X + r.Dx()/2, r.Min.Y + r.Dy()/2}
见这个例子:
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)
输出(在Go Playground上尝试):
(0,0)-(300,100)
(150,50)
(150,50)