在android中设置相机拍摄的图像?
Posted
技术标签:
【中文标题】在android中设置相机拍摄的图像?【英文标题】:set image taken by camera in android? 【发布时间】:2015-03-07 17:08:07 【问题描述】:我正在开发一个以纵向拍摄照片的应用程序,问题是当我稍后检索图像时它处于横向(图片已逆时针旋转 90 度)。我在课堂下使用过,但这里的方向每次都给出 0(零)。所以,我不知道如何解决它。
public Bitmap rotateBitmapOrientation(String photoFilePath)
// Create and configure BitmapFactory
BitmapFactory.Options bounds = new BitmapFactory.Options();
bounds.inJustDecodeBounds = true;
BitmapFactory.decodeFile(file, bounds);
BitmapFactory.Options opts = new BitmapFactory.Options();
Bitmap bm = BitmapFactory.decodeFile(file, opts);
// Read EXIF Data
ExifInterface exif = new ExifInterface(file);
String orientString = exif.getAttribute(ExifInterface.TAG_ORIENTATION);
int orientation = orientString != null ? Integer.parseInt(orientString) : ExifInterface.ORIENTATION_NORMAL;
int rotationAngle = 0;
if (orientation == ExifInterface.ORIENTATION_ROTATE_90) rotationAngle = 90;
if (orientation == ExifInterface.ORIENTATION_ROTATE_180) rotationAngle = 180;
if (orientation == ExifInterface.ORIENTATION_ROTATE_270) rotationAngle = 270;
// Rotate Bitmap
Matrix matrix = new Matrix();
matrix.setRotate(rotationAngle, (float) bm.getWidth() / 2, (float) bm.getHeight() / 2);
Bitmap rotatedBitmap = Bitmap.createBitmap(bm, 0, 0, bounds.outWidth, bounds.outHeight, matrix, true);
// Return result
return rotatedBitmap;
【问题讨论】:
您必须将您的图像路径传递给此方法并使用位图保存选项,然后将其设置为您的 ImageView 我已经做到了,图像正在显示。但是,主要故障是当相机在人像模式下拍摄图像时,它会将图像逆时针旋转 90 度。我在我的问题中提到了这一点。请参考。 @BhavikMehta 您可以查看这个答案:***.com/questions/21776802/… 不,它给出相同的输出。是的,它每次都给出方向0(零)。 @HamidShatu @RonakJoshi 我知道我的代码很长,但至少尝试一次 【参考方案1】:*** 上有几种方法可用,但我混合使用它们,如果您希望图像处于捕获的方向,您可以使用以下指令和类来执行此操作
你的 onActivityResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
switch (requestCode)
case SELECT_IMAGE_FROM_CAMERA:
if (requestCode == SELECT_IMAGE_FROM_CAMERA
&& resultCode == RESULT_OK)
int targetW = reviewImageView.getWidth();
int targetH = reviewImageView.getHeight();
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
// Determine how much to scale down the image
int scaleFactor = Math.min(photoW / targetW, photoH / targetH);
// Decode the image file into a Bitmap sized to fill the View
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scaleFactor;
bmOptions.inPurgeable = true;
Bitmap rotatedBitmap = decodeFile(new File(mCurrentPhotoPath),
photoW, photoH, getImageOrientation(mCurrentPhotoPath));
reviewImageView.setImageBitmap(rotatedBitmap);
uploadMessage.setVisibility(View.INVISIBLE);
UploadSuccess.setVisibility(View.INVISIBLE);
else if (requestCode == SELECT_IMAGE_FROM_CAMERA
&& resultCode == RESULT_CANCELED)
mCurrentPhotoPath = null;
photo = null;
super.onActivityResult(requestCode, resultCode, data);
辅助方法和类
public static int getImageOrientation(String imagePath)
int rotate = 0;
try
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;
catch (IOException e)
e.printStackTrace();
return rotate;
public static Bitmap decodeFile(File f, double REQUIRED_WIDTH,
double REQUIRED_HEIGHT, int rotation)
try
if (REQUIRED_WIDTH == 0 || REQUIRED_HEIGHT == 0)
return BitmapFactory.decodeFile(f.getAbsolutePath());
else
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeFile(f.getAbsolutePath(), o);
o.inSampleSize = calculateInSampleSize(o, REQUIRED_WIDTH,
REQUIRED_HEIGHT);
o.inJustDecodeBounds = false;
o.inPurgeable = true;
Bitmap b = BitmapFactory.decodeFile(f.getAbsolutePath(), o);
if (rotation != 0)
b = rotate(b, rotation);
if (b.getWidth() > REQUIRED_WIDTH
|| b.getHeight() > REQUIRED_HEIGHT)
double ratio = Math.max((double) b.getWidth(),
(double) b.getHeight())
/ (double) Math
.min(REQUIRED_WIDTH, REQUIRED_HEIGHT);
return Bitmap.createScaledBitmap(b,
(int) (b.getWidth() / ratio),
(int) (b.getHeight() / ratio), true);
else
return b;
catch (Throwable ex)
ex.printStackTrace();
return null;
public static int calculateInSampleSize(BitmapFactory.Options options,
double reqWidth, double 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 the largest inSampleSize value that is a power of 2 and
// keeps both
// height and width larger than the requested height and width.
while ((height / inSampleSize) > reqHeight
|| (width / inSampleSize) > reqWidth)
inSampleSize *= 2;
inSampleSize = Math.max(1, inSampleSize / 2);
return inSampleSize;
public static Bitmap rotate(Bitmap b, int degrees)
if (degrees != 0 && b != null)
Matrix m = new Matrix();
m.setRotate(degrees, (float) b.getWidth() / 2,
(float) b.getHeight() / 2);
try
Bitmap b2 = Bitmap.createBitmap(b, 0, 0, b.getWidth(),
b.getHeight(), m, true);
if (b != b2)
b.recycle();
b = b2;
catch (OutOfMemoryError ex)
// We have no memory to rotate. Return the original bitmap.
return b;
您可以根据自己的需要自定义每个方法,我的代码遵循android指南,所以它很长
【讨论】:
它仍然每次旋转 0(零)。所以,结果是一样的。 @BhavikMehta 可能是你走错了路! mCurrentPhotoPath = file.getAbsolutePath();你在做这个吗? @RonakJoshi 请提供更多代码以便开发人员可以帮助您 它有效。你的解决方案很棒。 +1为您的答案。 @BhavikMehta @RonakJoshi,很高兴随时为您提供帮助 :)【参考方案2】:使用以下代码解决您的问题 -
int rotate;
String URI = getImageURI();
try
File file = new File(URI);
ExifInterface exif = new ExifInterface(
file.getAbsolutePath());
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
Log.v("my", "Exif orientation: " + orientation);
switch (orientation)
case ExifInterface.ORIENTATION_ROTATE_270:
Log.v("", "rotated " +270);
rotate = 270;
Log.e("rotate", ""+rotate);
ImageOrientation(file,rotate);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
Log.v("", "rotated " +180);
rotate = 180;
Log.e("rotate", ""+rotate);
ImageOrientation(file,rotate);
break;
case ExifInterface.ORIENTATION_ROTATE_90:
Log.v("", "rotated " +90);
rotate = 90;
ImageOrientation(file,rotate);
break;
case 1:
Log.v("", "rotated1-" +90);
rotate = 90;
ImageOrientation(file,rotate);
break;
case 2:
Log.v("", "rotated1-" +0);
rotate = 0;
ImageOrientation(file,rotate);
break;
case 4:
Log.v("", "rotated1-" +180);
rotate = 180;
ImageOrientation(file,rotate);
break;
case 0:
Log.v("", "rotated 0-" +90);
rotate = 90;
ImageOrientation(file,rotate);
break;
filePath = file.getAbsolutePath();
catch (Exception e)
e.printStackTrace();
private void ImageOrientation(File file,int rotate)
try
FileInputStream fis = new FileInputStream(file);
filePath = file.getAbsolutePath();
Bitmap photo = BitmapFactory.decodeStream(fis);
Matrix matrix = new Matrix();
matrix.preRotate(rotate); // clockwise by 90 degrees
photo = Bitmap.createBitmap(photo , 0, 0, photo.getWidth(), photo.getHeight(), matrix, true);
customerImageView.setImageBitmap(photo);
imageBitmap = photo;
catch (FileNotFoundException e)
e.printStackTrace();
希望对你有帮助。
【讨论】:
以上是关于在android中设置相机拍摄的图像?的主要内容,如果未能解决你的问题,请参考以下文章
如何从图库和相机的 imageview 中设置图像? [复制]
OpenCV - 如何在 Android 中设置全屏相机视图?