根据文档,setRotation(90)应以横向模式旋转捕获的JPEG图片(takePicture。
这在HTC手机上运行良好,但在三星Google Nexus S和三星Galaxy S3上无效。这是一个错误吗?
我知道我可以使用矩阵变换旋转,但希望操作系统能够更有效地执行此操作,并且不希望在其他设备上过度旋转。
修改
设置camera.setDisplayOrientation(90);
使预览处于纵向模式,但它对拍摄的照片没有任何影响。
此外,除了setRotation
之外,我还尝试设置图片大小 - 我用h
w
翻转parameters.setPictureSize(1200, 1600);
。这也没有任何影响。
溶液
显然,三星手机设置了EXIF方向标签,而不是旋转单个像素。如ariefbayu
所示,使用BitmapFactory
读取位图不支持此标记。他的代码示例是解决方案,此解决方案也与使用inSampleSize
兼容。
答案 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(正常)无论是纵向还是横向。