Как использовать различное сжатие изображения для изображений разных размеров в android - PullRequest
0 голосов
/ 24 апреля 2020

Я хочу сжать изображения, которые я выбрал из галереи в android в соответствии с их размерами, и загрузить их в облачное хранилище. Например, если размер изображения, которое я выбираю, составляет 300 КБ, я не уменьшаю его и сохраняю качество 100, но если оно равно 7 МБ, я хочу уменьшить его до 10 качества, и я хочу установить максимальный размер до 7 МБ выбранного изображения ( оригинал без сжатия) и аналогично помещая различные условия на размеры между ними.

Мой код

if (resultCode == RESULT_OK) {
    resultUri = result.getUri();

    File f = new File(resultUri.getPath());
    long sizeUri = f.length()/1024;

    try {
         bitmap = ImageDecoder.decodeBitmap(ImageDecoder.createSource(getContentResolver(),resultUri));
    } catch (IOException e) {
        e.printStackTrace();
    }

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    int baossize= baos.size()/1024;
    byte[] uploadbaos = baos.toByteArray();
    int lengthbmp = (uploadbaos.length);
    int size= lengthbmp/1024;

    Log.d(TAG,"baossize:  "+baossize+"   ByteArray: "+size+"  UriSize:  "+sizeUri);

    // UploadingImage();
}

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Просто сделайте это:

int quality;
if (sizeUri <= 300)
    quality = 90;
else if (sizeUri <= 1000)
    quality = 80;
else if (sizeUri <= 2000)
    quality = 70;
else if (sizeUri <= 3000)
    quality = 50;
else
    quality = 30;
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);

Обратите внимание, что качество JPEG 100, вероятно, слишком высокое, а ниже 30 может быть очень размытым.

1 голос
/ 24 апреля 2020

Здесь в данном примере вы можете установить максимальный размер, как в вашем случае это может быть 7 МБ.

public static boolean reduceImage(String path, long maxSize) {
    File img = new File(path);
    boolean result = false;
    BitmapFactory.Options options = new BitmapFactory.Options();
    Bitmap bitmap = null;
    options.inSampleSize=1;
    while (img.length()>maxSize) {
        options.inSampleSize = options.inSampleSize+1;
        bitmap = BitmapFactory.decodeFile(path, options);
        img.delete();
        try
            {
                FileOutputStream fos = new FileOutputStream(path);
                img.compress(path.toLowerCase().endsWith("png")?
                                Bitmap.CompressFormat.PNG:
                                Bitmap.CompressFormat.JPEG, 100, fos);
                fos.close();
                result = true;
             }catch (Exception errVar) { 
                errVar.printStackTrace(); 
             }
    };
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...