2021-08-02 20:05:00
Как 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 без добавления дополнительных зависимостей.
Готовая функция из статьи тут, которую при желании вы можете использовать и у себя в проектах.
1.8K views17:05