如何使用Java获取上传图片需要旋转的角度且获取正确方向的图片

一、引言

在公司做项目的时候,发现ios端拍的图片会出现宽高不一致的情况,后来才发现其实是需要将其旋转才能获得正确的宽高,下面记录一下解决办法

二、 引入依赖

compile group: 'com.drewnoakes', name: 'metadata-extractor', version: '2.14.0'

三、编写工具类

package album;


import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.Tag;
import com.drew.metadata.exif.ExifInteropDirectory;
import org.apache.commons.lang3.StringUtils;


import javax.imageio.*;

import java.awt.*;
import java.awt.image.BufferedImage;

import java.io.File;
import java.io.IOException;

import java.util.Collection;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ImageUtils {


    /**
     * 获取图片正确显示需要旋转的角度(顺时针)
     *
     * @param filePath
     * @return
     */
    public static int getRotateAngleForPhoto(String filePath) {
        File file = new File(filePath);
        int angle = 0;
        Metadata metadata;
        try {
            metadata = JpegMetadataReader.readMetadata(file);
            Iterable<Directory> directories = metadata.getDirectories();
            metadata.getFirstDirectoryOfType(ExifInteropDirectory.class);
            for (Directory directory : directories) {
                /*System.out.println(directory);
                Collection<Tag> tags = directory.getTags();
                for (Tag tag : tags) {
                    System.out.println(tag.getTagName()+":"+tag.getDescription());
                }
                System.out.println("-----------------------");*/
                if ("Exif IFD0".equals(directory.getName())) {
                    Collection<Tag> tags = directory.getTags();
                    for (Tag tag : tags) {
                        if ("Orientation".equals(tag.getTagName())) {
                            angle = getNum(tag.getDescription());
                            break;
                        }
                    }
                    break;
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return angle;
    }

    /**
     * 旋转照片
     *
     * @param fullPath
     * @param angel
     * @return
     */
    public static String rotatePhonePhoto(String fullPath, int angel) {
        BufferedImage src;
        try {
            src = ImageIO.read(new File(fullPath));
            int src_width = src.getWidth(null);
            int src_height = src.getHeight(null);

            int swidth = src_width;
            int sheight = src_height;

            if (angel == 90 || angel == 270) {
                swidth = src_height;
                sheight = src_width;
            }

            Rectangle rect_des = new Rectangle(new Dimension(swidth, sheight));

            BufferedImage res = new BufferedImage(rect_des.width, rect_des.height, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2 = res.createGraphics();

            g2.translate((rect_des.width - src_width) / 2,
                    (rect_des.height - src_height) / 2);
            g2.rotate(Math.toRadians(angel), src_width / 2, src_height / 2);

            g2.drawImage(src, null, null);

            ImageIO.write(res, "jpg", new File(fullPath));

        } catch (IOException e) {

            e.printStackTrace();
        }
        return fullPath;
    }


    private static int getNum(String str) {
        String regEx = "[^0-9]";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        String numStr = m.replaceAll("").trim();
        if (StringUtils.isNotBlank(numStr)) {
            return Integer.valueOf(numStr);
        } else {
            return 0;
        }
    }

    /**
     * 处理ios照片
     *
     * @param filePath
     */
    public static void processIosPhotos(String filePath) {
        //计算旋转的角度
        int angle = getRotateAngleForPhoto(filePath);
        if (angle != 0) {
            rotatePhonePhoto(filePath, angle);
        }
    }

   public static void main(String[] args) throws Exception {
        //不需要旋转
        //String filePath = "C:\\Users\\Administrator\\Desktop\\1598182253HOqheeJY.png";
        //需要旋转90度
        String filePath = "C:\\Users\\Administrator\\Desktop\\微信图片_20200821160115.jpg";
        //需要旋转180度
        //String filePath = "C:\\Users\\Administrator\\Desktop\\1598182214VTZwNVHf.png";
        //安卓照片
        //String filePath = "C:\\Users\\Administrator\\Desktop\\22e2d04abf-6525-4425-b86c-ceacbb2540ab.jpg";
        int angle = getRotateAngleForPhoto(filePath);
        System.out.println("旋转角度:" + angle);
        BufferedImage bufImage = JpegReader.readImage(new File(filePath));
        System.out.println("旋转前的宽高:"+bufImage.getWidth()+"*"+bufImage.getHeight());
        rotatePhonePhoto(filePath,angle);
        BufferedImage bufImage2 = JpegReader.readImage(new File(filePath));
        System.out.println("旋转后的宽高:"+bufImage2.getWidth()+"*"+bufImage2.getHeight());
    }
}

调用processIosPhotos方法就能获得正确方向的图片啦

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
获取图片旋转度并实现图片角度旋转,可以使用Java的ImageIO和AffineTransform类。以下是一个示例代码: ```java import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; public class ImageRotateExample { public static void main(String[] args) throws Exception { // 读取图片文件 File input = new File("input.png"); BufferedImage image = ImageIO.read(input); // 获取图片旋转度 int angle = getRotateAngle(image); System.out.println("图片旋转度:" + angle); // 旋转图片 BufferedImage rotatedImage = rotateImage(image, angle); // 保存旋转后的图片 File output = new File("output.png"); ImageIO.write(rotatedImage, "png", output); } // 获取图片旋转度 public static int getRotateAngle(BufferedImage image) { // 获取图片的宽度和高度 int width = image.getWidth(); int height = image.getHeight(); // 获取图片的四个角的像素值 int topLeft = image.getRGB(0, 0); int topRight = image.getRGB(width-1, 0); int bottomLeft = image.getRGB(0, height-1); int bottomRight = image.getRGB(width-1, height-1); // 判断图片是否旋转 if (topLeft == topRight && topRight == bottomLeft && bottomLeft == bottomRight) { return 0; } else if (topLeft == bottomRight && topRight == bottomLeft) { return 180; } else if (topLeft == topRight) { return -90; } else { return 90; } } // 旋转图片 public static BufferedImage rotateImage(BufferedImage image, int angle) { // 计算旋转中心点 int centerX = image.getWidth() / 2; int centerY = image.getHeight() / 2; // 创建变换矩阵 AffineTransform transform = new AffineTransform(); transform.rotate(Math.toRadians(angle), centerX, centerY); // 创建变换操作对象 AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR); // 执行变换操作 return op.filter(image, null); } } ``` 在上面的示例代码中,getRotateAngle方法用于获取图片旋转度,rotateImage方法用于旋转图片。这两个方法都使用了AffineTransform类来进行变换操作。注意:以上代码只能处理图片旋转角度为0、90、180、270度的情况。如果需要处理其他旋转角度图片需要进行更复杂的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值