我正在尝试拍照并将位图设置为imageview。但是生成的位图在不同的设备中以不同的方式旋转。
一个是三星j5素数(180度) 一个是LG G3(正常,因为我根据此设备编写代码) 两者都有android 6.0(实际上samsuung有6.0.1,但我认为它没有任何区别)
这是我的代码:
private int findImageRotation(Uri uri) throws IOException {
ExifInterface ei = new ExifInterface(uri.getPath());
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
int degree = 0;
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_NORMAL:
default:
break;
}
return degree;
}
private Bitmap rotateImage(Bitmap source, float angle) {
Matrix matrix = new Matrix();
matrix.postRotate(angle);
return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);
}
private void imageToBase64(final Uri uri, final Base64ConvertListener listener) {
new Handler().post(new Runnable() {
@Override
public void run() {
Bitmap bitmap;
try {
int degree = findImageRotation(uri);
bitmap = BitmapFactory.decodeStream(getContext().getContentResolver().openInputStream(uri));
bitmap = rotateImage(bitmap, degree - 90);
if (bitmap != null) {
String extension = getMimeType(getContext(), uri);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
if (extension.toLowerCase().contains("png"))
bitmap.compress(Bitmap.CompressFormat.PNG, 50, byteArrayOutputStream);
else if (extension.toLowerCase().contains("jpg") || extension.toLowerCase().contains("jpeg"))
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, byteArrayOutputStream);
ivHostImage.setImageBitmap(bitmap);
byte[] byteArray = byteArrayOutputStream.toByteArray();
listener.onConvertedToBase64("data:" + extension + ";base64," + Base64.encodeToString(byteArray, Base64.DEFAULT));
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
答案 0 :(得分:1)
我已经把这个问题搞得好几天了。最后我发现了这个答案。 See it.
答案 1 :(得分:0)
你试过手动旋转它们吗?
ExifInterface exif;
try {
exif = new ExifInterface(photoPath);//uri.getPath()
}
catch (IOException e) {
e.printStackTrace();
exif = null;
}
if(exif!=null){
orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
}
//get Bitmap
Bitmpam bitm = ..... ;
//i think in your example
//is like : bitmap = BitmapFactory.decodeStream(getContext().getContentResolver().openInputStream(uri));
if(orientation==8){//exception1
Matrix matrix = new Matrix();
matrix.postRotate(270);
bitm = Bitmap.createBitmap(bitm, 0, 0, bitm.getWidth(), bitm.getHeight(), matrix, true);
}
if(orientation==6){//exception2
Matrix matrix = new Matrix();
matrix.postRotate(90);
bitm = Bitmap.createBitmap(bitm, 0, 0, bitm.getWidth(), bitm.getHeight(),matrix,true);
}
if(orientation==3){//exception3
Matrix matrix = new Matrix();
matrix.postRotate(180);
bitm = Bitmap.createBitmap(bitm, 0, 0, bitm.getWidth(), bitm.getHeight(),matrix,true);
}
它对我有用。