我制作了自定义相机应用程序,我想在ImageView上显示图片。我在3种不同的手机上推出了我的程序(HTC Desire Z,Galaxy S4和Galaxy S2)。 在HTC上,图像的方向在ImageView中受到尊重,但与Galaxys无关。
我的程序是这样的:
- >我用自定义相机应用程序拍照
- >我根据手机方向设置了图片的EXIF标志(OrientationEventListener):
switch(getOrientation(rot)){
case VERTICAL_ENDROIT : params.setRotation(90); break;
case HORIZONTAL_ENDROIT : params.setRotation(0); break;
case VERTICAL_ENVERS : params.setRotation(270); break;
case HORIZONTAL_ENVERS : params.setRotation(180); break;
}
camera.setParameters(params);
此功能在所有手机上运行良好,它们都被检测到并指定正确的方向。
- >我将其保存为JPG格式
- >我将图片发送到ImageView
Bitmap bm2 = BitmapFactory.decodeFile(photoItem.getPathPhoto(),options);
imageView.setImageBitmap(bm2);
使用Galaxy,ImageView上的Orientation始终相同,对应于params.setRotation(0)。没问题HTC。
所以我试着在将图片发送到ImageView之前查看图片的exif标志:
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
奇怪的是,使用HTC时,方向始终为0值,而三星方向获得正确的值(1 3 6 8)。
结论: 使用Galaxy Phones EXIF方向值可以,但ImageView上的方向不好。
使用HTC手机EXIF方向值为false,但方向正常。 (wtf?)
感谢您的回答:)
PS:我不想使用Matrix或图像处理的东西,因为我的CPU /内存资源非常低
答案 0 :(得分:0)
try {
final File f = new File(directory, name);
ExifInterface ei = new ExifInterface(f.getAbsolutePath());
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
try {
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
b = RotateBitmap(b, 90);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
b = RotateBitmap(b, 180);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
b = RotateBitmap(b, 270);
break;
// etc.
}
} catch (OutOfMemoryError err) {
} catch (Exception e) {
}
return b;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
public static Bitmap RotateBitmap(Bitmap source, float angle) {
Matrix matrix = new Matrix();
matrix.postRotate(angle);
source = Bitmap.createBitmap(source, 0, 0, source.getWidth(),
source.getHeight(), matrix, true);
if (source != null) {
b = null;
}
return source;
}
此代码将执行您所需的功能。
答案 1 :(得分:0)
尝试以下代码
try {
File f = new File(imagePath);
ExifInterface exif = new ExifInterface(f.getPath());
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
int angle = 0;
if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
angle = 90;
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
angle = 180;
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
angle = 270;
}
Matrix mat = new Matrix();
mat.postRotate(angle);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bmp = BitmapFactory.decodeStream(new FileInputStream(f),
null, options);
bitmap = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(),
bmp.getHeight(), mat, true);
ByteArrayOutputStream outstudentstreamOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100,
outstudentstreamOutputStream);
imageView.setImageBitmap(bitmap);
} catch (IOException e) {
Log.w("TAG", "-- Error in setting image");
} catch (OutOfMemoryError oom) {
Log.w("TAG", "-- OOM Error in setting image");
}
答案 2 :(得分:0)
好吧,我发现为什么方向与Galaxy和HTC不一样。 HTC不使用EXIF标志来定位图片。图片以正确的方向原生保存。