2012-09-02 58 views
1

有一個ImageView,它有一個Image,它已被放大和旋轉。如何在ImageView中查找圖像的中心點和邊界

看到的畫面:

enter image description here

的圖像由android.graphics.Matrix縮放。

你可以看到有紅色的點是圖像的中心點,也是一個藍色的邊框。如何計算它們?

(更新:我要藍色的邊框內的少女形象上操作,而不是全貌,這是背景)

+0

你能澄清你的問題嗎?你想要處理哪個圖像?整個形象,還是隻有藍色邊框和一個女孩在裏面的圖像? – Huang

+0

帶藍色邊框和內部女孩的圖像:) – Freewind

回答

2

有兩者之間的數學相關性。如果有其他信息可用: - 假設矩形對所有角都有直角 - 。

center.X = (aCorner.X + oppositeCorner.X)/2; 
center.Y = (aCorner.Y + oppositeCorner.Y)/2; 

其中aCorner是一個任意的角落,而另一個角落是aCorner的對角。

這是微不足道的,包括更多的辛苦工作來計算邊界(和更多的信息;中心位置,寬度和圖片的高度和旋轉角度)。 假設圖像寬度爲「w」,高度爲「h」,角度爲「a」,居中「cX」和「cY」。 第一個角落;

length = sqrt(w^2+h^2)/2; 
x = (length)*(cos(a)*(-w/length) - (h/length)*sin(a)) + cX; 
y = (length)*(sin(a)*(-w/length) + (h/length)*cos(a)) + cY; 

第二個角落;

x = (length)*(cos(a)*(w/length) + sin(a)*(h/length)) + cX; 
y = (length)*(cos(a)*(h/length) - sin(a)*(w/length)) + cY; 

第三;

x = -(length)*(cos(a)*(-w/length) + (h/length)*sin(a)) + cX; 
y = -(length)*(sin(a)*(-w/length) - (h/length)*cos(a)) + cY; 

第四條;

x = -(length)*(cos(a)*(w/length) - sin(a)*(h/length)) + cX; 
y = (length)*(cos(a)*(h/length) - sin(a)*(w/length)) + cY; 

長度是矩形對角線的一半。與COS和罪惡內部是三角變換的結果:

sin(a+b) = sin(a)*cos(b) + cos(a)*sin(b) 
[....] 

和CX和CY被用來從任意座標系到一個特定的座標系轉換的角落。

我知道,我知道這有點矯枉過正。 Matrix類可以自己擁有這個功能。我相信如果有的話,其中使用的方法可以分解爲我在這裏描述的方法。

注:角度α-actually甚至罪的(a)和cos(a)中,這是更好 - 可以通過
Matrix.getValues被訪問(浮動[]值)

大多數2D矩陣使用此方案:

| sin(a) 0  0 | 
| 0  -cos(a) 0 | 
| 0  0  scale| 

我不確定Android API的特定實現。

順便說一句,可能有一些簽名錯誤,所以要小心。

+0

感謝數學答案。我也想知道如何使用android API來獲取縮放ImageView中圖像的這些點(4個角)。 – Freewind

+0

我不確定API是否部署了該功能。因爲平移/變換矩陣大多隻用於單向編輯。但是我的建議是在位圖上沒有矩陣時繪製你想要繪製的內容。然後設置矩陣。 – mehmetminanc

+0

讓我想一想,謝謝! – Freewind