如何计算图片旋转角度详解手机开发

在项目过程中,需要计算本地图片或者网络图片原来的旋转角度。这部分代码是从Glide的DownSampler类的,这里做一下记录。

Glide的类ImageHeaderParser中负责解析Image的头部信息,Glide分成两种情况:

  • DefaultImageHeaderParser 默认的头部,是Glide自定义的头部解析器
  • ExifInterfaceImageHeaderParser 利用了ExifInterface

一种是Android 7.0以上利用ExifInterface计算,另外一种低版本的Glide自定义的来解析头部信息获取旋转角度

我只是用了ExifInterfaceImageHeaderParser 的部分代码来获取角度,为了兼容低版本,还需要引入

implementation ‘com.android.support:exifinterface:28.0.0’

 
public class DownSampler {
    
 
    private static final int MARK_POSITION = 10 * 1024 * 1024; 
 
    public static Size getDimensions(BufferedInputStream is, BitmapFactory.Options options) {
    
        options.inJustDecodeBounds = true; 
        decodeStream(is, options); 
        options.inJustDecodeBounds = false; 
        return new Size(options.outWidth, options.outHeight); 
    } 
 
    public static boolean isScaling(BitmapFactory.Options options) {
    
        return options.inTargetDensity > 0 && options.inDensity > 0 
                && options.inTargetDensity != options.inDensity; 
    } 
 
    public static Bitmap decodeStream(BufferedInputStream is, BitmapFactory.Options options) {
    
        if (options.inJustDecodeBounds) {
    
            is.mark(MARK_POSITION); 
        } 
        final Bitmap result = BitmapFactory.decodeStream(is, null, options); 
        if (options.inJustDecodeBounds) {
    
            try {
    
                is.reset(); 
            } catch (IOException e) {
    
                e.printStackTrace(); 
            } 
        } 
        return result; 
    } 
 
    public static int getRotate(BufferedInputStream is) {
    
        try {
    
            int orientation = getOrientation(is); 
            return getExifOrientationDegrees(orientation); 
        } catch (IOException e) {
    
            e.printStackTrace(); 
        } 
        return 0; 
    } 
 
    public static int getOrientation(BufferedInputStream is) throws IOException {
    
        ExifInterface exifInterface = null; 
        is.mark(MARK_POSITION); 
        exifInterface = new ExifInterface(is); 
        int result = exifInterface.getAttributeInt( 
                ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 
        try {
    
            is.reset(); 
        } catch (IOException e) {
    
            e.printStackTrace(); 
        } 
        if (result == ExifInterface.ORIENTATION_UNDEFINED) {
    
            return 0; 
        } 
        return result; 
    } 
 
    public static int getExifOrientationDegrees(int exifOrientation) {
    
        final int degreesToRotate; 
        switch (exifOrientation) {
    
            case ExifInterface.ORIENTATION_TRANSPOSE: 
            case ExifInterface.ORIENTATION_ROTATE_90: 
                degreesToRotate = 90; 
                break; 
            case ExifInterface.ORIENTATION_ROTATE_180: 
            case ExifInterface.ORIENTATION_FLIP_VERTICAL: 
                degreesToRotate = 180; 
                break; 
            case ExifInterface.ORIENTATION_TRANSVERSE: 
            case ExifInterface.ORIENTATION_ROTATE_270: 
                degreesToRotate = 270; 
                break; 
            default: 
                degreesToRotate = 0; 
                break; 
        } 
        return degreesToRotate; 
    } 
} 

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/6268.html

(0)
上一篇 2021年7月17日
下一篇 2021年7月17日

相关推荐

发表回复

登录后才能评论