IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> input调起ios摄像头拍照旋转问题解决思路 -> 正文阅读

[移动开发]input调起ios摄像头拍照旋转问题解决思路

背景

input标签调起ios原生摄像头拍照时,上传照片发现照片向左旋转了90度

旋转的原因:

手机拍照会给图片添加一个Orientaion信息(即拍照方向),如下:
在这里插入图片描述
用ios手机拍照,系统会给图片加上一个方向的属性, ios相机默认的拍照方向是后摄Home键在右为正,前摄Home键在左为正。

1代表正常的拍摄角度,ios横屏下拍摄、安卓机无论横屏竖屏拍摄,Orientaion的值都为1;但是ios竖屏拍摄,Orientaion的值为6,即竖着拍出的照片被添加了一个顺时针旋转90°的拍照方向,显示的时候其实就是横着拍的照片顺时针旋转90°而成。当我们对拍出来的照片进行处理后(比如压缩),这个拍摄方向Orientaion信息就会丢失,显示的效果自然回到横屏状态,看起来像是逆时针旋转了90°

受之于鱼不如授之于渔 我提出三种解决思路

第一种解决思路:

1、利用exif-js获取file拍摄方向信息Orientation
2、创建canvas,ctx = canvas.getContext(‘2d’);
3、根据Orientation,经过ctx.rotate(旋转)、 ctx.drawImage(手动绘图)
4、canvas.toBlob 创建文件流,再传给服务端

这也是网上的大神通用的解决办法

  • 缺点(推荐指数:3星)
    • 很多人卡在了第一步,获取到的Orientation=undefined; 首先获取图片信息只对拍摄方式的照片生效,不要在本地上传图片进行调试;其次获取Orientation时,要在回调函数内获取,如下代码
    • 需要熟悉canvas知识
    • 第三部rotate、drawImage方法如果没有掌握的很好,最后的绘图步骤会让你抓狂
    • 第四部创建的文件流会超级大,需要很久的上传时长,尽管可以控制转换质量使之变小,但也会大大失桢
	// 只对即时拍摄的照片生效,file为文件流,非base64
    ExifObj.getData(file, function () {
            const Orientation = ExifObj.getTag(file, 'Orientation');
          	// 在这里获取
    });
    // 不要在这里获取
第二种解决思路:

如果没有特殊要求,请不要对图片进行二次处理,例如进行压缩,最简单快捷地解决问题;

第三种解决思路:(推荐指数:5星)

思路:既然经处理后的图片方向信息丢失,那我们可以手动再次添加方向不就解决问题了嘛

  • 如果图片必须经过处理,在处理前请先利用exif-js缓存照片方向信息
  • 处理后利用piexif手动对处理后的文件添加方向信息
  • 最后向服务器发送文件流或base64信息-保存
  • 缺点:最后添加的方向信息可能会使图片的size增加,但完全规避了方法一繁琐的步骤及开发成本
npm i exif-js
npm i piexif
...
import React, { useState, useEffect, FC } from 'react';
import Exif from 'exif-js';
import * as piexif from 'piexif';
import { IExif, IExifElement, TagValues } from 'piexif';

interface IProps {
    history: any; // TS内容 可不写
}
const AppView: FC<IProps> = props => {
	
	const ExifObj = Exif;
    const Piexif = piexif;
    const [orientation, setOrientation] = useState<number>(1); // 初始化方向
    
    useEffect(() => {
    	ExifObj.getData(file, function () {
	     	setOrientation(ExifObj.getTag(file, 'Orientation')); // 先获取方向信息file为文件流
	     	
	     	// ——————————————————————————
			// 这里是图片文件处理过程,省略1w行代码...
			// ——————————————————————————
	
			// 开始利用piexif写图片方向信息
			let zeroth: IExifElement = {};
	        zeroth[TagValues.ImageIFD.Orientation] = orientation;
	        
	        let exifObj: IExif = { '0th': zeroth }; // 重新写方向
	        let exifStr = Piexif.dump(exifObj); //获取需要写信息的合法字符串格式
	        let resultBase64 = Piexif.insert(exifStr, file); //将exif信息插入到base64中,此时的file为处理后的文件流,非base64,服务端如果需要base64格式则直接上传即可
			
			// 若服务器需要文件流格式(blob),仍需要转化为blob
			const blobfilr = base64ToBlob(resultBase64);  
			
			// 发送ajax  
	 	});

    }, [])
    
	const base64ToBlob = base64 => {
        const parts = base64.split(';base64,');
        const contentType = parts[0].split(':')[1];
        const raw = window.atob(parts[1]);
        const rawLength = raw.length;

        const uInt8Array = new Uint8Array(rawLength);

        for (let i = 0; i < rawLength; i += 1) {
            uInt8Array[i] = raw.charCodeAt(i);
        }
        return new Blob([uInt8Array], { type: contentType });
    };

}

如果真的解决了你的问题或对你有启发,回来点个赞吧

参考文献:
【npm官网】https://www.npmjs.com/package/piexif
【前端开发仓库】http://code.ciaoca.com/javascript/exif-js/
【zoukankan】http://t.zoukankan.com/ranyonsue-p-10830688.html

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-27 11:27:30  更:2022-04-27 11:27:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 23:25:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码