图片的orientation属性

由相机或者手持设备拍出来的图片,由于设备拍摄的角度的不同,会导致图片上传到应用程序时,图片的角度会被自动旋转。而导致图片的角度不对。

特此做了一些调查,一般由相机等手持设备拍出来的相片的默认后缀是jpg,这类图片自身有一些属性如方向属性Orientation,在我们的应用程序里可以被获取(PNG这类图片是没有这类信息的),来供我们做一些处理。

orientation的几种类型:
[b]Orientation = 1(不翻转)[/b]
Orientation = 2 (左右翻转)
[b]Orientation = 3 (180度翻转[/b])
Orientation = 4 (上下翻转)
Orientation = 5 (顺时针翻转90度后,左右翻转)
[b]Orientation = 6 (顺时针翻转90度)[/b]
Orientation = 7 (逆时针翻转90度后,左右翻转)
[b]Orientation = 8 (逆时针翻转90度)[/b]

[color=blue]PS:一般常用的也就是1,3,6,8,另外几种,反正我是没有拍出这种orientation的图片,应该是那种有特效功能的相机拍出的吧。[/color]

由以上可知,如果orientation!=1时,需要对图片进行适当的旋转,这样才能得到拍摄时图片的样子。

获取Orientation属性需要通过第三方的jar包
https://code.google.com/p/metadata-extractor/
以下我使用了metadata-extractor-2.6.4.jar

Metadata metaData = null;
boolean isExif = true;
try {
metaData = ImageMetadataReader.readMetadata(inBuffer, false);
} catch (IOException io) {
throw io;
} catch (Throwable e) {
isExif = false;
}

int orientation = 0;
if (isExif) {
if (metaData != null) {
Directory directory = metaData
.getDirectory(ExifIFD0Directory.class);
try {
if (directory != null) {
orientation = directory
.getInt(ExifIFD0Directory.TAG_ORIENTATION);
} else {
orientation = 1;
}
} catch (MetadataException e) {
orientation = 1;
}
} else {
orientation = 1;
}
}


[color=blue]PS:以上测试时发现,安卓系统拍出来的图片是得不到orientation信息的,因为不管以什么角度拍摄的图片,上传到应用程序时,角度都是正确的,不要我们自己去旋转。而苹果系统就不太一样了。它需要我们手动去旋转。[/color]


得到了orientation属性后,需要根据以上orientation信息,做相应的旋转:
这里有使用了另外一个第三方jar包(其实实现的方法有好几种,但是我只试了两个)
thumbnailator-0.4.7.jar和imgscalr-lib-4.2.jar

使用thumbnailator-0.4.7.jar虽然旋转成功了,但是图片有些失真,所以用了imgscalr-lib-4.2.jar
switch (orientation) {
case ORIENTATION_1:
orgImage = orgImageSrc;
break;
case ORIENTATION_3:
orgImage = Scalr.rotate(orgImageSrc, Scalr.Rotation.CW_180,
Scalr.OP_ANTIALIAS);
break;
case ORIENTATION_6:
orgImage = Scalr.rotate(orgImageSrc, Scalr.Rotation.CW_90,
Scalr.OP_ANTIALIAS);
break;
case ORIENTATION_8:
orgImage = Scalr.rotate(orgImageSrc, Scalr.Rotation.CW_270,
Scalr.OP_ANTIALIAS);
break;
default:
orgImage = orgImageSrc;
break;
}

[b]thumbnailator-0.4.7.jar方式[/b]
BufferedImage orgImageSrc = ImageIO.read(inputStream);
switch (orientation) {
case 1:
orgImage = orgImageSrc;
break;
case 3:
orgImage = Scalr.rotate(orgImageSrc, Scalr.Rotation.CW_180,

// orgImage = Rotation.ROTATE_180_DEGREES.apply(orgImageSrc);

break;
case 6:
// orgImage =
// Thumbnails.of(orgImageSrc).scale(1).rotate(-90).asBufferedImage();
orgImage = Scalr.rotate(orgImageSrc, Scalr.Rotation.CW_90,

break;
case 8:
orgImage = Scalr.rotate(orgImageSrc, Scalr.Rotation.CW_270,

// orgImage =
// Thumbnails.of(orgImageSrc).scale(1).rotate(90).asBufferedImage();
break;
}


以上仅为个人学习调查得知,不足之处欢迎大家补充!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值