2013-08-20 6 views
1

Я устанавливаю вращения для камеры:Поворот изображения с камеры андроида

stopPreview(); 
Camera.Parameters p = mCamera.getParameters(); 
p.setRotation(90); 
mCamera.setParameters(p); 
startPreview(); 

Фото взято, когда устройство находится в горизонтальном положении. Мне нужна фотография, повернутая по вертикали. Но когда я сохраняю jpeg, он никогда не вращается, он всегда горизонтальный.

protected void onJpegPicture(byte[] data, int width, int height) { 
    saveJpeg(data, file); 
} 

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

setRotation параметр не имеет значения. Я пробовал все возможные значения (0, 90, 180, 270).

ответ

3

Фрагмент кода, вы должны работать, если вы звоните SetParameters() перед вызовом takePicture(). Вы можете попробовать установить параметры прямо перед вызовом takePicture, а не перед запуском предварительного просмотра, но это не имеет значения.

Обратите внимание, что вы, вероятно, не хотите использовать здесь 90, так как ориентация изображения определяется относительно ориентации датчика, а не на текущую ориентацию пользовательского интерфейса. И зависит ли датчик от портрета или пейзажа от вашего устройства - вы можете проверить это с помощью CameraInfo.orientation. Тем не менее, вы должны увидеть эффект, если вы пробовали все значения вращения.

В каких устройствах вы видите это поведение? Также, как вы просматриваете окончательное изображение? Некоторые зрители изображений по-прежнему не правильно интерпретируют поле вращения JPEG, хотя на самом деле приложение галереи на устройстве действительно должно (особенно если это приложение по умолчанию).

+0

Теперь мне не нужно правильное вращение, я хочу вращение вообще - таким образом, я использовал 90 в качестве вращения (и пробовал другие постоянные значения). Это не работает на sony xperia. Я нашел в Интернете, что это обычная проблема с другими телефонами. Производители не выполняют требования к андроидам о ротации фотографий. Не имеет значения, если я делаю снимок, когда мой телефон ориентирован горизонтально или вертикально, и не имеет значения, какое вращение у меня установлено. Я всегда получаю ориентированное изображение по горизонтали. – Ari

+0

Мы добавили лучшие тесты для этого в новых версиях Android, поэтому, по крайней мере, более новые устройства больше не должны выставлять эти проблемы. –

+0

Я думаю, проблема в том, что iterpreting exif правильно. – Ari

0

Используйте этот метод, передав ей в Image себя и rotation degree что 90 в вашем случае

public static Image rotate(Image img, double angle){ 
    double sin = Math.abs(Math.sin(Math.toRadians(angle))), cos = Math.abs(Math.cos(Math.toRadians(angle))); 
    int w = img.getWidth(null), h = img.getHeight(null); 
    int neww = (int) Math.floor(w * cos + h * sin), newh = (int) Math.floor(h 
     * cos + w * sin); 
    BufferedImage bimg = toBufferedImage(getEmptyImage(neww, newh)); 
    Graphics2D g = bimg.createGraphics(); 
    g.translate((neww - w)/2, (newh - h)/2); 
    g.rotate(Math.toRadians(angle), w/2, h/2); 
    g.drawRenderedImage(toBufferedImage(img), null); 
    g.dispose(); 
    return toImage(bimg); 
} 
+0

Я не хочу делать это вручную. Вращающееся изображение на 90x - простая задача, поэтому все методы, способные вращаться в любой степени, слишком сложны для этого. Кроме того, устройства Android имеют низкую память. Я не хочу хранить в памяти две копии img (до и после вращения). Я не хочу тратить время на сохранение и загрузку img с диска. – Ari

+0

Существует не лучший способ решить вашу проблему. 'setRotation' не гарантирует правильное вращение изображения. Вы должны изменить размер изображений вручную. – Dalinaum

2

Постарайтесь как с камерой, так и с предварительным просмотром. то есть

//rotate preview 
camera.setDisplayOrientation(90); 
//rotate camera 
Camera.Parameters p = camera.getParameters(); 
p.setRotation(90); 
camera.setParameters(p); 

Протестировано на нескольких устройствах HTC, и это работает.

+0

Да, его работа с моим Samsung Galaxy S4 также. Это зависит от устройства? – AjayR

Смежные вопросы