Android: BitmapFactory.decodeByteArray - снижает качество изображения - PullRequest
0 голосов
/ 20 июня 2019

Это мой вариант использования:

ByteArray ba; // Some value is assigned here
Bitmap bitmap = BitmapFactory.decodeByteArray(ba, 0, ba.length);

Поскольку объект ByteArray имеет большой размер, исключение OutOfMemoryError выдается во второй строке при выполнении:

BitmapFactory.decodeByteArray(ba, 0, ba.length);

Уже пробовал:

ByteArray ba; // Some value is assigned here
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4; //or whatever value
Bitmap bitmap = BitmapFactory.decodeByteArray(ba, 0, ba.length, options);

Проблема с этим решением заключается в том, что при использовании атрибута inSampleSize он исключает исключение OutOfMemoryError, но растровое изображение размер (размеры: ширина х высота) уменьшен.

Вместо этого я ищу что-то похожее на это:

bitmap.compress(Bitmap.CompressFormat.JPEG, 50, stream);

В этом примере качество растрового изображения уменьшается, НО его размер остается прежним.Когда я отображаю его в ImageView:

iv.setImageBitmap(bitmap);

Он занимает то же место, что и оригинал, но с половиной качества.

Проблема в том, чтов моем случае я не могу использовать bitmap.compress, потому что мое растровое изображение null .То есть метод compress можно использовать после у вас есть действительный объект Bitmap, что не соответствует моему случаю.

Вопрос:

Есть ли какое-либо решение, использующее BitmapFactory.Options, которое может привести к тому же результату, что и bitmap.compress: ниже quality, то же самое dimensions?

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Есть ли какое-либо решение, использующее BitmapFactory.Options, которое может привести к тому же результату, что и bitmap.compress: более низкое качество, те же размеры?

Не совсем.Bitmap является несжатым по своей природе.

Проблема в том, что в моем случае я не могу использовать bitmap.compress, потому что мое растровое изображение равно нулю.

Выпутают закодированное изображение JPEG с Bitmap.Закодированное изображение JPEG сжимается.A Bitmap нет.A Bitmap всегда использует память в зависимости от ширины, высоты и количества бит на пиксель.

Вы можете использовать другое количество бит на пиксель.BitmapFactory использует ARGB_8888 (32 бита / пиксель).Вы можете переключиться на RGB_565 (16 бит / пиксель), если ваше изображение не имеет альфа-канала и вы можете жить с уменьшенным диапазоном цветов.

В противном случае, единственный вариант - уменьшить размер (ширину).и высота) изображения.

0 голосов
/ 20 июня 2019

Вы не можете сжать растровое изображение так, как хотите.

Возможно, вы уже знаете это - но да!с помощью этого метода вы можете найти соответствующий параметр inSampleSize, чтобы поддерживать качество в зависимости от размера.

public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) >= reqHeight
                && (halfWidth / inSampleSize) >= reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}

Этот метод выбран из Эффективная загрузка больших изображений Android .

Вы можете прочитать больше о передаче Бимапа здесь

...