37

根据文档,setRotation(90)应该旋转捕获的 JPEG 图片(横向模式下的takePicture .

这适用于 HTC 手机,但不适用于三星 Google Nexus S 和三星 Galaxy S3。这是一个错误吗?

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

编辑

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

此外,此外setRotation,我还尝试设置图片大小 - 我hw:翻转的位置parameters.setPictureSize(1200, 1600);。这也没有任何影响。

解决方案

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

4

2 回答 2

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);
}
于 2012-06-13T23:33:58.880 回答
3

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

于 2013-05-23T03:20:09.620 回答