天天看點

Android縮放drawable 壓縮圖檔 matrix

q:加載時圖檔時有一些圖檔太大,導緻記憶體溢出,想把這些圖檔壓縮成一個縮略圖,該怎麼做?

不能隻是縮小圖檔大小,而是要把體積降下來,幾百k的圖檔壓縮成幾k或幾百b.

a1:

壓縮圖檔品質:   

bitmap.compress(bitmap.compressformat.jpeg, quality, fos);   

其中的quality為0~100, 可以壓縮圖檔品質, 不過對于大圖必須對圖檔resize  

這個是等比例縮放:

bitmap = bitmap.createscaledbitmap(bitmap, width, height, false);

newbitmap = bitmap.createbitmap(oldbitmap, 0, 0, width, height, matrix,

true);//用距陣的方式縮放

這個是截取圖檔某部分:

bitmap = bitmap.createbitmap(bitmap, x, y, width, height);

這幾個方法都是針對bitmap的, 不過鑒于bitmap可以從file中讀取, 也可以寫入file.  

這是我知道android自帶庫裡中唯一可以縮放和壓縮的圖檔方法.

--------------------------------------------------------------------------------------------------------------------------------------------------

a2:

記憶體溢出,你這麼處理就可以。用完及時回收

bitmapfactory.options options = new bitmapfactory.options();

options.intempstorage = new byte[16*1024];

bitmap bitmapimage = bitmapfactory.decodefile(path,opt);

q:bitmap如何儲存成為一個bmp檔案:

a:很多網友可能發現了android的bitmap對象無法儲存成為一個bmp檔案,即提供的方法隻有compress(bitmap.compressformat format, int quality, outputstream stream) ,可以存為png和jpg,png可能還好說,但是jpg是有損壓縮會降低圖檔的品質,其實google還提供了一個api在bitmap類,通過copypixelstobuffer(buffer dst) 這個方法來解決,buffer類型,和前幾天我們說到的nio中的bytebuffer處理方式一樣,需要說明的是java中的buffer在記憶體中是連續成塊的,同時底層有c++支援效率還是很高的。

  通過copypixelstobuffer(buffer dst) 方法将會傳回一個rgb8888格式的dib檔案,dib位圖和裝置無關,這裡android123提醒大家,如果想顯示出位圖,還需要将其加上位圖的檔案頭才行。

q:

一、   相關概念

1.         drawable 就是一個可畫的

對象,其可能是一張位圖( bitmapdrawable ),也可能是一個 圖形(shapedrawable ),還有可能是一

個圖層( layerdrawable ),我們根據畫圖的需求,建立相應的可畫對象

2.         canvas 畫布,繪制的目

的區域,用于繪圖

3.         bitmap 位圖,用于圖的

處理

4.         matrix 矩陣,此例中用

于操作圖檔

二、   步驟

1.         把 drawable 畫到位圖對象上

2.         對位圖對象做縮放(或旋轉等)操作

3.         把位圖再轉換成 drawable

三、 示例