【发布时间】:2015-03-11 03:08:21
【问题描述】:
我是 javascript 的初学者。 我正在尝试在客户端调整图像大小,然后再将它们上传到我的服务器进行存储 我找到了一种使用 HTML5 Canvas 的方法:http://hacks.mozilla.org/2011/01/how-to-develop-a-html5-image-uploader/
我的问题:一直上传空白图片。我认为空白图像的原因是当我从画布上抓取图像时画布没有完成绘制。 当我在从画布上抓取图像之前设置 3 秒 windows.timeout 时,一切正常。 有比超时更可靠的方法吗?或者有没有其他方法可以进行客户端图像大小调整?
我进行客户端图像大小调整的原因是因为我正在与上传不必要的大文件的人打交道,我认为进行客户端图像大小调整是最有效的。
感谢您的任何提示/答案!
//resize image
Resizeimage.resize(file);
//***if i wrap this part with timeout it works
var canvas = document.getElementById('canvas');
var data = canvas.toDataURL(file.type);
// convert base64/URLEncoded data component to raw binary data held in a string
var bytestring;
if (data.split(',')[0].indexOf('base64') >= 0)
bytestring = atob(data.split(',')[1]);
else
bytestring = escape(data.split(',')[1]);
//get imagetype
var mimeString = data.split(',')[0].split(':')[1].split(';')[0];
// write the bytes of the string to a typed array
var ia = new Uint8Array(bytestring.length);
for (var i = 0; i < bytestring.length; i++) {
ia[i] = bytestring.charCodeAt(i);
}
// create a blob from array
var blob = new Blob([ia], {
type: mimeString
});
//upload files
$scope.upload = $upload.upload({
url: 'articles/imageUpload',
method: 'POST',
file: blob
//update progress bar
}).progress(function(event) {
$scope.uploadInProgress = true;
$scope.uploadProgress = Math.floor(event.loaded / event.total * 100);
//file upload success
}).success(function(data, status, headers, config) {
$scope.uploadInProgress = false;
$scope.uploadedImage = JSON.parse(data);
$scope.isDisabled = false;
//file upload fail
}).error(function(err) {
$scope.uploadInProgress = false;
console.log('Error uploading file: ' + err.message || err);
});
//***
angular.module('articles').factory('Resizeimage', [
function() {
var imgSelectorStr = null;
// Resizeimage service logic
function render(src) {
var image = new Image();
image.onload = function() {
var canvas = document.getElementById('canvas');
//check the greater out of width and height
if (image.height > image.width) {
image.width *= 945 / image.height;
image.height = 945;
} else {
image.height *= 945 / image.width;
image.width = 945;
}
//draw (&resize) image to canvas
var ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height);
canvas.width = image.width;
canvas.height = image.height;
ctx.drawImage(image, 0, 0, image.width, image.height);
};
image.src = src;
}
function loadImage(src) {
// Create fileReader and run the result through the render
var reader = new FileReader();
reader.onload = function(e) {
render(e.target.result);
};
reader.readAsDataURL(src);
}
// Public API
return {
resize: function(src) {
loadImage(src);
return true;
}
};
}
]);
【问题讨论】:
-
很好的解释,但如果你也能发布一些代码,那就太好了
-
@Breakpoint 谢谢,我已经插入了我的代码。顺便说一句,我正在尝试使用 MeanJS。所以我的代码是客户端的angularJS
标签: javascript html image canvas resize