直接上代码:(具体看注释)

需要引用jquery.min.js

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>压缩图片</title>
</head>
<body>
<input type="file" name="file" id="file">
<div id="container"></div> <script src="../jquery-3.3.1.min.js"></script>
<script>
$(function(){
$("#file").on("change",function(){
var file = this.files[0]
photoCompress(file, 200, $("#container")[0])
})
}) /**@argument
* file:文件(图片形式)
* w:文件压缩后的宽度
* objDiv:容器或者回调函数
**/
function photoCompress(file, w, objDiv){
var ready = new FileReader() // 异步文件读取机制
ready.readAsDataURL(file) // 图片预览
ready.onload = function(){
var re = this.result
canvasDataURL(re, w, objDiv)
}
} function canvasDataURL(re, w, objDiv){
var newImg = new Image()
newImg.src = re
var imgWidth,
imgHeight
offsetX = 0,
offsetY = 0
// img的onload事件中同步执行绘制图像的函数,就可以一边装载一边绘制了
newImg.onload = function(){
var img = document.createElement("img")
img.src = newImg.src
imgWidth = img.width
imgHeight = img.height
var newHeight = Math.round(imgHeight * w / imgWidth) // 按比例计算压缩后的图片高度
var canvas = document.createElement("canvas")
canvas.width = w
canvas.height = newHeight
var ctx = canvas.getContext('2d')
// clearRect(x,y,width,height)
// 参数说明:x、y矩形起点的横纵坐标,width、height表示矩形宽高
ctx.clearRect(0,0,w,newHeight)
// 重置图片宽高为压缩后的宽高
imgWidth = w
imgHeight = newHeight
// drawImage(image,x,y,w,h)
// 参数说明:image-Image对象,x、y是绘制时该图像在画布中的起始坐标。w、h表示绘制时图像的宽高
// 该方法也可以复制图片某个区域:drawImage(image,sx,sy,sw,sh,dx,dy,dw,dh)
// 参数说明:image-Image对象,sx、sy是复制源图像中被复制区域的起点横纵坐标,sw、sh时候被复制区域的宽高
// dx、dy是表示复制后的目标图像在画布中的起始横纵坐标,dw,dh是复制后的目标图像的宽高
ctx.drawImage(img,offsetX,offsetY,imgWidth,imgHeight) /*******************start复制局部区域放大(需要把画布宽高都增加200) *************/
// ctx.drawImage(img,360,390,800,400,imgWidth,0,150,100)
/*********************************** end **********************************/ /*******************************start像素处理 *******************************/
// 像素处理:下面定义的imagedata其实是一个CanvasPixelArray对象,具有height、width、data等属性。
// data属性是一个保存像素数据的数组,每四个为一组,按顺序分别表示:红色值,绿色值,蓝色值,透明度值。
// var imgdata = ctx.getImageData(0,0,imgWidth,imgHeight)
// var imgdataArr = imgdata.data
// var imgdataLen = imgdataArr.length
// console.log(imgdataArr)
// for(var i = 0; i < imgdataLen; i += 4){
// imgdataArr[i] = 255 - imgdataArr[i] // red
// imgdataArr[i+1] = 255 - imgdataArr[i+1] // green
// imgdataArr[i+2] = 255 - imgdataArr[i+2] // blue
// }
// ctx.putImageData(imgdata,0,0) // 重置像素值后重绘图像:参数分别表示:imgdata-像素组,重绘图像的起点横纵坐标
/*********************************** end **********************************/ var base64 = canvas.toDataURL('img/png',0.7) // 参数表示:指定的图片类型,图片质量
if(typeof objDiv === 'object'){
objDiv.appendChild(canvas)
// console.log(base64)
} else if(typeof objDiv === 'function'){
objDiv(base64)
}
}
}
</script>
</body>
</html>

如有问题请指出~

