2011-10-23 59 views
0

我遇到以下問題,我試圖解決整個一天。 我將一個帶有相應高度和寬度的位圖圖片加載到ImageView中。 然後我使用矩陣來移動,縮放和旋轉圖像。 爲了縮放,我使用了postScale方法。 對於移動我使用postTranslate方法。 僅適用於旋轉我正在使用preRotate方法。 現在我需要獲得縮放圖像的因子,因爲我後來在另一個程序中需要這個因子。使用矩陣旋轉後獲取位圖的比例因子

使用矩陣的MSCALE_X和MSCALE_Y值只適用於我沒有旋轉。如果我旋轉了圖像,則比例值不再適合(因爲矩陣與api中顯示的公式相乘)。

現在我的問題是: 如何在旋轉圖像後仍能得到圖像的比例因子?

對於旋轉因子(度),它很簡單,因爲我將它存儲在一個額外的變量中,這個變量在旋轉時被增加/減少。 但是對於縮放因子,它不起作用,因爲如果我先將圖像縮小到50%,然後將其重新縮放到150%,那麼我將其縮放爲3倍,但原始縮放因子僅爲1.5)。

另一個例子是。即使我沒有重新縮放圖片,如果我旋轉它,它甚至會改變它的縮放因子。

//編輯: 最後,我自己解決了這個問題:)(做了一些數學計算,然後我想出了一些有趣的東西(或者說明顯的))。

這裏我的解決方案: 我發現值MSCALE_X和MSCALE_Y是通過使用餘弦函數(是的基本數學...)計算出來的。 (使用0°旋轉將導致X和Y內的正確scalingWidth和scalingHeight)。 (90°和270°導致scalingWidth/height爲0和180°會導致scalingWidth/Height乘以-1)。

這使我想到編寫以下函數: 該函數將當前矩陣保存在一個新的矩陣中。然後它將新矩陣旋轉到開始狀態(0°)。現在我們可以讀取矩陣中的非侵犯值MSCALE_X和MSCALE_Y(這是現在正確的比例因子)

+0

嗨@Vion你可以向我們展示一些你的代碼在哪裏實現了新的矩陣。謝謝 。我和你有同樣的問題。 – donmj

回答

0

我有一個類似的問題,我正在寫一個應用程序。我看不到一個明顯的簡單解決方案,所以我只創建了一個具有相同位圖初始座標的RectF對象。然後,每次我調整矩陣時,我都會將轉換應用到RectF(使用Matrix.mapRect())。這對我來說非常合適。它還使我能夠跟蹤位圖邊緣的絕對位置。

+0

嗨@coverdriven,你能給我一個代碼。我有和你一樣的問題。它使用矩陣旋轉我的位圖後,它不工作。謝謝 – donmj

2

我有同樣的問題。這是一種簡單的方式,邏輯是合理的(在我看來)。

爲:xScale==yScale

float scale = matrix.mapRadius(1f) - matrix.mapRadius(0f); 

爲:xScale != yScale

float[] points={0f,0f,1f,1f}; 
matrix.mapPoints(points); 
float scaleX=points[2]-points[0]; 
float scaleY=points[3]-points[1]; 

如果沒有翻譯,你可以只用與1F矢量/點就完事了。我測試了xScale==yScale(mapRadius)變體,它似乎工作。