如何设置相机图像方向?

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 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中传入的图片文件路径【参考方案2】:

有几种方法,但我发现最简单的是使用 Picasso 库。由于这是一个上传案例,我们会得到正确的方向,也可以调整图像位图大小。

【讨论】:

将 Picasso jar 文件添加到项目中 根据您的分辨率和大小使用获取位图。位图 resizedBitmapthumb = Picasso.with(getActivity()) .load(new File(picturePath)).centerInside() .resize(size, size).get(); 你仔细阅读我的问题了吗?因为我已经添加了 picasso2.4.0【参考方案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】:

我用以下代码解决了图像旋转问题

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;

【讨论】:

以上是关于如何设置相机图像方向?的主要内容,如果未能解决你的问题,请参考以下文章

iOS:自定义相机如何始终以正确的方向保存图像?

Android:如何在设置图像视图时检测从图库中选择的图像方向(纵向或横向)?

没有surfaceView的Android相机图像方向

IOS Swift 3:拍摄相机图片后水平翻转前置摄像头图像

当我改变相机的方向进行裁剪图像时,为啥我会丢失数据?

相机意图图像预览方向