Android метод растрового сжатия возвращает изображение одинакового размера даже при разном значении качества - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь масштабировать, а затем сжать файл изображения в формате PNG, формат изображения с камеры - JPG, и он успешно масштабируется, но все еще не преобразуется в PNG. Во-вторых, я думаю, что метод compress возвращает разные размеры byteArray для разного качества, но я получаю одинаковые размеры даже при изменении значения параметра качества.

Вот метод, который я написал:

   fun compressImage(file: File): File {
        val outputBounds = 600
        val scaleOptions = BitmapFactory.Options()
        scaleOptions.inJustDecodeBounds = true
        BitmapFactory.decodeFile(file.path, scaleOptions)

        val scaleFactor =   if(scaleOptions.outHeight > outputBounds || scaleOptions.outWidth > outputBounds)
                                        kotlin.math.max(scaleOptions.outWidth/outputBounds, scaleOptions.outHeight/outputBounds)
                                    else 1

        val outOptions = BitmapFactory.Options()
        outOptions.inSampleSize = scaleFactor.roundToInt()
        outOptions.inPreferredConfig = Config.RGB_565;
        outOptions.inDither = true;
        val decodedBMP = BitmapFactory.decodeFile(file.path, outOptions)

        var byteOutStream = ByteArrayOutputStream()
        val newFile = File(file.path)
        val fileOutputStream = FileOutputStream(newFile, false)
        var quality = 60
        decodedBMP.compress(Bitmap.CompressFormat.PNG, quality, byteOutStream)

        fileOutputStream.write(byteOutStream.toByteArray())
        fileOutputStream.flush()

        fileOutputStream.close()
        return newFile
    }

Я передал файл в качестве параметра и перезаписал файл сжатым изображением.

Обновление

Я попытался использовать Bitmap.CompressFormat.JPEG в качестве конфигурации сжатия растрового изображения и это сжимает размер изображения, но с явно ухудшающимся качеством (я имею в виду, что изображение выглядит как пиксельное), я прочитал Bitmap.CompressFormat.PNG, который дает вам сжатие без потерь, но оно не работает.

1 Ответ

0 голосов
/ 28 марта 2020

В справочных документах Android для разработчиков указано:

JPEG Добавлен в API уровня 1 publi c stati c final Bitmap.CompressFormat JPEG Сжатие в формате JPEG. качество 0 означает компресс для наименьшего размера . 100 означает сжатие для максимального визуального качества .

PNG Добавлено в API уровня 1 publi c stati c final Bitmap.CompressFormat PNG Сжатие в формат PNG. PNG без потерь, поэтому качество игнорируется.

Вот ответ. Поскольку качество игнорируется. Сжать в формат. PNG без потерь, что означает, что он не будет сжиматься.

...