在三星手机中拍摄照片旋转 90 度

Posted

技术标签:

【中文标题】在三星手机中拍摄照片旋转 90 度【英文标题】:Capture photo rotate 90 degree in samsung mobile 【发布时间】:2012-11-06 00:32:52 【问题描述】:

照片旋转 90 度,同时从三星手机其余其他手机 (HTC) 中的相机捕获它工作正常。请帮帮我。

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, IMAGE_CAPTURE); 

@Override 
 protected void onActivityResult(int requestCode, int resultCode, Intent data)      
    super.onActivityResult(requestCode, resultCode, data);    
      try
    
    if (requestCode == IMAGE_CAPTURE) 
       if (resultCode == RESULT_OK)

       Uri contentUri = data.getData();
       if(contentUri!=null)
       
        String[] proj =  MediaStore.Images.Media.DATA ;         
            Cursor cursor = managedQuery(contentUri, proj, null, null, null);         
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);         
        cursor.moveToFirst();         
        imageUri = Uri.parse(cursor.getString(column_index));
       

       tempBitmap = (Bitmap) data.getExtras().get("data"); 
       mainImageView.setImageBitmap(tempBitmap);
       isCaptureFromCamera = true;
    
 

【问题讨论】:

您期望纵向图像方向吗? 不,我希望图像的方向与我拍摄的相同,例如我以纵向模式拍摄照片,那么它应该是纵向的,横向的也是一样的..请帮助我 在包括三星在内的不同 Android 设备上,相机纵向方向存在许多不同的错误。如果可能的话,通过使用旋转的 UI 元素来使用横向和假纵向模式,就像股票相机应用一样。 @Alex Cohn 这个问题有解决办法吗 我也遇到了这个问题,看看***.com/questions/8450539/… 为我解决了这个问题。 【参考方案1】:

某些设备根据设备方向旋转图像。

这里我写了一种常用的方法来获取方向并以正确的比例获取图像

    public  Bitmap decodeFile(String path) //you can provide file path here 
        int orientation;
        try 
            if (path == null) 
                return null;
            
            // decode image size 
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            // Find the correct scale value. It should be the power of 2.
            final int REQUIRED_SIZE = 70;
            int width_tmp = o.outWidth, height_tmp = o.outHeight;
            int scale = 0;
            while (true) 
                if (width_tmp / 2 < REQUIRED_SIZE
                        || height_tmp / 2 < REQUIRED_SIZE)
                    break;
                width_tmp /= 2;
                height_tmp /= 2;
            scale++;
            
            // decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            Bitmap bm = BitmapFactory.decodeFile(path, o2);
            Bitmap bitmap = bm;

            ExifInterface exif = new ExifInterface(path);

            orientation = exif
                    .getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);

            Log.e("ExifInteface .........", "rotation ="+orientation);

//          exif.setAttribute(ExifInterface.ORIENTATION_ROTATE_90, 90);

            Log.e("orientation", "" + orientation);
            Matrix m = new Matrix();

            if ((orientation == ExifInterface.ORIENTATION_ROTATE_180)) 
                m.postRotate(180);
//              m.postScale((float) bm.getWidth(), (float) bm.getHeight());
                // if(m.preRotate(90))
                Log.e("in orientation", "" + orientation);
                bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
                        bm.getHeight(), m, true);
                return bitmap;
             else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) 
                m.postRotate(90); 
                Log.e("in orientation", "" + orientation);
                bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
                        bm.getHeight(), m, true);
                return bitmap;
            
            else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) 
                m.postRotate(270);
                Log.e("in orientation", "" + orientation);
                bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
                        bm.getHeight(), m, true);
                return bitmap;
             
            return bitmap;
         catch (Exception e) 
            return null;
        

    

编辑:

这段代码没有优化,我只是展示了我的一个测试项目中的逻辑代码。

【讨论】:

它工作正常,但是当我在三星 Galaxy tab2(7") 中捕获连续快照时,它会给出“内存不足异常”。请您提供一些解决方案。 @Hasmukh 您可以更改比例大小位图,在这段代码中我让它变得可靠 是的,如果我给比例类型 8,那么它工作正常,但我需要显示大作为预览图像,还需要将该大图像上传为 byte64。 @Hasmukh 内存错误有时取决于设备堆大小,有时我们必须小心这些位图,使用后需要回收位图。 无论我如何握住 HTC 手机,当我使用此代码时,我都会不断得到方向 = 0。有人遇到同样的问题吗?【参考方案2】:

您可以添加到上述解决方案的另一件事是"samsung".contentEquals(Build.MANUFACTURER)。如果您知道您的问题仅与三星设备有关,您可以合理地确定您需要旋转返回的图像(仅)if ("samsung".contentEquals(Build.MANUFACTURER) &amp;&amp; getActivity().getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT // &amp;&amp; width &gt; height//) // here you know you need to rotate

您可以“合理地”相信轮换是有必要的。

【讨论】:

它不是解决方案。三星的照片总是宽度>高度。仅适用于移植模式的错误。【参考方案3】:
public static Bitmap rotateBitmap(Bitmap b, float degrees) 
    Matrix m = new Matrix();
    if (degrees != 0) 
        // clockwise
        m.postRotate(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;

【讨论】:

【参考方案4】:

如果它确实是一个错误,那么您可能必须手动将其旋转回横向。位图数据始终具有宽度和高度,只需查看数字,如果宽度小于高度,请按照 alistair3408 的回答旋转图像。

【讨论】:

以上是关于在三星手机中拍摄照片旋转 90 度的主要内容,如果未能解决你的问题,请参考以下文章

解决ios手机上传竖拍照片旋转90度的问题

关于android中调用系统拍照,返回图片是旋转90度

ios系统 竖屏拍照 canvas处理后 图片旋转(利用exif.js解决ios手机上传竖拍照片旋转90度问题)

从手机上传时图像旋转 90 度? PHP

Android将图片旋转90度(由相机拍摄)[重复]

JS获取照片拍摄的角度属性,用于旋转控制