Как оптимизировать изображение, как Facebook и WhatApp?

Я хочу оптимизировать размер файла изображения, например, whatsapp и facebook. Я отправил 5MB изображение на whatsapp, а полученное изображение имеет размер 80 КБ. Полученное изображение выглядит идентично оригиналу, но разрешение меньше исходного.

Я попробовал почти все исходные коды сжатия изображений для Android, доступные для stackoverflow, но это не работает для меня. А затем я натолкнулся на эту ссылку, чтобы оптимизировать изображение, что делает хорошую работу, но все же не получает результат, как whatsapp.

Как я могу достичь максимального сжатия изображения, не ухудшая качество изображения? То же, что и Whatsapp?

Ответ на исходный код будет очень полезен.

Спасибо заранее.

Ответ 1

Вам нужно декодировать изображение (растровое изображение)

Вот код.

public Bitmap  decodeFile(String path) {
        // Decode image size
        int orientation;
        try {
            if (path == null) {
                return null ;
            }
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            // Find the correct scale value. It should be the power of 2.
            final int REQUIRED_SIZE = 70;
            int width_tmp = o.outWidth, height_tmp = o.outHeight;
            int scale = 0;
            while (true) {
                if (width_tmp / 2 < REQUIRED_SIZE
                        || height_tmp / 2 < REQUIRED_SIZE)
                    break;
                width_tmp /= 2;
                height_tmp /= 2;
                scale++;
            }
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            Bitmap bm = BitmapFactory.decodeFile(path, o2);
            Bitmap bitmap = bm;
            ExifInterface exif = new ExifInterface(path);
            orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);

            Log.e("orientation", "" + orientation);
            bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),bm.getHeight(), null, true);
            ImageViewChooseImage.setImageBitmap(bitmap);
            bitmapfinal = bitmap;
            return bitmap ;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }

Ответ 2

Преобразуйте изображение в Растровое изображение и используйте метод compress(), чтобы сжать его до определенного качества. Чтобы сохранить качество изображения, уменьшите его, используя соотношение сторон его высоты и ширины. Вы можете использовать ниже код: где data - массив байтов изображения

Bitmap screen = BitmapFactory.decodeByteArray(data, 0,
                    data.length);
            float oHeight = screen.getHeight();
            float oWidth = screen.getWidth();
            float aspectRatio = oWidth / oHeight;
            int newHeight = 0;
            int newWidth = 0;
            newHeight = 450;
            newWidth = (int) (newHeight * aspectRatio);
            screen = Bitmap.createScaledBitmap(screen, newWidth, newHeight,
                    true);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
            screen.compress(Bitmap.CompressFormat.JPEG, 50, bos);