Exif.js图片上传旋转修正的问题怎样解决?
Admin 2022-11-15 群英技术资讯 731 次浏览
这篇文章给大家分享的是“Exif.js图片上传旋转修正的问题怎样解决?”,对大家学习和理解有一定的参考价值和帮助,有这方面学习需要的朋友,接下来就跟随小编一起学习一下吧。本文实例为大家分享了Exif.js图片旋转修正的具体方法,供大家参考,具体内容如下
测试流程
上传 -> base64展示 -> 获取旋转值 -> 修正 -> 修正后展示 -> 转换blob和file文件供其他功能调用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name='viewport' content='width=device-width,initial-scale=1.0'>
<title>测试图片旋转</title>
</head>
<body>
<input type="file" id="test" onchange="upload(event)">
<hr>
图片展示:
<img src="" id="img">
<hr>
旋转值:
<div id="rotateval"></div>
<hr>
canvas(旋转修正后):
<canvas id="canvas" width="100%" height="80%"></canvas>
<script src="exif.js"></script>
<script>
function upload(e) {
var file = e.target.files;
var reader = new FileReader();
reader.onload = function(e) {
var res = reader.result;
document.getElementById("img").setAttribute('src', res);
EXIF.getData(file[0],
function() {
var Orientation = EXIF.getTag(this, 'Orientation');
document.getElementById('rotateval').innerHTML = Orientation;
if (Orientation) {
var image = new Image();
image.src = res;
image.onload = function() {
var expectWidth = this.naturalWidth;
var expectHeight = this.naturalHeight;
if (this.naturalWidth > this.naturalHeight && this.naturalWidth > 800) {
expectWidth = 800;
expectHeight = expectWidth * this.naturalHeight / this.naturalWidth;
} else if (this.naturalHeight > this.naturalWidth && this.naturalHeight > 1200) {
expectHeight = 1200;
expectWidth = expectHeight * this.naturalWidth / this.naturalHeight;
}
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
canvas.width = "800px"; //expectWidth;
canvas.height = expectHeight;
ctx.drawImage(this, 0, 0, expectWidth, expectHeight);
switch (Orientation) {
case 6: //需要顺时针(向左)90度旋转
rotateImg(this, 'left', canvas);
break;
case 8: //需要逆时针(向右)90度旋转
rotateImg(this, 'right', canvas);
break;
case 3: //需要180度旋转
rotateImg(this, 'right', canvas); //转两次
rotateImg(this, 'right', canvas);
break;
}
function rotateImg(img, direction, canvas) {
//alert(img);
//最小与最大旋转方向,图片旋转4次后回到原方向
var min_step = 0;
var max_step = 3;
//var img = document.getElementById(pid);
if (img == null) return;
//img的高度和宽度不能在img元素隐藏后获取,否则会出错
var height = img.height;
var width = img.width;
//var step = img.getAttribute('step');
var step = 2;
if (step == null) {
step = min_step;
}
if (direction == 'right') {
step++;
//旋转到原位置,即超过最大值
step > max_step && (step = min_step);
} else {
step--;
step < min_step && (step = max_step);
}
//旋转角度以弧度值为参数
var degree = step * 90 * Math.PI / 180;
var ctx = canvas.getContext('2d');
switch (step) {
case 0:
canvas.width = width;
canvas.height = height;
ctx.drawImage(img, 0, 0);
break;
case 1:
canvas.width = height;
canvas.height = width;
ctx.rotate(degree);
ctx.drawImage(img, 0, -height);
break;
case 2:
canvas.width = width;
canvas.height = height;
ctx.rotate(degree);
ctx.drawImage(img, -width, -height);
break;
case 3:
canvas.width = height;
canvas.height = width;
ctx.rotate(degree);
ctx.drawImage(img, -width, 0);
break;
}
uploadfile(canvas);
}
}
}
});
}
reader.readAsDataURL(file[0]);
}
function uploadfile(canvas) {
let src = canvas.toDataURL("image/png"); //这里转成的是base64的地址,直接用到img标签的src是可以显示图片的
//转成Blob对象
function dataURItoBlob(dataURI) { //图片转成Buffer
//atob() 方法用于解码使用 base-64 编码的字符串。
//base-64 编码使用方法是 btoa() 。
var byteString = atob(dataURI.split(',')[1]);
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
var ab = new ArrayBuffer(byteString.length);
var ia = new Uint8Array(ab);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
return new Blob([ab], { type: mimeString });
}
var blob = dataURItoBlob(src);
console.log('二进制对象:');
console.log(blob);
//转成File对象
function dataURLtoFile(dataurl, filename) {
var arr = dataurl.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], filename, { type: mime });
}
var file_b = dataURLtoFile(src, 'test.png');
var formData = new FormData();
var columnName = 'img';
formData.append(columnName, file_b);
formData.append("filetype", file_b.type);
console.log('文件对象:');
console.log(file_b);
}
</script>
</body>
</html>
exif.js
用于从图像文件中读取EXIF元数据的JavaScript库。
您可以在浏览器中的图像上使用它,从图像或文件输入元素。
检索EXIF和IPTC元数据。这个包也可以在AMD或CommonJS环境中使用。
注意:EXIF标准仅适用于.jpg和.tiff图像。
这个包中的EXIF逻辑基于EXIF标准v2.2 (JEITA CP-3451,包含在这个repo中)。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script src="./jquery-1.7.2.min.js"></script>
<script src="./exif.min.js"></script>
</head>
<body>
<img src="1.jpg" id="J-logo"/>
<script type="text/javascript">
var getor = function() {
EXIF.getData(document.getElementById("J-logo"),
function() {
var aaa = EXIF.getAllTags(this);
var orp = EXIF.getTag(this, 'Orientation');
if (orp == 1) {
$("#J-logo").css("transform", "rotate(0deg)");
} else if (orp == 3) {
$("#J-logo").css("transform", "rotate(180deg)");
} else if (orp == 6) {
$("#J-logo").css("transform", "rotate(90deg)");
} else if (orp == 8) {
$("#J-logo").css("transform", "rotate(270deg)");
}
});
}
setTimeout('getor()', 1);
</script>
</body>
</html>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了如何在React中直接使用Redux,目前redux在react中使用是最多的,所以我们需要将之前编写的redux代码,融入到react当中去,本文给大家详细讲解,需要的朋友可以参考下
这篇文章给大家分享的是React中实现页面跳转的方法,文中给大家介绍了三种方法。小编觉得挺实用的,因此分享给大家做个参考,文中的示例代码介绍得很详细,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。
JS中异步和单线程是什么?对于新手来说,可能不是很了解异步和单线程,因此下文小编就给大家来简单的介绍一下什么是异步和单线程,对帮大家学习和理解JavaScript的异步和单线程一定的帮助,感兴趣的朋友就继续往下看吧。
本文给大家分享的是window下自带name的属性的内容,一些朋友可能对于window的name属性的作用和使用等等,不是很了解,对此这本文就简单的介绍一下,接下来我们一起了解看看吧。
线程和进程是计算机操作系统的基础概念,在程序员中属于高频词汇,那如何理解呢?Node.js 中的进程和线程又是怎样的呢?下面本篇文章就来一起了解一下,希望对大家有所帮助!
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008