Мое растровое изображение поворачивается в Android после его масштабирования

Это мой код. Этот вопрос несколько связан с этим вопросом: Попытка масштабирования растровое изображение в Android не работает

Я закомментировал options.inSampleSize, и я все еще получаю вращение (по-видимому, против часовой стрелки на 90 градусов). Это похоже на довольно простое уменьшение изображения из документации Google, и я не уверен, как я получаю повернутое изображение.

Bitmap myBitmap = null;
        @Override
        protected byte[] doInBackground(Object... params) {


            final BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            //myImageByteArray is 4016 wide
            myBitmap = BitmapFactory.decodeByteArray(myImageByteArray, 0, myImageByteArray.length, options);
            if (options.outHeight > options.outWidth) {
                //options.inSampleSize = calculateInSampleSize(options, 640, 960);
            } else {
                //options.inSampleSize = calculateInSampleSize(options, 960, 640);
            }

            options.inJustDecodeBounds = false;

            //myImageByteArray is 4016 wide
            myBitmap = BitmapFactory.decodeByteArray(myImageByteArray, 0, myImageByteArray.length, options);

            //This log statement outputs around 1000 now. 
            Log.d("bitmap", myBitmap.getWidth()+"");
            ByteArrayOutputStream bAOS = new ByteArrayOutputStream();
            myBitmap.compress(CompressFormat.JPEG, 50, bAOS);

}

Байт[] изначально взят из библиотеки Commonsware CWAC Camera, и я попытался посмотреть по адресу: Android уменьшить размер изображения с камеры

ОБНОВИТЬ:

Я начал вытаскивать больше кода, чтобы попытаться сделать более очевидным, откуда может исходить это вращение. Я сузил это до этого. (Этот код по-прежнему вызывает вращение)

Bitmap myBitmap = null;
        @Override
        protected byte[] doInBackground(Object... params) {
            final BitmapFactory.Options options = new BitmapFactory.Options();

            myBitmap = BitmapFactory.decodeByteArray(myImageByteArray, 0, myImageByteArray.length, options);      
            ByteArrayOutputStream bAOS = new ByteArrayOutputStream();
            myBitmap.compress(CompressFormat.JPEG, 50, bAOS);

}

person Community    schedule 10.01.2014    source источник
comment
Предположительно, перед масштабированием его поворачивают на 90 градусов. Как вы подтвердили, что это не так?   -  person CommonsWare    schedule 10.01.2014
comment
Да, я подтвердил, что ЭТО ПРАВИЛЬНАЯ ориентация перед масштабированием.   -  person    schedule 10.01.2014
comment
@CommonsWare Я обновил свой вопрос после дальнейшего тестирования. Как вы думаете, может ли это делать метод .compress()?   -  person    schedule 10.01.2014
comment
Я скорее сомневаюсь. Насколько точно вы подтвердили, что ЭТО ПРАВИЛЬНАЯ ориентация перед ее масштабированием? Подсказка: если ответ «Я просмотрел изображение в программе просмотра изображений», это неправильный ответ. Я просмотрел изображение в средстве просмотра изображений и подтвердил, что в изображении нет заголовков EXIF, из-за которых средство просмотра изображений могло бы лучше повернуть изображение. Вы можете рассмотреть возможность загрузки изображений до и после и ссылки на них из своего ответа.   -  person CommonsWare    schedule 10.01.2014
comment
Я отправляю исходный байт [] на сервер и показываю его, и он идеален. После масштабирования и сжатия я делаю byte[] arr = bAOS.toByteArray(); и отправляю этот byte[] на сервер, показываю его, и он получается повернутым. Кроме того, @CommonsWare, ваша библиотека вернет байт [] с заголовком EXIF?   -  person    schedule 10.01.2014
comment
ваша библиотека вернет байт [] с заголовком EXIF? -- вполне возможно, в зависимости от устройства. Я пытаюсь нормализовать это, поворачивая изображение самостоятельно и удаляя заголовок EXIF, но я не знаю всех устройств, которым нужна эта работа. Вам нужно изучить ваши файлы изображений и посмотреть, есть ли в оригинале заголовок EXIF, который управляет ориентацией.   -  person CommonsWare    schedule 10.01.2014
comment
@CommonsWare Я тестировал это на своем устройстве (G2 с CM), но позаимствовал свой SO S3, и он работал нормально. Я предполагаю, что библиотека удаляет exif на S3, а не на G2.   -  person    schedule 10.01.2014
comment
G2 == LG G2? Не подскажете конкретную модель устройства? Также обратите внимание, что некоторые варианты поведения CyanogenMod будут отличаться.   -  person CommonsWare    schedule 10.01.2014
comment
device=vs980 (это модель vzw)   -  person    schedule 10.01.2014
comment
Спасибо. Есть ли место, где можно добавить устройства, которые мы лично протестировали, в этот список в файле readme? Или вы лично тестируете все эти устройства?   -  person    schedule 10.01.2014
comment
Те, что на README, проверены лично мной и моей армией обученных пыльных кроликов-убийц здесь, в моем Секретном горном логове (ТМ) (местоположение: секрет). У меня есть некоторые долгосрочные планы по упрощению предоставления информации о конфигурации устройства, подобной этой, но это стоит в очереди за выяснением более стабильной последовательности вызовов различных аппаратных API (чтобы попытаться устранить различные ошибки устройства), которые может оказать влияние на другие аспекты библиотеки.   -  person CommonsWare    schedule 10.01.2014
comment
Попался. Да, возможность предоставлять такую ​​информацию была бы ключевой. Много телефонов Android... только один @CommonsWare. С нетерпением жду следующих выпусков. Спасибо   -  person    schedule 10.01.2014


Ответы (1)


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

Если это не так, то у вас проблема с порядком байтов. В одном формате данные отображаются слева направо, а в другом — сверху вниз. Вам нужно изменить порядок байтов.

person Adam McCormick    schedule 10.01.2014
comment
Я подтвердил, что исходный byte[] имеет правильную ориентацию. Можете ли вы объяснить, почему вы думаете, что один формат дает мне данные LTR, а другой TTB? Или как мне переупорядочить байты? - person ; 10.01.2014
comment
Чтобы изменить порядок байтов, вам просто нужно перебрать массив и заполнить новый массив по строкам, а не по столбцам. Итак, объявите новый массив байтов того же размера, что и bAOS (назовите его target для этого объяснения), затем для каждого индекса i в массиве байтов bAOS (обр.) target[i%width*height + i/width] = arr[i] вам, возможно, придется перевернуть ширину и высоту в зависимости от того, какой формат хочет свои байты TTB, а который хочет их LTR. FWIW, это транспонирование изображения, поэтому, если изображение теперь зеркально отражено, то порядок байтов, вероятно, не был проблемой. - person Adam McCormick; 12.01.2014