>  기사  >  웹 프론트엔드  >  HTML5와 캔버스를 결합하여 이미지 압축 달성

HTML5와 캔버스를 결합하여 이미지 압축 달성

零到壹度
零到壹度원래의
2018-03-24 16:36:031865검색


이번에는 주로 코드 형식에 반영되는 이미지 압축을 달성하기 위해 캔버스와 결합된 HTML5를 소개하겠습니다.

<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
 <meta name=&#39;viewport&#39; content=&#39;width=device-width, initial-scale=1, maximum-scale=1&#39;>
 <title>lianxi </title>
 <style type="text/css">
    </style>
</head>
<body>
    <form>
 名字:<input type="text " name = &#39;username&#39; id = &#39;username&#39;/>
 上传:<input type="file" name = &#39;fileimage&#39; id = &#39;fileimage&#39; />
 </form>
 <button>button</button>
 <script>
 var file = document.querySelector(&#39;#fileimage&#39;)
 var username = document.querySelector(&#39;#username&#39;)
 var canvas = document.createElement(&#39;canvas&#39;);
 var span = document.createElement(&#39;span&#39;)
 var formData = new FormData()
 file.addEventListener(&#39;change&#39;,function() {
 //实现的原理的new formData()然后把这个formData 用ajax传进去
 span.innerHTML = &#39;预览图加载中...&#39;
 document.body.appendChild(span)
 console.log(file.files[0])
 username.value ? formData.append(&#39;username&#39;,username.value) : null;
 resize(file.files[0]);
 })
 //上传前的图片压缩
 function resize(file) {
 var reader = new FileReader()
 reader.readAsDataURL(file)
 var img = new Image()
 reader.onload = function (e) {
 // this.result就是图片的base64地址信息
 img.src = this.result;
 }
 
 var context = canvas.getContext(&#39;2d&#39;);
 var gif = document.createElement(&#39;img&#39;)
 
 // base64地址图片加载完毕后
 img.onload = function () {
 // 图片原始尺寸
 //定义画布的大小
 if (img.width > 300 || img.height > 300) {
 if (img.width > img.height) {
 canvas.width = 300
 canvas.height = img.height / img.width * 300
 }
 else {
 canvas.height = 300
 canvas.width = img.width / img.height * 300
 }
 }
 //从那里开始截取图片
 context.drawImage(img, 0, 0, canvas.width, canvas.height)
 /*第一个参数是创建的img对象;第二个参数是左上角坐标,后面两个是画布区域宽高*/
 //压缩后的图片base64 url
                /*canvas.toDataURL(mimeType, qualityArgument),mimeType 默认值是&#39;image/jpeg&#39;;
                 * qualityArgument表示导出的图片质量,只要导出为jpg和webp格式的时候此参数才有效果,默认值是0.92*/
 //var newUrl = canvas.toDataURL(&#39;image/jpeg&#39;, 0.92);//base64 格式
 document.body.removeChild(span)
 document.querySelector(&#39;body&#39;).appendChild(canvas)
 };
 }
 //这是上传的
 document.querySelector(&#39;button&#39;).addEventListener(&#39;click&#39;,function(){
 canvas.toBlob(function(blob){
 var xhr = new XMLHttpRequest()
 formData.append(&#39;fileimage&#39;, blob,&#39;002.webp&#39;)
 xhr.open(&#39;POST&#39;, &#39;test.php&#39;, true)//默认true 为异步
 //上传进度
 xhr.upload.addEventListener(&#39;progress&#39;,function (e) {
 console.log(&#39;上传进度为:&#39;+ (e.loaded/e.total*100).toFixed(2)+&#39;%&#39;)//多次出现
 // event.total是需要传输的总字节,event.loaded是已经传输的字节
 })
 xhr.upload.addEventListener(&#39;loadstart&#39;, function () {
 console.log(&#39;上传开始&#39;)//只出现一次
 })
 xhr.onreadystatechange = function () {
 if (xhr.readyState === 4) {
 if (xhr.status >= 200 && xhr.status <300 || xhr.status == 304) {
 console.log(JSON.parse(xhr.responseText))//成功后的返回值
 }
 else {
 console.log("Request was unsuccessful: " + xhr.status);
 } 
 }
 
 }
 //xhr.setRequestHeader("Content-type", "multipart/form-data");
 xhr.send(formData)
 }, &#39;image/webp&#39;,0.9)
 })
 </script>
</body>
</html>

교차 도메인을 달성하려면 백엔드에 헤더("Access-Control-Allow-Origin:*")를 추가해야 합니다.

관련 링크:

html5+canvas 압축을 실현 이미지 업로드

HTML5 Canvas는 이미지의 로컬 압축을 구현합니다

HTML5 Canvas는 이미지 늘이기, 압축 및 자르기를 구현합니다

위 내용은 HTML5와 캔버스를 결합하여 이미지 압축 달성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.