2015-09-02 83 views
0

我想在拍攝照片後縮小位圖的大小。我能夠減小尺寸到最大900KB,但我婉,以減少進一步儘可能拍照後壓縮位圖或字節[]

首先我這樣做:

public static Bitmap decodeSampledBitmapFromResource(byte[] data, 
                int reqWidth, int reqHeight) { 
//reqWidth is 320 
//reqHeight is 480 
    // First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeByteArray(data, 0, data.length, options); 

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    return BitmapFactory.decodeByteArray(data, 0, data.length, options); 
} 

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 
    if (height > reqHeight || width > reqWidth) { 
     final int halfHeight = height/2; 
     final int halfWidth = width/2; 

     while ((halfHeight/inSampleSize) > reqHeight 
       && (halfWidth/inSampleSize) > reqWidth) { 
      inSampleSize *= 2; 
     } 
    } 

    return inSampleSize; 
} 

那麼這

bitmap.compress(Bitmap.CompressFormat.PNG, 10, fos); 

我如何壓縮位圖進一步?或 我應該壓縮字節[]嗎? 我只是想發送文件,黑色和白色。

回答

1

如果不需要alpha通道,則應該使用jpg而不是png。 你也可以改變你的輸出位圖的顏色配置:

// Decode bitmap with inSampleSize set 
options.inPreferredConfig= Bitmap.Config.RGB_565; 
options.inJustDecodeBounds = false; 
return BitmapFactory.decodeByteArray(data, 0, data.length, options); 
+0

有沒有其他選項可以設置使它變成灰度? –

+1

要將圖像轉換爲灰度,您可以在這裏查看: http://stackoverflow.com/questions/8381514/android-converting-color-image-to-grayscale 但是,這不會減少您的文件大小。 –

0

我知道這個問題有一段時間了,但是我想這個答案可以幫助別人。

有三種方法來壓縮你的圖片(以下簡稱「字節[]數據」你從相機收到):

1)PNG格式 - >這是最糟糕的選擇,當圖像出現很多不同的顏色,一般來說,當你拍照時就是這種情況。 PNG格式在像標識和類似這樣的圖像中更加有用。

代碼:

String filename = "" //THE PATH WHERE YOU WANT TO PUT YOUR IMAGE 
File pictureFile = new File(filename); 

try{ //"data" is your "byte[] data" 
    FileOutputStream fos = new FileOutputStream(pictureFile); 
    Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length); 
    bmp.compress(Bitmap.CompressFormat.PNG, 100, fos); //100-best quality 
    fos.write(data); 
    fos.close(); 
} catch (Exception e){ 
    Log.d("Error", "Image "+filename+" not saved: " + e.getMessage()); 
} 

2)JPG格式 - >這是與很多顏色的圖像更好的選擇(壓縮algoritm比PNG)有很大不同,但它不在某些情況下可能需要'alpha通道'。

有一個從前面的代碼只有一個變化:

bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos); //100-best quality 

3)的WebP格式 - >這是迄今爲止最好的格式。 PNG中的1.0 MB圖像可以壓縮到100-200KB(以JPG格式),而WebP中只能壓縮到30-50 KB。這種格式也有'alpha通道'。但這並不完美:一些瀏覽器與它不兼容。所以你必須在你的項目中注意這一點。

有一個從前面的代碼只有一個變化:

bmp.compress(Bitmap.CompressFormat.WEBP, 100, fos); //100-best quality 

注意

1)如果該水平壓縮的是不是足夠多,你可以用壓縮的質量發揮(您可以在bmp.compress()方法中看到'100'。請注意JPEG中的質量,因爲在某些情況下質量爲80%,您可以輕鬆看到圖像中的影響。在PNG和WebP格式中,損失百分比影響較小。

2)減小尺寸的另一種方法是調整圖像大小。我發現的最簡單的方法是通過Bitmap.createScaledBitmap方法(more info)簡單地創建一個更小的位圖。

3)最後一種方法是將圖像置於黑白中。您可以使用此方法做到這一點:

Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 

PS 1 - 如果有人想有關於Android中的圖像壓縮方法有較深造詣,我推薦這個演講柯爾特McAnlis在谷歌I/O 2016(link )。