以纵向模式拍照的setRotation(90)对三星设备不起作用

时间:2012-06-13 21:39:19

标签: android android-camera

根据文档,setRotation(90)应以横向模式旋转捕获的J​​PEG图片(takePicture

这在HTC手机上运行良好,但在三星Google Nexus S和三星Galaxy S3上无效。这是一个错误吗?

我知道我可以使用矩阵变换旋转,但希望操作系统能够更有效地执行此操作,并且不希望在其他设备上过度旋转。

修改

设置camera.setDisplayOrientation(90);使预览处于纵向模式,但它对拍摄的照片没有任何影响。

此外,除了setRotation之外,我还尝试设置图片大小 - 我用h w翻转parameters.setPictureSize(1200, 1600);。这也没有任何影响。

溶液

显然,三星手机设置了EXIF方向标签,而不是旋转单个像素。如ariefbayu所示,使用BitmapFactory读取位图不支持此标记。他的代码示例是解决方案,此解决方案也与使用inSampleSize兼容。

2 个答案:

答案 0 :(得分:34)

我尝试回答与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);
}

答案 1 :(得分:3)

Liso22,变量流没有什么区别,只需插入你的位图,但你得到它(decodeFile等)。如果您遇到'ImageUtil.rotate()问题,只需将'public static Bitmap rotate()'写成具有相同参数的方法,并使'真实图像'与之相等。无论如何,这个解决方案似乎对我不起作用,exif标签返回1(正常)无论是纵向还是横向。