在 imageview 中使用时从相机或画廊拍摄的图片其方向发生变化,有时在 Android 中会垂直拉伸
Posted
技术标签:
【中文标题】在 imageview 中使用时从相机或画廊拍摄的图片其方向发生变化,有时在 Android 中会垂直拉伸【英文标题】:Picture taken from camera or gallery when using in imageview its orientation getting changed, and sometimes vertically stretched in Android 【发布时间】:2013-05-19 21:39:47 【问题描述】:在我的应用程序中,我必须从相机捕获图像或从图库导入,在活动的 imageview 中显示它。一切都很好,我从两者都得到图像,并且能够毫无例外地在 imageview 上设置它。但有时图像无法正确缩放并垂直拉伸或改变方向。请帮帮我。
这是我从官方 android 文档中引用的解码图像的代码:
public static Bitmap decodeSampledBitmapFromResource(File photoFile, int reqWidth, int reqHeight)
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
try
BitmapFactory.decodeStream(new FileInputStream(photoFile), null,
options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth,
reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeStream(new FileInputStream(photoFile),
null, options);
catch (FileNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
return null;
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight)
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth)
// Calculate ratios of height and width to requested height and
// width
final int heightRatio = Math.round((float) height
/ (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
// Choose the smallest ratio as inSampleSize value, this will
// guarantee
// a final image with both dimensions larger than or equal to the
// requested height and width.
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
return inSampleSize;
【问题讨论】:
【参考方案1】:图像具有不同的方向,因此在放置 imageview 时会根据方向旋转。您可以从图像的属性中检查照片的方向。 要以正确的方式设置图像,您可以使用以下代码...
int rot=getCameraPhotoOrientation(this,Uri,picturePath);
if(rot!=0)
bitmap=new RotateOrientation().RotateOrientationCall(bitmap,rot);
getCameraPhotoOrientation方法:-
public static int getCameraPhotoOrientation(Context context, Uri imageUri, String imagePath)
int rotate = 0;
try
context.getContentResolver().notifyChange(imageUri, null);
File imageFile = new File(imagePath);
ExifInterface exif = new ExifInterface(
imageFile.getAbsolutePath());
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation)
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
Log.d(TAG, "Exit orientation: " + orientation);
catch (Exception e)
e.printStackTrace();
return rotate;
添加RotateOrientation类,根据方向旋转类。
public class RotateOrientation
Bitmap RotateOrientationCall(Bitmap src,float degree)
Matrix matrix=new Matrix();
matrix.postRotate(degree);
Bitmap bmOut = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), matrix, true);
return bmOut;
【讨论】:
我会尝试并告诉你...@Abhishek 感谢 abhishek,它工作正常。我已经在我的应用程序中测试了你的代码。以上是关于在 imageview 中使用时从相机或画廊拍摄的图片其方向发生变化,有时在 Android 中会垂直拉伸的主要内容,如果未能解决你的问题,请参考以下文章
如何仅在 Swift 中访问从相机拍摄的图像,就像 iOS 中的画廊一样?
Android调用相机拍摄照片并显示到 ImageView控件中