如何设置相机图像方向?
Posted
技术标签:
【中文标题】如何设置相机图像方向?【英文标题】:how to set camera Image orientation? 【发布时间】:2015-04-07 09:12:51 【问题描述】:在我的应用程序中,我添加了图像上传功能,它适用于除相机图像之外的所有图像,每当我从图库中浏览相机图像并且肖像图像旋转 90 度时..以下是我的 sn-p 代码..任何人都可以帮助我吗?我学习了很多教程,但它们都在 kikat 中运行良好..但是当相同的教程不适用于 ics、jellybean 等时..
public class MainActivity extends Activity
private Button browse;
private String selectedImagePath="";
private ImageView img;
private TextView messageText;
private static int SELECT_PICTURE = 1;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img = (ImageView)findViewById(R.id.imagevw);
browse=(Button)findViewById(R.id.browseimg);
messageText = (TextView)findViewById(R.id.messageText);
browse.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_PICTURE);
);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
if (resultCode == RESULT_OK)
if (requestCode == SELECT_PICTURE)
Uri selectedImageUri = data.getData();
/*String filePath = getRealPathFromURI(getActivity(), selectedImageUri );
messageText.setText(filePath );
Picasso.with(getActivity())
.load(new File(filePath ))
.centerCrop()
.resize(60, 60).into( img);*/
selectedImagePath = getPath(selectedImageUri);
messageText.setText(selectedImagePath);
System.out.println(requestCode);
System.out.println("Image Path : " + selectedImagePath);
img.setImageURI(selectedImageUri);
@SuppressWarnings("deprecation")
public String getPath(Uri uri)
String[] projection = MediaStore.Images.Media.DATA ;
Cursor cursor = managedQuery(uri, projection, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
【问题讨论】:
使用ExifInterface
。
检查这些***.com/questions/13511356/… 和***.com/questions/12726860/…。您的代码仅适用于某些设备。它不会与其他大型设备兼容。所以检查链接。
在这里回答***.com/questions/14066038/…
【参考方案1】:
我用下面的代码解决了图像旋转问题
public Bitmap rotateImageIfRequired(String imagePath)
int degrees = 0;
try
ExifInterface exif = new ExifInterface(imagePath);
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation)
case ExifInterface.ORIENTATION_ROTATE_90:
degrees = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degrees = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degrees = 270;
break;
catch (IOException e)
Log.e("ImageError", "Error in reading Exif data of " + imagePath, e);
BitmapFactory.Options decodeBounds = new BitmapFactory.Options();
decodeBounds.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(imagePath, decodeBounds);
int numPixels = decodeBounds.outWidth * decodeBounds.outHeight;
int maxPixels = 2048 * 1536; // requires 12 MB heap
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = (numPixels > maxPixels) ? 2 : 1;
bitmap = BitmapFactory.decodeFile(imagePath, options);
if (bitmap == null)
return null;
Matrix matrix = new Matrix();
matrix.setRotate(degrees);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
bitmap.getHeight(), matrix, true);
return bitmap;
【讨论】:
【参考方案2】:只需包含此代码
public void rotateImage(String file) throws IOException
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);
int rotationAngle = getCameraPhotoOrientation(getActivity(), Uri.fromFile(file1), file1.toString());
Matrix matrix = new Matrix();
matrix.postRotate(rotationAngle, (float) bm.getWidth() / 2, (float) bm.getHeight() / 2);
Bitmap rotatedBitmap = Bitmap.createBitmap(bm, 0, 0, bounds.outWidth, bounds.outHeight, matrix, true);
FileOutputStream fos=new FileOutputStream(file);
rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
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_UNDEFINED);
switch (orientation)
case ExifInterface.ORIENTATION_NORMAL:
rotate = 0;
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 (Exception e)
e.printStackTrace();
return rotate;
【讨论】:
你的意思是我应该在我的代码中添加这个方法? 您只需在代码中添加此代码并在 rotateimage 函数中传递图像的路径 file1是相机intent中传入的图片文件路径【参考方案3】: String filePath = getRealPathFromURI(getActivity(), selectedImageUri );
messageText.setText(filePath );
Picasso.with(getActivity())
.load(new File(filePath ))
.centerCrop()
.resize(60, 60).into( img);
【讨论】:
不,它不工作..静止图像旋转..profile_image 是什么?首先仔细阅读我的问题 对不起,如果它不起作用。毕加索正在处理所有这些情况,它对我很有用,这就是为什么我建议你使用这种方法 它只是一个可绘制的图像,例如:ic_launcher 它只是一个占位符,用于在您所需的图像适合图像视图之前显示图像。即使它不存在,它也可以工作。 好的..谢谢你的帮助..但我是新手..不知道..你能帮我吗?我应该怎么做【参考方案4】:有几种方法,但我发现最简单的是使用 Picasso 库。由于这是一个上传案例,我们会得到正确的方向,也可以调整图像位图大小。
【讨论】:
将 Picasso jar 文件添加到项目中 根据您的分辨率和大小使用获取位图。位图 resizedBitmapthumb = Picasso.with(getActivity()) .load(new File(picturePath)).centerInside() .resize(size, size).get(); 你仔细阅读我的问题了吗?因为我已经添加了 picasso2.4.0以上是关于如何设置相机图像方向?的主要内容,如果未能解决你的问题,请参考以下文章
Android:如何在设置图像视图时检测从图库中选择的图像方向(纵向或横向)?