setRotation(90) для съемки в портретном режиме не работает на устройствах Samsung

Согласно документации, setRotation (90) должен вращать захваченное изображение JPEG ( takePicture в альбомной ориентации).

Это отлично работает на телефоне HTC, но не работает на Samsung Google Nexus S и Samsung Galaxy S3. Это ошибка?

Я знаю, что могу использовать вращение с матричным преобразованием, но хочу, чтобы ОС могла делать это более эффективно, и не хочу рисковать чрезмерным вращением на некоторых других устройствах.

редактировать

настройка camera.setDisplayOrientation(90); сделал предварительный просмотр в портретном режиме, однако это не оказало никакого влияния на сделанный снимок.

Кроме того setRotation Я также попытался установить размер изображения - где я переворачиваю h с w: parameters.setPictureSize(1200, 1600);, Это также не имело никакого влияния.

решение

Очевидно, телефоны Samsung устанавливают тег ориентации EXIF, а не вращают отдельные пиксели. Как ariefbayu предложил, читая Bitmap используя BitmapFactory не поддерживает этот тег. Его пример кода является решением, и это решение также совместимо с использованием inSampleSize,

2 ответа

Решение

Я пытаюсь ответить на это в связи с тегом Exif. Вот что я сделал:

Bitmap realImage = BitmapFactory.decodeStream(stream);

ExifInterface exif=new ExifInterface(getRealPathFromURI(imagePath));

Log.d("EXIF value", exif.getAttribute(ExifInterface.TAG_ORIENTATION));
if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("6")){

    realImage=ImageUtil.rotate(realImage, 90);
}else if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("8")){
    realImage=ImageUtil.rotate(realImage, 270);
}else if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("3")){
    realImage=ImageUtil.rotate(realImage, 180);
}

ImageUtil.rotate():

public static Bitmap rotate(Bitmap bitmap, int degree) {
    int w = bitmap.getWidth();
    int h = bitmap.getHeight();

    Matrix mtx = new Matrix();
    mtx.postRotate(degree);

    return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
}

Liso22, переменная stream не имеет значения, просто подключите ваше растровое изображение, как бы вы его ни получили (decodeFile и т. Д.). И если у вас есть проблемы с ImageUtil.rotate(), просто напишите "public static Bitmap rotate()" как метод с теми же параметрами и сделайте "real image" равным этому. В любом случае, мне кажется, что это решение не работает, тэг exif возвращает 1 (нормальное) как в книжной, так и в альбомной ориентации.

Другие вопросы по тегам