三星手机拍照,上传照片或者下载导致图片旋转90°的解决办法。

项目需求。
因为项目中需要对拍照之后的图片进行上传。
(这也是一个简单的问题)
但是就是三星手机(三星note3),出现拍照之后照片旋转了九十度。
然后我们上传上去,然后通过其他手机请求url再次显示还是旋转过的。

说说我们解决问题的路径。
1.
起初以为我们上传照片的时候就是旋转过了的,但是查看图片所在的位置,结果发现图片是正的。
那么是为什么再次下载图片还是旋转的,我们就想到了
这个类ExifInterface 这个类可以获得图片一些信息
1.旋转角度
2.时间
反正就是有很多图片的信息啦。
参考:
ExifInterface更多信息
这里最重要的可能都是旋转角度了。
我们怎么能获取角度了?

   public static int readPictureDegree(String path) {
        int degree = 0;
        try {
            ExifInterface exifInterface = new ExifInterface(path);
            int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
            switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_90:
                    degree = 90;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    degree = 180;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_270:
                    degree = 270;
                    break;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return degree;
    }

以上的代码可以看出来,通过图片的路径可以获取到。
大家可能猜到下一步干什么了?
既然我们可以获取角度,那么我们为什么不能改角度,因为文件中是正的,下载下来也是正的,为什么显示的时候出现旋转,估计就是因为这个旋转属性的问题 了(我是猜想哦)
那么我们就尝试着更改属性。

 ExifInterface exifInterface = new ExifInterface(path);
 exifInterface.setAttribute(exifInterface.TAG_ORIENTATION, String.valueOf(exifInterface.ORIENTATION_ROTATE_90));
            exifInterface.saveAttributes();

再次旋转九十度试试,结果那还是什么变化都没有,我擦(我那个气啊)
属性值的确是改了,但是就是没有旋转。(大家可以自行尝试一下,验证一下)

2.
那我就只能用其他方法了(被逼的,这里顺带说一下我们老板让我把图片的大小压缩一下,因为我们每次都需要上传图片,可能需要耗费很多流量,而且有非常慢,这里我们也优化一下,一举两得)

这里可以看下我前面怎么处理图片缩放比例的

第一个方法:
calculateInSampleSize 搜索这个方法
这个方法就是缩放比例。
第二个方法:
因为图片旋转我们需要判断角度需要用到上面的readPictureDegree方法
第三个方法:
既然知道角度了我们就要把图片旋转过来,那么怎么旋转啦?

 /**
     * 旋转图片
     *
     * @param bitmap
     * @param rotate
     * @return
     */
    private static Bitmap rotateBitmap(Bitmap bitmap, int rotate) {
        if (bitmap == null)
            return null;
        int w = bitmap.getWidth();
        int h = bitmap.getHeight();
        // Setting post rotate to 90
        Matrix mtx = new Matrix();
        mtx.postRotate(rotate);
        return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
    }

然后怎么办?
因为我们上传一般都是根据文件上传的(File),
那么我们把旋转之后bitmap写入到文件中去。

  /**
     * 添加图片到sd卡并规定压缩比例,100默认原图
     */
    public static File saveBitmap(Bitmap bitmap, String savePath, int quality) {
        if (bitmap == null)
            return null;
        try {
            File f = new File(savePath);
            if (f.exists()) f.delete();
            FileOutputStream fos = new FileOutputStream(f);
            f.createNewFile();
            // 把Bitmap对象解析成流
            bitmap.compress(Bitmap.CompressFormat.JPEG, quality, fos);
            Log.d("bitmap", bitmap.getRowBytes() + "");
            fos.flush();
            fos.close();
            bitmap.recycle();
            return f;
        } catch (IOException e) {
            e.printStackTrace();
            bitmap.recycle();
            return null;
        }
    }

最后我们是这么组装的。

 public static File getSmallBitmap(String filePath) {
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
         BitmapFactory.decodeFile(filePath, options);
        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, 480, 800);
        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        Bitmap bm = BitmapFactory.decodeFile(filePath, options);
        if (bm == null) {
            return null;
        }
        int degree = readPictureDegree(filePath);
        bm = rotateBitmap(bm, degree);
        return saveBitmap(bm, filePath, 70);
    }

我们缩放规格是480X800 所以就写的是固定的。70是我们压缩比例。

以上都是我们解决三星图片旋转的问题了。
在此感谢我们的卢浩小同学的帮助。

你可能感兴趣的:(android_开发)