uni-app ios 图片选择原图压缩设置宽高后,图片会旋转导致变形
uni-app ios 图片选择原图压缩设置宽高后,图片会旋转导致变形
uni.compressImage 设置宽高后图片旋转导致图片变形(ios 选择原图),获取原图片 高大于宽,但是 不设置宽高,压缩后获取图片 是 宽>高,导致uni.compressImage设置宽高后,图片变形
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
iOS | 未知 | 未知 |
2 回复
如果uni.compressImage有问题,建议使用compressorjs压缩,放弃uni封装的
npm install compressorjs --save
在uni-app中处理iOS设备上图片选择后压缩并设置宽高时可能出现的旋转变形问题,可以通过获取图片的EXIF信息,并根据该信息对图片进行正确的旋转处理,然后再进行压缩和尺寸调整。以下是一个示例代码,展示了如何在uni-app中实现这一过程。
首先,需要安装一个用于处理EXIF信息的库,例如exif-js
。可以通过在HBuilderX中直接下载该库并引入,或者使用npm(如果项目配置支持)。
<!-- 在index.html中引入exif-js库 -->
<script src="path/to/exif-js"></script>
接下来,在uni-app的页面脚本中处理图片选择、EXIF读取、旋转校正以及压缩调整尺寸的逻辑:
export default {
methods: {
chooseAndProcessImage() {
uni.chooseImage({
count: 1,
sourceType: ['album', 'camera'],
success: (res) => {
const filePath = res.tempFilePaths[0];
this.loadImageAndProcess(filePath);
}
});
},
loadImageAndProcess(filePath) {
uni.getImageInfo({
src: filePath,
success: (imageInfo) => {
const orientation = EXIF.getTag(this.getImageData(filePath), 'Orientation');
const canvasId = 'imageCanvas';
const ctx = uni.createCanvasContext(canvasId);
// 根据EXIF的Orientation调整canvas的drawImage参数
let drawWidth = imageInfo.width;
let drawHeight = imageInfo.height;
let drawX = 0;
let drawY = 0;
if (orientation > 4) {
drawWidth = imageInfo.height;
drawHeight = imageInfo.width;
}
switch (orientation) {
case 2: drawX = drawWidth; drawY = 0; drawWidth = -drawWidth; break;
case 3: drawX = drawWidth; drawY = drawHeight; drawWidth = -drawWidth; drawHeight = -drawHeight; break;
case 4: drawY = drawHeight; drawHeight = -drawHeight; break;
case 5: drawX = 0; drawY = drawHeight; drawHeight = -drawHeight; break;
case 6: drawX = 0; drawY = 0; drawWidth = -drawWidth; break;
case 7: drawX = drawWidth; drawY = 0; break;
case 8: drawY = 0; break;
}
// 绘制到canvas上,并导出为指定宽高的图片
ctx.drawImage(filePath, drawX, drawY, drawWidth, drawHeight, 0, 0, 300, 300); // 假设目标宽高为300x300
ctx.draw(false, () => {
uni.canvasToTempFilePath({
canvasId,
destWidth: 300,
destHeight: 300,
success: (res) => {
console.log('Processed image path:', res.tempFilePath);
}
});
});
}
});
},
getImageData(filePath) {
// 这里需要实现一个方法,将filePath转换为Blob或ArrayBuffer,用于EXIF.getData
// 由于uni-app的限制,可能需要通过服务器端代理或插件来实现这一步
// 此处省略具体实现,仅作为示例
return null; // 占位符
}
}
}
注意:由于uni-app直接处理文件读取和Blob数据的能力有限,getImageData
方法的实现可能需要借助原生插件或服务器端代理来完成。此外,上述代码示例中的EXIF处理部分假设EXIF.getTag
和EXIF.getData
方法可以直接使用,但在实际环境中可能需要根据具体的EXIF库进行调整。