bitmap.compress(Bitmap.CompressFormat.PNG, 0, fOut) делает размер изображения больше исходного

Я хочу сжать изображение, снятое с камеры, в формат png, чтобы уменьшить его размер, поэтому я использую этот код:

compressedPictureFile = new File(imagePath);
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
FileOutputStream fOut = new FileOutputStream(compressedPictureFile);
boolean compressed = bitmap.compress(Bitmap.CompressFormat.PNG, 0, fOut);
fOut.flush();
fOut.close();

Проблема в том, что сжатыйPictureFile на самом деле больше, чем исходное изображение (от 1 МБ до 6 МБ).

Что мне не хватает? И это лучший способ уменьшить размер изображения?

Спасибо


person Dany Y    schedule 23.04.2013    source источник


Ответы (2)


Изображения, сделанные камерой, скорее всего, хранятся в формате jpg, который является с потерями, но относительно хорош для изображений с большим количеством цветов (например, фотографий).

При сжатии растрового изображения с помощью вашего метода вы сохраняете его как png. Сжатие png происходит без потерь, но может достигать довольно небольших размеров файлов, когда цветов мало (например, в некоторых логотипах или другой графике). Когда количество цветов и сложность в png-файле увеличивается, увеличивается и размер файла (именно поэтому камера сохраняет jpg — соотношение качество/размер файла намного лучше, чем png для большинства фотографий).

Итак, если вы хотите уменьшить размер фотографий, используйте сжатие jpg и поэкспериментируйте с параметром качества. Вы также можете уменьшить разрешение изображений, так как это сэкономит много места (файл с разрешением 50% будет занимать примерно 25% размера данных).

person Jave    schedule 23.04.2013
comment
Является ли параметр качества таким же, как разрешение? как уменьшить разрешение? - person Dany Y; 23.04.2013
comment
Параметр quality влияет на то, насколько хорошо будут сохраняться цвета при использовании jpg-сжатия. Это не имеет никакого эффекта при выводе png. Вы можете немного прочитать о методе compress здесь: developer.android.com/reference/android/graphics/ - person Jave; 23.04.2013
comment
Существует множество руководств по уменьшению размера изображения, но самый простой способ — просто создать новое растровое изображение меньшего размера с помощью Bitmap.createScaledBitmap: developer.android.com/reference/android/graphics/ - person Jave; 23.04.2013
comment
если вы используете формат PNG, то он не будет сжимать ваше изображение, потому что PNG — это формат без потерь. используйте JPEG для сжатия изображения - person Adeel; 18.09.2016
comment
@Adeel, PNG использует сжатие без потерь. - person Jave; 19.09.2016
comment
@Jave дорогой, то же самое, о чем я упоминал в своем комментарии выше :) - person Adeel; 21.09.2016

он отлично работает в моем приложении

    public static String makeScreen(View view) throws Exception {
    String filename = "file.png";
    view.setDrawingCacheEnabled(true);
    view.buildDrawingCache();
    Bitmap b = view.getDrawingCache();
    FileOutputStream file = null;

    try {
        file = new FileOutputStream(Environment.getExternalStorageDirectory().toString() + "folder/" + filename);
        if (file != null) {
            b.compress(Bitmap.CompressFormat.PNG, 98, file);
            file.close();
        }
        view.destroyDrawingCache();
    } catch (Exception e) { view.destroyDrawingCache(); }
}
person Роман Зыков    schedule 05.02.2018