2016-10-14 2 views
1

image.Point 구조체가 있었으면 좋았을 텐데 그 대신 픽셀 기반이었습니다.이미지에서 특정 픽셀의 형상을 얻는 방법 .RGBA 또는 다른 유형?

나는 30032300 크기 (경계)로 을로드하고 디코딩한다고합니다. image.Point 또는 fixed.Point26_6에 이미지 중간의 정확한 좌표를 얻으려면 어떻게해야합니까?

+0

당신이 무엇인지 분명하지 않습니다. 스케이팅. 이미지의 중심점의 좌표 (x, y)를 원하십니까? 또는 센터의 색상? – icza

+0

@icza 좌표를 원합니다. – goofle

답변

2

image.RGBA은 일반적인 image.Image 인터페이스의 구체적인 구현입니다. (일반적으로는하지만)

중요
// 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.Bounds() 방법이있다.

그래서 이미지의 형상이 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 

그리고 struct 유형은 image.Point입니다.

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

또는 : image.Point의 값으로 중심점을 얻으려면

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에 그것을 시도) :

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

이 예제를 참조하십시오

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

감사합니다. 내 혼란은 내 코드 내의 함수가 내 int 'x','y'를'fixed.Int26_6'으로 변환했기 때문입니다. 나는 물건을 작동시키기 위해 왼쪽'x << 6'을 이동해야했습니다. – goofle

관련 문제