2011-02-11 94 views
4

我想從多個較小的位圖合成背景位圖。我正在使用Eclipse和Android SDK。Android:在另一個位圖上繪製多個位圖

我已加載了(大部分)空白背景位圖(像素尺寸爲480),如下所示:

Bitmap mBackground = BitmapFactory.decodeResource(res, R.drawable.background); 

然後我加載一個位圖「瓦片」(128×128)的方式相同。

我已經嘗試了多種方式將圖塊繪製到位圖上,但每種方法都不會按照我希望的方式工作。我想繪製縮放到64x64的瓦片位圖和背景位圖上的特定位置(像素偏移量)。

1)用帆布...

Canvas c = new Canvas(mBackground); 
c.drawBitmap(mTile, null, new Rect(10, 10, 73, 73), null); 

由此得出磚太大了(沒有原圖,沒有64×64,但在兩者之間,原來的約66%)的地方

2)使用可繪製(這基本上似乎是相同的):

Canvas c = new Canvas(mBackground); 
c.translate(10, 10); 
d.setBounds(0, 0, 63, 63); 
d.draw(c); 

相同的結果,實驗#1 ...

該文檔在許多地方提到(沒有簡明扼要的解釋在任何地方),這與設備無關的「密度」有關,因此我嘗試了下一種方法...

3)使用固定比例資源。我創建了/ res/drawable-nodpi(我也嘗試過/ res/drawable)文件夾,並將其資源(背景和拼貼png圖像)移入其中。當從背景位圖創建畫布時會導致異常,因爲非標度位圖顯然變得不可變,因此無法分配給畫布!

4)我嘗試使用BitmapFactory.Options並將inScaled設置爲false,並將這些選項傳遞給背景和拼貼的兩個decodeResource調用。這與#3具有完全相同的效果(拋出異常)。

沒有任何工作,它變得非常沮喪。我相信我只是錯過了一些位圖特有的細節,當涉及到不同的座標空間時,但我無法在文檔或其他地方的任何地方找到它(我嘗試過多個android開發網站無濟於事)。

希望有人這樣做會看到這個請求! 謝謝,傑森

+0

爲什麼你不使用位圖。createScaledBitmap()用於將「tile」從128x128縮放到64x64? – Zelimir 2011-02-11 16:35:23

+0

基本上,在嘗試了幾次實驗後,似乎不可能使用合成。如果我單獨加載所有拼貼,並立即編寫位圖(即將所有內容全部繪製到空白畫布上),則工作得很好,因爲座標空間都匹配。 – 2011-02-19 00:37:42

回答

0

Canvas.drawBitmap()不執行縮放afaik。

由於您的平鋪圖像原本是128×128,並且希望在64×64畫它,最簡單的伎倆是打電話decodeResource()的選項,以減少它的大小:

BitmapFactory.Options options = new BitmapFactory.Options() 
options.inSampleSize = 2; // downscale by 50% 
Bitmap mTile = BitmapFactory.decodeResource(res, R.drawable.tile, options); 

要做到更強大縮放(例如,以任何尺寸繪製圖像),您應該將其包裝在BitmapDrawable中。

0

它看起來像你的位圖的密度是不同的......有a similar issue here。你應該檢查你加載的每個Bitmap的密度,看看它是否是同樣的問題。

+0

根據getDensity()調用,它們都是160.未縮放的位圖的不變性(請參閱原始問題中的編輯#3&#4)似乎阻止了我能夠合成,然後縮放最終圖像。 – 2011-02-11 16:49:51