[英]How to load tiles from a large bitmap in Android?
如果我有一個通常會產生“內存不足”異常的大型位圖文件,我該如何將其加載為tile? 例如,我有10,000x10,000的圖像,我想將其分成10x10網格的1,000x1,000像素圖塊。
我見過函數Bitmap.createBitmap(sourceBitmap, x, y, width, height)
但它需要我的大圖像作為源輸入。
如何在不完全加載輸入圖像的情況下從輸入圖像中獲取圖塊?
來自Romain Guy的回答是否可以將位圖切成小塊而不將整個內容加載到內存中? :
Android 2.3.3有一個名為android.graphics.BitmapRegionDecoder的新API,可讓您完全按照自己的意願行事。
例如,您可以執行以下操作:
BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(myStream, false); Bitmap region = decoder.decodeRegion(new Rect(10, 10, 50, 50), null);
簡單 :)
如果圖像存儲為壓縮位圖,則幾乎不可能計算圖像的特定區域在文件中的位置。 要查找特定區域,您將逐行解碼,丟棄結果,直到您到達y行。 然后,您繼續解碼高度行,將像素丟棄到X坐標的左側和X +寬度的右側....如果您在大位圖的底部平移,則非常慢。
在行之間進行讀取,如果'isShareable'為真,前面提到的BitmapRegionDecoder()似乎在后台執行此操作。 否則,它似乎可以解壓縮圖像,並存儲未壓縮的副本。 每像素1個字節,占用10,000x10,000位圖需要100MB。
如果你很幸運,你可以找到一個可以從存儲中加載圖像塊而不是加載整個圖像的庫。 這取決於圖像格式,以及可用於讀取的庫。 另外,庫可能是用C語言編寫的,因此您必須將其移植到Java或使用NDK。
在將圖像放入手機之前將圖像分解成圖塊要好得多。
如果這些選項都不適合你,我認為你運氣不好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.