html图片上传等比例压缩,图片上传前预处理,等比缩放、裁剪 (html5 + canvas)

本文作者:IMWeb capricorncd

未经同意,禁止转载

e076b84e3f0c68dcf024b08d5983b1cc.png

Image pre processing for upload (html5 + canvas)

解决图片上传前缩放到一定比例自动居中裁剪、等比缩放等。后期版本应该会加入手动设置裁剪位置及缩放比例。

处理完成后,将返回处理完成的数据,及原图片文件的大小、宽度、高度和Base64数据。(详见参数说明)

非图片文件将不做处理,返回文件数据data(name, lastModified, lastModifiedDate, size, type)等信息

使用方法

选择图片

// 选择按钮id

elm: 'buttonId',

// 图片预览容器 id,容器height!=0

target: 'imgWrapper',

// 是否裁剪图片。为true时,必须同时设置width、height值大于0

crop: true,

// 缩放宽高

width: 640,

height: 640,

// 处理后图片的格式,支持jpg、png格式

// type: 'jpg',

// 处理完成回调函数

success: function (result){

// 所有返回参数

console.log(result);

if (result.code === 0) {

console.log('裁剪或压缩后的图片数据:');

console.log(result.data);

console.log('处理后图片文件大小为:' + imgTools.conversion(result.size));

console.log('原图片数据:');

console.log(result.rawdata);

console.log('原图片文件大小为:' + imgTools.conversion(result.rawdata.size));

}

/**

* result.data //待上传的图像数据

* 可将result.data写入input[value],利用form表单上传

* 或直接通过如腾讯云接口直接上传,如下:

*/

/**

* 腾讯云上传实例,详见腾讯云文件上传文档

* https://www.qcloud.com/document/product/436/8095

*/

},

// 图片处理进度

// progress {Number} 0-1范围

progress: function (progress){

// 显示进度的元素

document.getElementById('progressElm') = progress;

console.log(progress);

},

// 处理过程中的错误提示

error: function (err){

console.warn(err.msg);

}

});

Vue.js 2.0中使用

需异步初始化

import IPTS from './path/image-process-tools.min';

export default {

data () {

return {

// 待上传的文件数据

uploadData: null

}

},

created () {

this.$nextTick(() => {

this.initUploadData();

});

},

methods: {

// 图片选择按钮方法@click="selectImage"

selectImage () {

// 模拟 selectorFileBtn 被点击

let btn = document.getElementById('selectorFileBtn');

// 模拟input点击事件

let evt = new MouseEvent("click", {

bubbles: false,

cancelable: true,

view: window

});

btn.dispatchEvent(evt);

return false;

},

// 初始化上传数据

initUploadData () {

let vm = this;

let imgTools = new IPTS({

elm: 'selectorFileBtn',

target: 'imgWrapper',

crop: true,

width: 640,

height: 640,

success: (res) => {

// 存储数据,方便上传时读取

vm.uploadData = res.data;

},

error: (err) => {

console.warn(err.msg);

}

});

}

}

}

修改后的文件生成,并压缩:

npm run build

使用效果图

e093124f40bd3298931c7ff12d53248c.png

fe9fc232383c7d8098264e4fd8cbede8.png

Options 参数

elm: buttonId 选择图片按钮id(必须)

target: imgWrapper 图片预览容器id(可选)

crop: true 是否裁剪图片(可选)

为true时,必须同时设置width、height值大于0

裁剪规则: 图片缩放到一定比列(即一边等于设置值,另一边超出设置值部分裁去),居中裁剪

width: 640 裁剪或缩放宽度为640px(可选)

不配置crop,或crop为false时,则为缩放尺寸。

1.限制宽度缩放,则只需设置width值。

2.限制高度缩放,则只需设置height值。

3.若crop为false,同时设置了width/height值,则只按width缩放,忽略height

height: 640 裁剪或缩放高度为640px(可选)

type: jpg 上传图片目标格式,默认jpg/png(可选)

1.不配置此项,则保留原图片格式(bmp文件会转换成jpg, gif会转换为png)。

2.配置后,将所有格式图片转换为配置格式。

3.可选值'jpg', 'png'。