canvas图片压缩,局部放大,像素处理的更多相关文章

  1. vue开发中vue-resource + canvas 图片压缩、上传、预览

    1.使用vue-resource上传,也可以自定义ajax上传: 2.使用<input type="file" @change="submit()" na ...

  2. js canvas图片压缩

    function preview_picture(pic){ var r=new FileReader(); r.readAsDataURL(pic); r.onload=function(e){ d ...

  3. 基于canvas的前端图片压缩

    /*common*/ /** * canvas图片压缩 * @param {[Object]} opt [配置参数] * @param {[Function]} cbk [回调函数] * @retur ...

  4. HTML5 CANVAS 实现图片压缩和裁切

    原文地址:http://leonshi.com/2015/10/31/html5-canvas-image-compress-crop/?utm_source=tuicool&utm_medi ...

  5. 使用FormData数据做图片上传: new FormData() canvas实现图片压缩

    使用FormData数据做图片上传: new FormData()       canvas实现图片压缩 ps: 千万要使用append不要用set   苹果ios有兼容问题导致数据获取不到,需要后台 ...

  6. Js利用Canvas实现图片压缩

    最近做的APP项目涉及到手机拍照上传图片,因为手机拍照的图片通常都比较大,所以上传的时候就会很慢.为此,需要对图片进行压缩处理来优化上传功能.以下是具体实现: /* * 图片压缩 * img 原始图片 ...

  7. [H5-Compress-Image]利用canvas实现 javascript 图片压缩处理_基于requirejs模块化的代码实现

    // 还存在有问题的代码,问题在于processFile()中// 问题:在ipone 5c 下,某些图片压缩处理后,上传到服务器生成的文件size为0,即是空白 ;define(['mod/tool ...

  8. Vue directive自定义指令+canvas实现H5图片压缩上传-Base64格式

    前言 最近优化项目-手机拍照图片太大,回显速度比较慢,使用了vue的自定义指令实现H5压缩上传base64格式的图片 canvas自定义指令 Vue.directive("canvas&qu ...

  9. canvas前端压缩图片

    参考网上的用法,下面是利用canvas进行的图片压缩 <!DOCTYPE html> <html> <head> <meta charset="ut ...

随机推荐

  1. 【bzoj3083】遥远的国度 树链剖分+线段树

    题目描述 描述zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度.当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了zcwwzdjn的去路,他需要zcwwzdjn ...

  2. PIC单片机之时钟设置

    PIC单片机之时钟设置 http://blog.csdn.net/superanters/article/details/8541650 内部时钟和外部时钟? PIC单片机有许多型号可以设置成 用外部 ...

  3. [CQOI2014][bzoj3507] 通配符匹配 [字符串hash+dp]

    题面 传送门 思路 0x01 KMP 一个非常显然而优秀的想法:把模板串按照'*'分段,然后对于每一段求$next$,'?'就当成可以对于任意字符匹配就行了 对于每个文本串,从前往后找第一个可以匹配的 ...

  4. 连接XenServer中VM的Console。

    在XenServer6.2中的虚拟机,连接Guest VM串口的方法: 1. 首先在Guest VM中设置串口: 我的是CentOS6: 修改/etc/grub/grub.conf: 2. 修改完后, ...

  5. svg动画 之 我的自制太阳系

    SVG意为可缩放矢量图形,svg的图片与普通的jpg,png等图片相比,其优势在于不失真.一般普通的图片放大后,会呈现出锯齿的形状,但是svg图片则不会这样,它可以被高质量地打印. 现在就用dream ...

  6. String 类详解

    StringBuilder与StringBuffer的功能基本相同,不同之处在于StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此效率上StringBuilder类 ...

  7. 关于UITextView的限制字数显示,以及emjor表情占用字节处理,复制粘贴字节处理~优化

    //限制字数 #define MAX_LIMIT_NUMS 30 1 #pragma mark -- textview的代理事件 - (BOOL)textView:(UITextView *)text ...

  8. pat 甲级 1056. Mice and Rice (25)

    1056. Mice and Rice (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Mice an ...

  9. WIN8.1安装 .net framework 3.5

    1.虚拟光驱加载安装镜像 2.以管理员权限运行cmd 3.输入以下命令: dism.exe /online /enable-feature /featurename:NetFX3 /Source:X: ...

  10. FileInputStream/FileOutputStream的应用

    这是一对继承于InputStream和OutputStream的类,用于本地文件读写(二进制格式读写并且是顺序读写,读和写要分别创建出不同的文件流对象): 本地文件读写编程的基本过程为: ①  生成文 ...