java graphics2d 旋转图片

由于iphone拍出来的照片存在旋转的问题,当然在iphone上查看是没有问题的,但是如果是在安卓手机上或者使用windows 图片查看器就会发现图片是旋转90度的。有一些安卓手机拍出来的照片也是旋转的,比如三星的那个曲屏手机。所以需要程序去把图片旋转过来,变成正的,保证体验一致。

原理是通过metadata-extractor去检测图片的EXIF信息,获取图片的ORIENTATION信息

1 <dependency> 2 <groupId>com.drewnoakes</groupId> 3 <artifactId>metadata-extractor</artifactId> 4 <version>2.9.0</version> 5 </dependency>

读取代码如下:

1 public static int readImgExifOrientation(InputStream in){ 2 3 try { 4 if (in.markSupported()) { 5 Metadata metadata = ImageMetadataReader.readMetadata(in); 6 in.reset();//重置流 7 ExifIFD0Directory directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class); 8 if (directory != null) { 9 10 int tag = directory.getInt(ExifIFD0Directory.TAG_ORIENTATION); 11 logger.debug("方向: " + tag); 12 ExifIFD0Descriptor descriptor = new ExifIFD0Descriptor(directory); 13 logger.debug(descriptor.getOrientationDescription()); 14 15 return tag; 16 } 17 }else { 18 throw new RuntimeException("必须使用支持mark 的input stream"); 19 } 20 } catch (Exception e) { 21 logger.error("读取图片方向失败",e); 22 } 23 return 0; 24 }

返回的tag值对应了一个旋转的角度。通过自己写的一个方法去对应。具体对应的是多少度可以去查看这个库的文档。这里只列举了这几个。

1 private static float getRotate(int tag){ 2 switch (tag){ 3 case 3: 4 return 180; 5 case 5: 6 return 270; 7 case 6: 8 return 90; 9 case 7: 10 return 270; 11 case 8: 12 return 90; 13 default:return 0; 14 } 15 }

得到旋转的角度之后,我们就可以调用api去将图片再旋转回来。

1 public static InputStream rotate(InputStream in,int tag,String suffix) throws Exception{ 2 double theta = Math.toRadians(getRotate(tag)); 3 if (theta == 0) {//不需要旋转 4 return in; 5 } 6 if(suffix!=null){ 7 suffix = suffix.replaceAll("\\.", ""); 8 }else { 9 suffix = ".jpg"; 10 } 11 BufferedImage oldImg = ImageIO.read(in); 12 int w = oldImg.getWidth(); 13 int h = oldImg.getHeight(); 14 BufferedImage newImg = new BufferedImage(h,w,oldImg.getColorModel().getTransparency()); 15 Graphics2D g2d =newImg.createGraphics(); 16 g2d.setRenderingHint( 17 RenderingHints.KEY_INTERPOLATION, 18 RenderingHints.VALUE_INTERPOLATION_BILINEAR); 19 g2d.rotate(theta, w/2, h/2); //旋转 20 g2d.drawImage(oldImg, h,0, null); 21 ByteArrayOutputStream out = new ByteArrayOutputStream(); 22 ImageIO.write(newImg, suffix, out); 23 g2d.dispose(); 24 return new ByteArrayInputStream(out.toByteArray()); 25 }

使用java2d中的旋转之后发现左下角会出现黑边,图片被截取。另外网上很多人写的代码都是创建一张跟原图相同宽高的图片,然后再旋转,但是这样操作之后黑边会出现在国内人边,并且图片也会被截取。

找了一些原因,由于对图形部分研究不深,无法解决。一直觉得做图形的都是牛比人物。最后采用另外一个库thumbnailator。

1 <dependency> 2 <groupId>net.coobird</groupId> 3 <artifactId>thumbnailator</artifactId> 4 <version>0.4.8</version> 5 </dependency>

这个库操作很简单,两句话就可以进行旋转。

1 public static InputStream rotate(InputStream in,int tag,String suffix) throws Exception{ 2 double theta = getRotate(tag); 3 if (theta == 0) {//不需要旋转 4 return in; 5 } 6 if(suffix!=null){ 7 suffix = suffix.replaceAll("\\.", ""); 8 }else { 9 suffix = ".jpg"; 10 } 11 BufferedImage oldImg = ImageIO.read(in); 12 int w = oldImg.getWidth(); 13 int h = oldImg.getHeight(); 14 ByteArrayOutputStream out = new ByteArrayOutputStream(); 15 Thumbnails.of(oldImg).size(h,w).rotate(theta).outputFormat(suffix).toOutputStream(out); 16 return new ByteArrayInputStream(out.toByteArray()); 17 }
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

微信小程序new Date()转换时间异常问题

微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT

Taro小程序自定义顶部导航栏

微信自带的顶部导航栏是无法支持自定义icon和增加元素的,在开发小程序的时候自带的根本满足不了需求,分享一个封装好的组件,支持自定义icon、扩展dom,适配安卓、ios、h5,全面屏。我用的是京东的Taro多端编译框架写的小程序,原生的也可以适用,用到的微信/taro的api做调整就行,实现效果如下。!在这里插入图片描述(https://i

unity2017 光照与渲染(一)

光照&渲染(基于unity2017.2.0)1.CustomSkybox天空盒最丰富的环境光a.TextureShape改成Cube。b.把图片直接丢给天空,就会自动生成材质。c.参数Exposure曝光度,Rotation旋转天空盒。

java graphics2d 旋转图片 - HelloWorld