<html>
<heard>
<title>压缩图片</title>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"
integrity="sha256-4+XzXVhsDmqanXGHaHvgh1gMQKX40OUvDEBTu8JcmNs=" crossorigin="anonymous"></script>
</heard>
<body>
<form action="RequestServlet" method="post" enctype="application/x-www-form-urlencoded">
<input type="file" name="myfile" id="file_t" />
</form>
<button id="submit">提交数据</button>
<p style="color: red;">
<img id="avatar" src="" alt="" style="width: 150px;">
</p>
</body>
<script src="photo.js"></script>
</html>
photo.js
var image_upload;
$("#submit").click(function(){
if(image_upload==null){
alert("请选择您的图片哦!!!");
}
alert(image_upload);
});
$("#file_t").on("change", function (e) {
let files = e.target.files;
var objUrl = getObjectURL(files[0]);
console.log("objUrl = " + objUrl);
test();
});
function test() {
let files = $("#file_t").prop("files");
var previewImg = document.querySelector('#afterImg');
this.compressImage(
files[0],
(file) => {
image_upload = file;
$("#avatar").attr("src", file);
},
$.noop
);
}
compressImage = (file, success, error) => {
if (file.size < Math.pow(1024, 2)) {
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.5;
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);
ctx.fillStyle = "#fff";
ctx.fillRect(0, 0, w, h);
ctx.drawImage(img, 0, 0, w, h);
const base64 = canvas.toDataURL("image/jpeg", quality);
success(base64);
};
img.onerror = (e) => {
error(e);
};
};
reader.onerror = (e) => {
error(e);
};
};
function getObjectURL(file) {
var url = null;
if (window.createObjectURL != undefined) {
url = window.createObjectURL(file);
} else if (window.URL != undefined) {
url = window.URL.createObjectURL(file);
} else if (window.webkitURL != undefined) {
url = window.webkitURL.createObjectURL(file);
}
return url;
}
参考:
https://github.com/kingwsi/compress-pic/blob/master/index.html
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">html</span>></span>
<span class="hljs-tag"><<span class="hljs-name">heard</span>></span>
<span class="hljs-tag"><<span class="hljs-name">title</span>></span>压缩图片<span class="hljs-tag"></<span class="hljs-name">title</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"https://code.jquery.com/jquery-3.5.1.slim.min.js"</span>
<span class="hljs-attr">integrity</span>=<span class="hljs-string">"sha256-4+XzXVhsDmqanXGHaHvgh1gMQKX40OUvDEBTu8JcmNs="</span> <span class="hljs-attr">crossorigin</span>=<span class="hljs-string">"anonymous"</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
<span class="hljs-tag"></<span class="hljs-name">heard</span>></span>
<span class="hljs-tag"><<span class="hljs-name">body</span>></span>
<span class="hljs-tag"><<span class="hljs-name">form</span> <span class="hljs-attr">action</span>=<span class="hljs-string">"RequestServlet"</span> <span class="hljs-attr">method</span>=<span class="hljs-string">"post"</span> <span class="hljs-attr">enctype</span>=<span class="hljs-string">"application/x-www-form-urlencoded"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"file"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"myfile"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"file_t"</span> /></span>
<span class="hljs-tag"></<span class="hljs-name">form</span>></span>
<span class="hljs-tag"><<span class="hljs-name">button</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"submit"</span>></span>提交数据<span class="hljs-tag"></<span class="hljs-name">button</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"color: red;"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">img</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"avatar"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">""</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">""</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"width: 150px;"</span>></span>
<span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"></<span class="hljs-name">body</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"photo.js"</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
<span class="hljs-tag"></<span class="hljs-name">html</span>></span>
</code></div></pre>
<p>photo.js</p>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-keyword">var</span> image_upload;
$(<span class="hljs-string">"#submit"</span>).<span class="hljs-title function_">click</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params"></span>){
<span class="hljs-keyword">if</span>(image_upload==<span class="hljs-literal">null</span>){
<span class="hljs-title function_">alert</span>(<span class="hljs-string">"请选择您的图片哦!!!"</span>);
}
<span class="hljs-title function_">alert</span>(image_upload);
});
<span class="hljs-comment">// 加载原图</span>
$(<span class="hljs-string">"#file_t"</span>).<span class="hljs-title function_">on</span>(<span class="hljs-string">"change"</span>, <span class="hljs-keyword">function</span> (<span class="hljs-params">e</span>) {
<span class="hljs-keyword">let</span> files = e.<span class="hljs-property">target</span>.<span class="hljs-property">files</span>;
<span class="hljs-keyword">var</span> objUrl = <span class="hljs-title function_">getObjectURL</span>(files[<span class="hljs-number">0</span>]);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">"objUrl = "</span> + objUrl);
<span class="hljs-comment">// if (objUrl) {</span>
<span class="hljs-comment">// $("#beforeImg").attr("src", objUrl).show();</span>
<span class="hljs-comment">// }</span>
<span class="hljs-title function_">test</span>();
});
<span class="hljs-comment">// 加载压缩后的图</span>
<span class="hljs-keyword">function</span> <span class="hljs-title function_">test</span>(<span class="hljs-params"></span>) {
<span class="hljs-keyword">let</span> files = $(<span class="hljs-string">"#file_t"</span>).<span class="hljs-title function_">prop</span>(<span class="hljs-string">"files"</span>);
<span class="hljs-keyword">var</span> previewImg = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">'#afterImg'</span>);
<span class="hljs-variable language_">this</span>.<span class="hljs-title function_">compressImage</span>(
files[<span class="hljs-number">0</span>],
<span class="hljs-function">(<span class="hljs-params">file</span>) =></span> {
image_upload = file;
<span class="hljs-comment">// alert(file);</span>
$(<span class="hljs-string">"#avatar"</span>).<span class="hljs-title function_">attr</span>(<span class="hljs-string">"src"</span>, file);
},
$.noop
);
}
<span class="hljs-comment">// 压缩图片</span>
compressImage = <span class="hljs-function">(<span class="hljs-params">file, success, error</span>) =></span> {
<span class="hljs-comment">// 图片小于1M不压缩</span>
<span class="hljs-keyword">if</span> (file.<span class="hljs-property">size</span> < <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">pow</span>(<span class="hljs-number">1024</span>, <span class="hljs-number">2</span>)) {
<span class="hljs-keyword">return</span> <span class="hljs-title function_">success</span>(file);
}
<span class="hljs-keyword">const</span> name = file.<span class="hljs-property">name</span>; <span class="hljs-comment">//文件名</span>
<span class="hljs-keyword">const</span> reader = <span class="hljs-keyword">new</span> <span class="hljs-title class_">FileReader</span>();
reader.<span class="hljs-title function_">readAsDataURL</span>(file);
reader.<span class="hljs-property">onload</span> = <span class="hljs-function">(<span class="hljs-params">e</span>) =></span> {
<span class="hljs-keyword">const</span> src = e.<span class="hljs-property">target</span>.<span class="hljs-property">result</span>;
<span class="hljs-keyword">const</span> img = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Image</span>();
img.<span class="hljs-property">src</span> = src;
img.<span class="hljs-property">onload</span> = <span class="hljs-function">(<span class="hljs-params">e</span>) =></span> {
<span class="hljs-keyword">const</span> w = img.<span class="hljs-property">width</span>;
<span class="hljs-keyword">const</span> h = img.<span class="hljs-property">height</span>;
<span class="hljs-keyword">const</span> quality = <span class="hljs-number">0.5</span>; <span class="hljs-comment">// 默认图片质量为0.92</span>
<span class="hljs-comment">// 生成canvas</span>
<span class="hljs-keyword">const</span> canvas = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">"canvas"</span>);
<span class="hljs-keyword">const</span> ctx = canvas.<span class="hljs-title function_">getContext</span>(<span class="hljs-string">"2d"</span>);
<span class="hljs-comment">// 创建属性节点</span>
<span class="hljs-keyword">const</span> anw = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createAttribute</span>(<span class="hljs-string">"width"</span>);
anw.<span class="hljs-property">nodeValue</span> = w;
<span class="hljs-keyword">const</span> anh = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createAttribute</span>(<span class="hljs-string">"height"</span>);
anh.<span class="hljs-property">nodeValue</span> = h;
canvas.<span class="hljs-title function_">setAttributeNode</span>(anw);
canvas.<span class="hljs-title function_">setAttributeNode</span>(anh);
<span class="hljs-comment">// 铺底色 PNG转JPEG时透明区域会变黑色</span>
ctx.<span class="hljs-property">fillStyle</span> = <span class="hljs-string">"#fff"</span>;
ctx.<span class="hljs-title function_">fillRect</span>(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, w, h);
ctx.<span class="hljs-title function_">drawImage</span>(img, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, w, h);
<span class="hljs-comment">// quality值越小,所绘制出的图像越模糊</span>
<span class="hljs-keyword">const</span> base64 = canvas.<span class="hljs-title function_">toDataURL</span>(<span class="hljs-string">"image/jpeg"</span>, quality); <span class="hljs-comment">// 图片格式jpeg或webp可以选0-1质量区间</span>
<span class="hljs-title function_">success</span>(base64);
};
img.<span class="hljs-property">onerror</span> = <span class="hljs-function">(<span class="hljs-params">e</span>) =></span> {
<span class="hljs-title function_">error</span>(e);
};
};
reader.<span class="hljs-property">onerror</span> = <span class="hljs-function">(<span class="hljs-params">e</span>) =></span> {
<span class="hljs-title function_">error</span>(e);
};
};
<span class="hljs-comment">//建立一個可存取到該file的url</span>
<span class="hljs-comment">// jquery js 的代码:不同浏览器下的路径</span>
<span class="hljs-keyword">function</span> <span class="hljs-title function_">getObjectURL</span>(<span class="hljs-params">file</span>) {
<span class="hljs-keyword">var</span> url = <span class="hljs-literal">null</span>;
<span class="hljs-keyword">if</span> (<span class="hljs-variable language_">window</span>.<span class="hljs-property">createObjectURL</span> != <span class="hljs-literal">undefined</span>) {
<span class="hljs-comment">// basic</span>
url = <span class="hljs-variable language_">window</span>.<span class="hljs-title function_">createObjectURL</span>(file);
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-variable language_">window</span>.<span class="hljs-property">URL</span> != <span class="hljs-literal">undefined</span>) {
<span class="hljs-comment">// mozilla(firefox)</span>
url = <span class="hljs-variable language_">window</span>.<span class="hljs-property">URL</span>.<span class="hljs-title function_">createObjectURL</span>(file);
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-variable language_">window</span>.<span class="hljs-property">webkitURL</span> != <span class="hljs-literal">undefined</span>) {
<span class="hljs-comment">// webkit or chrome</span>
url = <span class="hljs-variable language_">window</span>.<span class="hljs-property">webkitURL</span>.<span class="hljs-title function_">createObjectURL</span>(file);
}
<span class="hljs-keyword">return</span> url;
}
</code></div></pre>
<p>参考:<br />
https://github.com/kingwsi/compress-pic/blob/master/index.html</p>
留言