2013-12-15 3 views
3

Я написал этот метод, прежде чем я заметил, что в классе Bitmap существует метод сжатия.Android Сжатие растрового изображения

/** 
* Calcuate how much to compress the image 
* @param options 
* @param reqWidth 
* @param reqHeight 
* @return 
*/ 
public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth, int reqHeight) { 

    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; // default to not zoom image 

    if (height > reqHeight || width > reqWidth) { 
      final int heightRatio = Math.round((float) height/ (float) reqHeight); 
      final int widthRatio = Math.round((float) width/(float) reqWidth); 
      inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; 
    } 
     return inSampleSize; 
} 

/** 
* resize image to 480x800 
* @param filePath 
* @return 
*/ 
public static Bitmap getSmallBitmap(String filePath) { 

    File file = new File(filePath); 
    long originalSize = file.length(); 

    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(filePath, options); 

    // Calculate inSampleSize based on a preset ratio 
    options.inSampleSize = calculateInSampleSize(options, 480, 800); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 

    Bitmap compressedImage = BitmapFactory.decodeFile(filePath, options); 


    return compressedImage; 
} 

Мне было интересно, сравнить встроенный Compress метод, я должен продолжать использовать этот, или переключиться на использование встроенной в одном? в чем разница?

+0

проверьте это http://stackoverflow.com/questions/31156501/what-is-the-difference-between-compressing-image-and-resizing-image-android –

ответ

2

Ваш метод в соответствии с Loading Large Bitmap руководящими принципами

  • Большой файл на диске
  • Малый растровый в памяти

компресс() методы преобразования большого растрового изображения в небольшом одном:

  • Большая растровая карта в памяти
  • Малый растровый на диске (IOStream) (и, возможно, в другом формате)

Я хотел бы использовать свой метод, если мне нужно, чтобы загрузить растровое изображение из файла в ImageViews разных размеров.

+0

Хммм, на самом деле я только что прошел тест, и это похоже, что мой код не уменьшит карту –

+0

Может быть, ваше растровое изображение уже достаточно мало? Кроме того, в вашем вычисленииInSampleSize() отсутствует цикл итерации. Просто скопируйте и вставьте код Google в качестве отправной точки. – Y2i

2

Basically

Что вы делаете в коде выше, это просто изменение размера изображения, которое будет не потерять большую часть качества изображения, так как вы используете SampleSize.

compress(Bitmap.CompressFormat format, int quality, OutputStream stream)

Он используется, когда вы хотите изменить imageFormat у вас есть Bitmap.CompressFormat JPEG
Bitmap.CompressFormat PNGBitmap.CompressFormat WEBP или уменьшить quality изображения с помощью параметра 0 - 100quality.

Смежные вопросы