Как Telegram оптимизирует изображения перед отправкой#library #cases
Уверен, при использовании мессенджеров вы замечали, что они сжимают изображения на устройстве и отправляют их на сервер в худшем качестве, однако не настолько ужасном, чтобы значительно его ухудшить.
Некоторые из них дают возможность отправить файл целиком, и это очень удобно, если вы хотите продолжить работать с этим изображением.
Автор
статьи решил изучить вопрос и посмотреть, как Telegram делает такую оптимизацию. Покопавшись в коде, нашёл класс
ImageOptimizer
, который отвечает за алгоритм сжатия изображений. Он состоит из следующих шагов:
🔹
декодирование изображения из файла в Bitmap;
🔹
рассчёт коэффициента сжатия — в Telegram используется 1280 для обычных изображений и 90 для миниатюр;
🔹
рассчёт ближайшего inSampleSize — первый этап оптимизации изображений, где рассчитывается
BitmapFactory.Options.inSampleSize
на основании коэффициента из предыдущего шага. Поддерживается шаг кратный степени 2;
🔹
рассчёт Image Matrix — после предыдущего шага меняется ориентация изображения, чтобы применить к нему, если необходимо, дополнительные оптимизации. Делается это при помощи
Matrix
и
Exif
данных об изображении;
🔹
создание сжатого изображения — делается на основе передаваемых в функцию
BitmapFactory.Options
и
Matrix
, с которыми работал алгоритм на предыдущих шагах;
🔹
проверка на увеличение готового изображения — если созданное изображение имеет параметры, которые ниже минимальных значений, то его нужно увеличить;
🔹
сжатие и сохранение изображения — при помощи функции
Bitmap.compress()
осуществляется сжатие с заданными параметрами качества. В Telegram это
Bitmap.CompressFormat.JPEG
с качеством 80 для изображений и 50 для миниатюр.
На самом деле, всё выглядит не так страшно, как может показаться на первый взгляд, и радует, что используются только нативные способы сжатия, связанные с Android без добавления дополнительных зависимостей.
Готовая функция из статьи
тут, которую при желании вы можете использовать и у себя в проектах.