新版webkit内核iphonex竖屏拍照旋转90修复导致exifjs使用问题

news/2024/12/1 0:49:30/

前言

在我们的 H5 页面中,有人脸上传的功能, 在旧版的 iphone 上, 竖屏拍照之后照片自动旋转 90, 因此前端使用了exif.js来根据照片的 orientation 信息来判断照片是否需要旋转. 但最近出现用户使用 iphoneX 拍照之后相片出现了横屏的情况

探索

一开始以为是 orientation 的问题,但是发现在 iphonex 上 alert 出来的 orientation 还是6, 也就是 orientation 参数是正确的, 注释掉旋转相关的代码, 直接 canvas 绘图发现, iphonex 上竖屏拍照默认没有横屏!

方案

经过一番搜索, 发现是新版的 webkit 改变了image-orientation这个 css 属性值, 在旧版是none, 而在新版之中是’from-image’, 也就是默认会忽略 exif 数据, 新版会自动修正, 导致了我们之前使用的exifjs(或者其他基于类似 exif 元数据来处理图片的库)

所以可以通过检测 image-orientaion 来判断是不是新版的 webkit 内核

var styles = getComputedStyle(document.querySelector("#some-image"));
if (styles.getPropertyValue("image-orientation") === "from-image") {// 图片已经被修正
}

参考代码

getOriginOrientationImage (imagePath) {return new Promise((resolve, reject) => {const image = new Image()image.src = imagePathuni.showLoading({title: '处理中...'})image.onload = function () {EXIF.getData(image, function () {const orientation = EXIF.getTag(this, 'Orientation')// 旋转图片为1方向if (orientation > 1 && orientation <= 8) {// https://github.com/mattiasw/ExifReader/issues/99#issuecomment-640217716let newWebkitHasFixedProtraitOrientaion = falseconst styles = getComputedStyle(document.querySelector('#face-image'))if (styles.getPropertyValue('image-orientation') === 'from-image') {newWebkitHasFixedProtraitOrientaion = true}const canvas = document.createElement('canvas')const ctx = canvas.getContext('2d')const imageWidth = image.widthconst imageHeight = image.heightconst canvasWidth = (orientation >= 5 && !newWebkitHasFixedProtraitOrientaion) ? imageHeight : imageWidthconst canvasHeight = (orientation >= 5 && !newWebkitHasFixedProtraitOrientaion) ? imageWidth : imageHeightcanvas.width = canvasWidthcanvas.height = canvasHeightctx.clearRect(0, 0, canvasWidth, canvasHeight)switch (orientation) {case 6:ctx.translate(imageHeight / 2, imageHeight / 2)if (!newWebkitHasFixedProtraitOrientaion) {ctx.rotate(90 * Math.PI / 180)}ctx.translate(-imageHeight / 2, -imageHeight / 2)breakdefault: break}ctx.drawImage(image, 0, 0)canvas.toBlob((blob) => {uni.hideLoading()const url = getObjectURL(blob)resolve(url)}, '2019/jpeg', 1)} else {uni.hideLoading()resolve(imagePath)}})}})
}
},

参考

EXIF Orientation Issue in Safari Mobile

Reports “right-top” for portrait photos


http://www.ppmy.cn/news/440915.html

相关文章

iOS 相机拍照与图库

首先要采用三个协议&#xff0c;分别是 UINavigationControllerDelegate , UIImagePickerControllerDelegate , UIActionSheetDelegate -(IBAction)photoClick:(id)sender {UIActionSheet *actionSheet [[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonT…

经常用苹果手机拍照!不学会这4个功能,怪不得拍不出好照片

苹果手机不仅系统非常流畅耐用&#xff0c;相机也会是十分给力&#xff0c;使用它就能轻松拍出好照片。 不信&#xff1f;只要学会苹果相机中的这4个功能&#xff0c;随手一拍就是非常好的照片哦。 下面就来一起看看吧&#xff01; 1.全景模式 相信这个模式大家使用的比较少&a…

ios照片获取、拍照功能

// // HYBPhotoPickerManager.h // ehui // // Created by 黄仪标 on 14/11/26. // Copyright (c) 2014年 黄仪标. All rights reserved. //#import <Foundation/Foundation.h>/*!* brief 照片获取或者拍照功能管理器* author huangyibiao*/ interface HYBPhotoPicke…

VFC芯片结构及其工作原理

&#xff08;二&#xff09; VFC芯片结构及其工作原理 1&#xff0e;VFC芯片 AD654的结构 AD654芯片是一个单片VFC变换芯片&#xff0c;中心频率为250kHZ。它是由阻抗变换器A、压控振荡器和一个驱动输出级回路构成&#xff0c;其内部结构见图1&#xff0d;15&#xff08;a入压…

iPhone 11 Pro 的拍照好在哪?这是专业摄影师给出的答案

来源 | AppSo&#xff08;ID&#xff1a;AppSo&#xff09; 作者 | 肖钦鹏 相机&#xff0c;无疑是新一代 iPhone 的最大卖点&#xff0c;在之前的 iPhone 11 和 iPhone 11 Pro 评测中&#xff0c;我曾这样评价&#xff1a; 我们以前常说&#xff0c;iPhone 是用做电脑的思路做…

iPhone语音拍照怎么用?

要如何实现iPhone声控拍照&#xff08;iOS语音拍照&#xff09;&#xff1f;在出去游玩时&#xff0c;想要一张美美的照片还要找人帮忙&#xff0c;其实iPhone语音拍照完全可以解决你的烦恼。iOS隐藏技巧&#xff0c;轻松实现iPhone声控拍照功能和Apple Watch无线控制iPhone相机…

ios 拍照与摄像

ios 拍照与摄像 (2012-11-23 14:38:40) 该类继承自UINavigationController类 步骤&#xff1a; 检查媒体来源模式是否可用 检查该来源模式下所支持的媒体类型 创建图像选取控制器&#xff0c;设置其属性并显示 在委托协议方法中处理 1.检查媒体来源 调用UIImagePickerControl…

iOS拍照图片方向

参考链接&#xff1a;1 iOS_UIImage的方向(imageOrientation) 2 iOS实时获取当前的屏幕方向之重力感应 3 UIImage图片处理&#xff0c;旋转、截取、平铺、缩放等操作&#xff0c;持续更新中 问题&#xff1a; 1.拍摄的图片直接推送到其他设备的显示&#xff0c;图片会有一定角度…