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

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

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

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

изменить

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

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

Решение

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

Ответ 1

Я пытаюсь ответить на это по отношению к тегу 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);
}

Ответ 2

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