热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发日志:高效图片压缩与上传技术解析

篇首语:本文由编程笔记#小编为大家整理,主要介绍了图片压缩上传相关的知识,希望对你有一定的参考价值。 图片压缩的方法 // 图片压缩 compressImage(file, success

篇首语:本文由编程笔记#小编为大家整理,主要介绍了图片压缩上传相关的知识,希望对你有一定的参考价值。


图片压缩的方法


// 图片压缩
compressImage(file, success, error) {
// 图片小于1M不压缩
// if (file.size
// return success(file);
// }
const name = file.name; //文件名
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload
= e => {
const src
= e.target.result;
const img
= new Image();
img.src
= src;
img.onload
= e => {
const w
= img.width;
const h
= img.height;
const quality
= 0.8; // 默认图片质量为0.92
// 生成canvas
const canvas = document.createElement(‘canvas‘);
const ctx
= canvas.getContext(‘2d‘);
// 创建属性节点
const anw = document.createAttribute("width");
anw.nodeValue
= w;
const anh
= document.createAttribute("height");
anh.nodeValue
= h;
canvas.setAttributeNode(anw);
canvas.setAttributeNode(anh);
// 铺底色 PNG转JPEG时透明区域会变黑色
ctx.fillStyle = "#fff";
ctx.fillRect(
0, 0, w, h);
ctx.drawImage(img,
0, 0, w, h);
// quality值越小,所绘制出的图像越模糊
const base64 = canvas.toDataURL(‘image/jpg‘, quality); // 图片格式jpeg或webp可以选0-1质量区间
// 返回base64转blob的值
console.log(`原图${(src.length/1024).toFixed(2)}kb`, `新图${(base64.length/1024).toFixed(2)}kb`);
// 去掉url的头,并转换为byte
const bytes = window.atob(base64.split(‘,‘)[1]);
// 处理异常,将ascii码小于0的转换为大于0
const ab = new ArrayBuffer(bytes.length);
const ia
= new Uint8Array(ab);
for (let i = 0; i ) {
ia[i]
= bytes.charCodeAt(i);
}
file
= new Blob([ab], {type : ‘image/jpg‘});
file.name
= name;
success(file);
}
img.onerror
= e => {
error(e);
}
}
reader.onerror
= e => {
error(e);
}
},

调用上传


// file.file 原来的对象 obj 压缩好的对象
this.compressImage(file.file, obj => {
console.log(file.file)
console.log(obj)
file.status
= ‘uploading‘
file.message
= ‘上传中...‘;
setTimeout(()
=> {
let formData
= new FormData()
formData.append(
‘file‘, obj, obj.name)
........

},
1000)
})

 


推荐阅读
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文介绍如何使用 Python 提取和替换 .docx 文件中的图片。.docx 文件本质上是压缩文件,通过解压可以访问其中的图片资源。此外,我们还将探讨使用第三方库 docx 的方法来简化这一过程。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 帝国CMS多图上传插件详解及使用指南
    本文介绍了一款用于帝国CMS的多图上传插件,该插件通过Flash技术实现批量图片上传功能,显著提升了多图上传效率。文章详细说明了插件的安装、配置和使用方法。 ... [详细]
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • libsodium 1.0.15 发布:引入重大不兼容更新
    最新发布的 libsodium 1.0.15 版本带来了若干不兼容的变更,其中包括默认密码散列算法的更改和其他重要调整。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文介绍如何在Linux Mint系统上搭建Rust开发环境,包括安装IntelliJ IDEA、Rust工具链及必要的插件。通过详细步骤,帮助开发者快速上手。 ... [详细]
author-avatar
妞妞吃粑粑_577
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有