Как 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 без добавления дополнительных зависимостей. 
Готовая функция из статьи 
тут, которую при желании вы можете использовать и у себя в проектах.