Устройство Droid - не поворачивает изображение, снятое с камеры? (Камера.Параметры)

Я использую этот код камеры, чтобы попросить камеру повернуть данные захваченного изображения:

Camera.Parameters params = camera.getParameters();
params.set("rotation", 90);
camera.setParameters(params);

похоже, это работает на всех телефонах, кроме Droid. Кто-нибудь еще видел это? Данные изображения всегда альбомные, однако родное приложение камеры на Droid нормально создает портретные изображения.

Интересно, будет ли Droid уважать только новый метод Camera.Parameters.setRotation(), но он, похоже, доступен только на уровне API 5?


person Mark    schedule 19.12.2009    source источник


Ответы (3)


Поворот может быть просто сохранен в заголовке exif jpeg, как описано в документе setRotation. На Droid это действительно так. Вы можете использовать инструменты чтения заголовков jpeg, такие как jhead, чтобы проверить это. Вы также можете использовать ExifInterface API для чтения тега ориентации в вашем программа.

person Community    schedule 20.12.2009
comment
пытался использовать API для exif, но не смог сохранить изменения. Я вообще не могу заставить вращение работать на фотографиях с камеры. Очень раздражает. - person Brenden; 16.03.2011

setRotation также не работал у меня на Nexus One, но я заставил поворот изображения работать, следуя примеру самого приложения "Камера" для Android.
Исходный код доступен здесь: https://android.googlesource.com/platform/packages/apps/Camera

Начните с Camera.java, но вы также будете рассматривать ImageManager.java, Util.java и другие файлы.

Основная идея заключается в том, что вы слушаете изменения ориентации и фиксируете ориентацию в момент, когда вы делали снимок. Затем, когда вы получаете байты изображения в обратном вызове, вы манипулируете растровым изображением, выполняя поворот растрового изображения. Затем конвертируйте повернутое растровое изображение обратно в jpeg. Когда вы закончите, вам придется скопировать шокирующее количество кода из приложения камеры только для этого поворота.

person Corey Trager    schedule 14.02.2010

Droid работает под управлением Android 2.0 (теперь 2.0.1) с уровнями API 5 и 6 соответственно.

Так что вполне возможно, что Droid уважает только (более разумный) 2.0+ API для ротации.

Однако я предполагаю, что вас беспокоит совместимость с различными типами устройств и версиями ОС, поэтому я полагаю, что вам придется вызывать API 2.0+ через отражение после определения версии ОС (используя android.os.Build.VERSION_CODES).

person Christopher Orr    schedule 20.12.2009
comment
Ух ты, это звучит не очень приятно — может, мне вместо этого просто начать использовать 2.0 API (похоже на уровень 6), а если я увижу API ‹ 6, то вместо этого использовать этот вызов параметров? Я не знаю, могу ли я пойти в другом направлении? Спасибо - person Mark; 20.12.2009