在 JavaScript 中调整大小并压缩上传的图片
Resize & compress uploaded image in JavaScript
我正在建立一个网站,其中包含大量用户上传的图片。
在将这些图像上传到服务器之前,我想在客户端调整大小和压缩(最好将其格式更改为 .jpg)。
人们会怎么做呢?
我找到了一些解决方案,但 none 确实适用于上传的文件。
我最近尝试过的是 Hermite-resize 脚本。应该很简单:
// Get images from input field
var uploadedImages = event.currentTarget.files;
var HERMITE = new Hermite_class();
HERMITE.resize_image(uploadedImages[1], 300, 100);
但显然 uploadedImages
return 为 null
。虽然我也在其他地方使用它们,但我 100% 肯定它们不是 null
有谁知道如何有效地使用这个脚本来处理上传的文件?
或者,对于客户端 resize/compress 图片,是否有更好的解决方案?
提前致谢!
我曾尝试在 hermite 上工作,但效果不佳 class 因为它不断给我错误,因此您可以在 fiddle 上使用下面的代码,也可以在 hermit class 上使用想要 img 元素 id
HTML
<input type="file" id="fileOpload"><br>
<img src="" alt="Image preview..." id="image">
<canvas id="canvas" height=500 width=500></canvas>
Javascript
function previewFile() {
var preview = document.querySelector('img');
var file = document.querySelector('input[type=file]').files[0];
var reader = new FileReader();
var percentage = 0.75;
reader.addEventListener("load", function () {
preview.src = reader.result;
preview.onload = function () {
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
canvas.height = canvas.width * (preview.height / preview.width);
var oc = document.createElement('canvas'),octx = oc.getContext('2d');
oc.width = preview.width * percentage;
oc.height = preview.height * percentage;
canvas.width = oc.width;
canvas.height = oc.height;
octx.drawImage(preview, 0, 0, oc.width, oc.height);
octx.drawImage(oc, 0, 0, oc.width, oc.height);
ctx.drawImage(oc, 0, 0, oc.width, oc.height,0, 0, canvas.width, canvas.height);
}
}, false);
if (file) {
reader.readAsDataURL(file);
}
}
document.getElementById('fileOpload').addEventListener('change', previewFile);
我找到了(某种程度上)解决我的问题的方法。它不会对每个人都有好处,但这个人写了一个小脚本,非常适合我想要完成的事情:
开箱即用!我唯一添加的是在将返回的 blob 推送到数组之前给返回的 blob 一个时间戳和它的原始名称:
var images = event.currentTarget.files
resizeImage({
file: images[i],
maxSize: 500
}).then(function(resizedImage) {
resizedImage.lastModifiedDate = new Date()
resizedImage.name = images[i].name
uploadedImages.push(resizedImage)
}).catch(function(error) {
console.log(error)
})
我正在建立一个网站,其中包含大量用户上传的图片。 在将这些图像上传到服务器之前,我想在客户端调整大小和压缩(最好将其格式更改为 .jpg)。
人们会怎么做呢? 我找到了一些解决方案,但 none 确实适用于上传的文件。 我最近尝试过的是 Hermite-resize 脚本。应该很简单:
// Get images from input field
var uploadedImages = event.currentTarget.files;
var HERMITE = new Hermite_class();
HERMITE.resize_image(uploadedImages[1], 300, 100);
但显然 uploadedImages
return 为 null
。虽然我也在其他地方使用它们,但我 100% 肯定它们不是 null
有谁知道如何有效地使用这个脚本来处理上传的文件?
或者,对于客户端 resize/compress 图片,是否有更好的解决方案?
提前致谢!
我曾尝试在 hermite 上工作,但效果不佳 class 因为它不断给我错误,因此您可以在 fiddle 上使用下面的代码,也可以在 hermit class 上使用想要 img 元素 id
HTML
<input type="file" id="fileOpload"><br>
<img src="" alt="Image preview..." id="image">
<canvas id="canvas" height=500 width=500></canvas>
Javascript
function previewFile() {
var preview = document.querySelector('img');
var file = document.querySelector('input[type=file]').files[0];
var reader = new FileReader();
var percentage = 0.75;
reader.addEventListener("load", function () {
preview.src = reader.result;
preview.onload = function () {
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
canvas.height = canvas.width * (preview.height / preview.width);
var oc = document.createElement('canvas'),octx = oc.getContext('2d');
oc.width = preview.width * percentage;
oc.height = preview.height * percentage;
canvas.width = oc.width;
canvas.height = oc.height;
octx.drawImage(preview, 0, 0, oc.width, oc.height);
octx.drawImage(oc, 0, 0, oc.width, oc.height);
ctx.drawImage(oc, 0, 0, oc.width, oc.height,0, 0, canvas.width, canvas.height);
}
}, false);
if (file) {
reader.readAsDataURL(file);
}
}
document.getElementById('fileOpload').addEventListener('change', previewFile);
我找到了(某种程度上)解决我的问题的方法。它不会对每个人都有好处,但这个人写了一个小脚本,非常适合我想要完成的事情:
开箱即用!我唯一添加的是在将返回的 blob 推送到数组之前给返回的 blob 一个时间戳和它的原始名称:
var images = event.currentTarget.files
resizeImage({
file: images[i],
maxSize: 500
}).then(function(resizedImage) {
resizedImage.lastModifiedDate = new Date()
resizedImage.name = images[i].name
uploadedImages.push(resizedImage)
}).catch(function(error) {
console.log(error)
})