如何获取图像中特定像素的几何图形.RGBA或任何其他类型?

时间:2016-10-14 08:26:08

标签: image go

我希望有一些像image.Point结构,但它是基于像素的,如果这是有道理的。

假设我已加载并解码了大小(边界)为300x300的image.RGBA。如何在image.Pointfixed.Point26_6中获取图像中间的确切坐标?

1 个答案:

答案 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)),您必须同时考虑MinMax点来计算中心点:

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)