Android: BitmapFactory изменяет размеры изображения при декодировании из ByteArray

Я конвертирую изображение Android, захваченное в моем приложении, в растровое изображение. Я делаю это, получая буфер изображения из пиксельной плоскости изображения, а затем использую BitMapFactory для его декодирования в растровое изображение. Однако при этом разрешение изображения изменяется с 1920 x 1440 до 1800 x 1600, при этом верхняя и нижняя части изображения обрезаются. Здесь показан код метода.

`protected void getImageFromBuffer(ImageReader reader){
    Image image = null;
    image = reader.acquireLatestImage();

    ByteBuffer buffer = image.getPlanes()[0].getBuffer();
    System.out.println("Getting Image Ready");


    synchronized (this){
        image_to_upload = new byte[buffer.capacity()];
        buffer.get(image_to_upload);

        Bitmap storedBitmap = BitmapFactory.decodeByteArray(image_to_upload, 0, image_to_upload.length, null);

        Matrix mat = new Matrix();
        mat.postRotate(jpegOrientation);  // angle is the desired angle you wish to rotate
        storedBitmap = Bitmap.createBitmap(storedBitmap, 0, 0, storedBitmap.getWidth(), storedBitmap.getHeight(), mat, true);
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        storedBitmap.compress(Bitmap.CompressFormat.JPEG,70, byteArrayOutputStream);
        image_to_upload = byteArrayOutputStream.toByteArray();

        image_ready = true;
        System.out.println("Image Ready");
    }

}`

Отладка показывает, что высота и ширина изображения верны до преобразования буфера в растровое изображение, но размеры растрового изображения неверны сразу после decodeByteArray. Кто-нибудь может подсказать, почему это может быть? Я проверил размеры перед применением матричного преобразования.

РЕДАКТИРОВАТЬ: Чтобы добавить дополнительные сведения, я попытался использовать BitmapFactory.Options(), чтобы отключить масштабирование или установить целевую плотность, и это не повлияло на результирующее растровое изображение, оно всегда имеет размер 1800 x 1600.


person Birdfriender    schedule 10.05.2021    source источник
comment
Я уверен, что вы получите желаемый результат, если прокомментируете строку mat.postRotate(jpegOrientation); правильно? Тогда используйте Matrix#postScale(). См. примеры здесь.   -  person Darkman    schedule 13.05.2021
comment
@Darkman, соотношение сторон неправильное даже до применения поворота, я проверил значения до и после. Высота и ширина сохраненного битмапа составляют 1600 x 1800, а не 1920 x 1440. Я не уверен, что масштабирование изображения поможет, так как части изображения обрезаются по всем признакам.   -  person Birdfriender    schedule 14.05.2021
comment
Я думаю, проблема в том, что вы получаете ширину и высоту после манипуляций с матрицей. Попробуйте сохранить их в своей собственной переменной.   -  person Darkman    schedule 14.05.2021
comment
@Darkman Я проверяю ширину и высоту перед манипуляциями с матрицей. Я попытался удалить строку, как вы предложили, и происходит то же самое.   -  person Birdfriender    schedule 17.05.2021
comment
Каков источник изображения?   -  person msbit    schedule 20.05.2021


Ответы (1)


Вы можете изменить некоторые параметры, которые влияют на результирующее разрешение вашего растрового изображения, используя параметр Options для decodeByteArray:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inDensity =  DisplayMetrics.DENSITY_XXHIGH;//for example
    
BitmapFactory.decodeByteArray(image_to_upload, 0, image_to_upload.length, options);
person Ar1sartori    schedule 19.05.2021