4.HTMLCanvasElement.toDataURL()不支持'gif', 'bmp',均输出'png'格式

success: function(result){ console.log(result) } 图片处理完成后的回调函数

code: 0 成功代码

data: blobData 处理成功的图片数据,可直接上传至服务器,或赋值给input利用form表单提交。

element: canvas canvas节点对象

msg: success 成功消息

width: 640 处理完成的图片宽度

height: 640 处理完成的图片宽度

size: 21100 处理完成的图片文件大小

type: image/png 处理完成的图片类型

rawdata: Object 原图片相关属性(宽高/文件大小/Base64编码数据/类型/元素节点)

data: base64Data, 原图片base64格式数据

element: image, 原图片接到对象

height: 1200, 原图片高度

size: 215444, 原图片文件大小

type: image/png, 原图片格式

width: 2000 原图片宽度

progress: function(progress){ console.log(progress); } 图片处理据进度,范围0-1。仅对处理图片有效,非图片文件没有回调。

error: function(err){ alert(err.msg); } 处理过程中的错误或警告回调函数

部分接口

conversion(size) // 将size单位B转换为KB或M(大于1024KB则返回M)

getFileSuffix(fileName) // 获取文件后缀名

isImage(fileName) // 判断文件是否为图片格式

toBlobData(Base64Data, type) // 将图片base64数据转换为blob可上传的数据; type可选,默认与Base64Data类型相同,支持类型image/png, image/jpeg

返回code说明

成功code

code

msg

0

成功,程序正常完成整套流程,并返回最终结果

1

选中的文件非图片文件,返回选中文件数据data

错误code

code

msg

1

配置参数未配置或有误

2

配置图片选择按钮id

3

浏览器不支持addEventListener()

4

浏览器不支持FileReader接口,需升级或更换高版本的浏览器

5

未选中文件

6

选中的文件不是图片文件

7

文件读取错误

8

图片数据加载错误

9

当前图片文件尺寸小于裁剪尺寸

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
压缩HTML: 可以使用多种工具来压缩HTML,例如HTMLMinifier或UglifyJS等。这些工具可以删除不必要的空格、注释和其他字符,从而减小文件大小。以下是使用HTMLMinifier进行HTML压缩的示例代码: ```javascript const html = '<html><head><title>Hello World</title></head><body><p>Hello, world!</p></body></html>'; const minifiedHtml = htmlMinifier.minify(html, { collapseWhitespace: true, removeComments: true, minifyCSS: true, minifyJS: true }); ``` 图片: 可以使用HTML5的File API来实现图片。以下是一个基本的示例: ```html <input type="file" id="upload-input"> <script> const input = document.getElementById('upload-input'); input.addEventListener('change', (e) => { const file = e.target.files[0]; const reader = new FileReader(); reader.onload = (event) => { const imageData = event.target.result; // 图片数据 // 将图片数据上到服务器 }; reader.readAsDataURL(file); }); </script> ``` JS Canvas 修改图片尺寸和压缩大小: 可以使用canvas的API来修改图片的尺寸和压缩图片大小。以下是一个基本的示例: ```html <input type="file" id="upload-input"> <canvas id="canvas"></canvas> <script> const input = document.getElementById('upload-input'); const canvas = document.getElementById('canvas'); const context = canvas.getContext('2d'); input.addEventListener('change', (e) => { const file = e.target.files[0]; const reader = new FileReader(); reader.onload = (event) => { const img = new Image(); img.onload = () => { // 计算小后的尺寸 const maxWidth = 300; const maxHeight = 300; let width = img.width; let height = img.height; if (width > height) { if (width > maxWidth) { height *= maxWidth / width; width = maxWidth; } } else { if (height > maxHeight) { width *= maxHeight / height; height = maxHeight; } } canvas.width = width; canvas.height = height; // 绘制小后的图片 context.drawImage(img, 0, 0, width, height); // 压缩图片 const quality = 0.7; const imageData = canvas.toDataURL('image/jpeg', quality); // 将图片数据上到服务器 }; img.src = event.target.result; }; reader.readAsDataURL(file); }); </script> ``` 以上是一个基本的实现,具体的实现方式可以根据需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值