2013-07-17 55 views
2

我有一個位圖列表。 我想要的是採取這些位圖,並在畫布的幫助下,創建一個新的位圖與縮小圖像(意味着,使他們很小)從我有位圖的列表。將位圖重新定位到較小的位圖

我已經設法做到這一點,但由於縮小比例,圖像看起來非常可怕。 我試過很多東西,設置,創建新的畫布等。

簡單的第一個解決方案看起來像這樣(代碼如下),但正如我所說的,圖像看起來很糟糕。

public static Bitmap folderBitmap(Bitmap bitmap[]) { 

    Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.RGB_565); 
    Canvas c = new Canvas(b); 

    c.drawARGB(255, 255, 255, 255); 

    Paint paint = new Paint(); 
    paint.setAntiAlias(false); 
    paint.setFilterBitmap(false); 
    paint.setDither(true); 

    c.drawBitmap(getBit(bitmap), 4, 4, paint); 
    c.drawBitmap(getBit(bitmap), 35, 4, paint); 
    c.drawBitmap(getBit(bitmap), 67, 4, paint); 

    c.drawBitmap(getBit(bitmap), 4, 35, null); 
    c.drawBitmap(getBit(bitmap), 35, 35, null); 
    c.drawBitmap(getBit(bitmap), 67, 35, null); 

    c.drawBitmap(getBit(bitmap), 4, 67, null); 
    c.drawBitmap(getBit(bitmap), 35, 67, null); 
    c.drawBitmap(getBit(bitmap), 67, 67, null); 

    return b; 
} 

private static Bitmap getBit(Bitmap[] b) { 
    Bitmap newBitmap = Bitmap.createScaledBitmap(b[getR()], 28, 28, false); 

    return newBitmap; 
} 

private static int getR() { 
    Random r = new Random(); 
    int rint = r.nextInt(8); 
    return rint; 
} 

可怕的我的意思是,他們看起來像素化和不尖銳。

回答

4

使用inSampleSize到縮放Bitmap。從文檔

如果設置爲值> 1,要求解碼器以子採樣原始圖像 ,返回一個較小的圖像以節省內存。樣本大小爲在任一維度中對應於解碼位圖中的單個像素的像素數量的 。例如,inSampleSize == 4將返回一個 圖像,該圖像是原始寬度/高度的1/4,以及1/16像素數。任何值< = 1同等對待1注: 解碼器使用基於2的冪的最終值,任何其它值將 被向下舍入爲2.

例如最近的電源:

BitmapFactory.Options opts = new BitmapFactory.Options(); 
opt.inSampleSize = 4; 
Bitmap newBitmap = BitmapFactory.decodeFile(filePath, opts); 
+0

雖然這看起來最好,但@Android28的答案也可以接受一些調整。 –

2

可以使圖像縮略圖:

Bitmap thumbBitmap = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(filePath), thumbWidth, thumbHeight); 
1

使用你的代碼,如果你想根據每個這些設置文件,以提高質量,您應該:

  1. Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);:每個像素都存儲在4個字節中。每個通道(用於半透明的RGB和alpha)都以8位精度(256個可能值)存儲。此配置非常靈活,並提供最佳質量的 質量。應儘可能使用它。

  2. paint.setAntiAlias(true);:反鋸齒平順的被抽什麼

  3. paint.setFilterBitmap(true);邊緣:過濾會影響位圖的採樣它們轉化時。