exif java orientation_数码照片Exif - Orientation 自动修正解决方案

使用Canvas + exif-js自动修正数码照片

使用场景,在做朋友圈 H5 时,时常遇到需要用户拍照上传图片需求,但是在一些手机(iso)上拍出来的照片会出现奇怪的旋转角度来呈现。经过各种百度才发现相机拍出来的图片拥有很多属性,其中一项是Orientation ,用于记录拍摄时相机物理旋转角度,例如把相机倒过来Orientation 是3,顺时针竖起来Orientation 是6,逆时针竖起来Orientation 是8,正常模式Orientation 是1。根据这个属性我们可以使用Canvas来对图片重绘。

Orientation 示意图

da87779ddc7be362e7f43bf02a6612e2.png

Show Code

import EXIF from 'exif-js'; // 引入依赖插件

// 参数列表:img 对象,callback返回Base64图片编码,生成图片质量默认值0.9

export const FixImg = (img, callback, quality = 0.9) => {

let Orientation, ctxWidth, ctxHeight, base64; // 定义所需变量

EXIF.getData(img, function() {

Orientation = EXIF.getTag(this, 'Orientation');

ctxWidth = this.naturalWidth;

ctxHeight = this.naturalHeight;

console.log(Orientation, ctxWidth, ctxHeight);

var canvas = document.createElement('canvas');

var ctx = canvas.getContext('2d');

canvas.width = ctxWidth;

canvas.height = ctxHeight;

if ([5, 6, 7, 8].includes(Orientation)) {

canvas.width = ctxHeight;

canvas.height = ctxWidth;

}

switch (Orientation) {

case 2:

ctx.transform(-1, 0, 0, 1, ctxWidth, 0);

break;

case 3:

ctx.transform(-1, 0, 0, -1, ctxWidth, ctxHeight);

break;

case 4:

ctx.transform(1, 0, 0, -1, 0, ctxHeight);

break;

case 5:

ctx.transform(0, 1, 1, 0, 0, 0);

break;

case 6:

ctx.transform(0, 1, -1, 0, ctxHeight, 0);

break;

case 7:

ctx.transform(0, -1, -1, 0, ctxHeight, ctxWidth);

break;

case 8:

ctx.transform(0, -1, 1, 0, 0, ctxWidth);

break;

default:

ctx.transform(1, 0, 0, 1, 0, 0);

}

ctx.drawImage(img, 0, 0, ctxWidth, ctxHeight);

// 默认输出jpeg,也可以读取原图片格式,最后输出原图格式,搜索关键词 :File.type

base64 = canvas.toDataURL('image/jpeg', quality);

callback(base64);

});

};

相关补充:从图片 Exif 信息中取到 Orientation 后,就可以根据它来自动旋转图片了,canvas、filter 滤镜、vml、css3 都可以实现图片的旋转。

参考文章:https://imququ.com/post/how-t...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值