// Creates a thumbnail fitted insize the boundBox (w x h)
generateThumbnail(file, boundBox){
if (!boundBox || boundBox.length != 2){
throw "You need to give the boundBox"
}
var scaleRatio = Math.min(...boundBox) / Math.max(file.width, file.height)
var reader = new FileReader();
var canvas = document.createElement("canvas")
var ctx = canvas.getContext('2d');
return new Promise((resolve, reject) => {
reader.onload = function(event){
var img = new Image();
img.onload = function(){
var scaleRatio = Math.min(...boundBox) / Math.max(img.width, img.height)
let w = img.width*scaleRatio
let h = img.height*scaleRatio
canvas.width = w;
canvas.height = h;
ctx.drawImage(img, 0, 0, w, h);
return resolve(canvas.toDataURL(file.type))
}
img.src = event.target.result;
}
reader.readAsDataURL(file);
})
}
靶病变;DR:See the JSFiddle 由于我想通过API上传图像并显示图像的预览(这两件事实际上彼此很好地结合在一起),我想到了这个:
(function(angular) {
angular
.module('app')
.directive('inputFilePreview', [function() {
var canvas, mapToModel, elementScope;
/**
* To be fired when the image has been loaded
*/
var imageOnLoad = function(){
canvas.width = this.width;
canvas.height = this.height;
canvas.getContext("2d").drawImage(this,0,0);
};
/**
* To be fired when the FileReader has loaded
* @param loadEvent {{}}
*/
var readerOnLoad = function(loadEvent){
var img = new Image();
img.onload = imageOnLoad;
img.src = loadEvent.target.result;
if(mapToModel) {
setModelValue(elementScope, mapToModel, img.src);
}
};
/**
* This allows us to set the value of a model in the scope of the element (or global scope if the
* model is an object)
* @param scope {{}}
* @param modelReference {string}
* @param value {*}
*/
var setModelValue = function(scope, modelReference, value) {
// If the model reference refers to the propery of an object (eg. "object.property")
if(~modelReference.indexOf('.')) {
var parts = modelReference.split('.', 2);
// Only set the value if that object already exists
if(scope.hasOwnProperty(parts[0])) {
scope[parts[0]][parts[1]] = value;
return;
}
}
scope[modelReference] = value;
};
/**
* The logic for our directive
* @param scope {{}}
* @param element {{}}
* @param attributes {{}}
*/
var link = function(scope, element, attributes) {
elementScope = scope;
canvas = document.getElementById(attributes.inputFilePreview);
if(attributes.hasOwnProperty('mapToModel')) {
mapToModel = attributes.mapToModel;
}
element.on('change', function(changeEvent) {
var reader = new FileReader();
reader.onload = readerOnLoad;
reader.readAsDataURL(changeEvent.target.files[0]);
});
};
return {
restrict: 'A',
link: link
};
}]);
})(angular);
6条答案
按热度按时间3npbholx1#
我找到了This simpler yet powerful tutorial,它只是创建了一个
img
元素,并使用fileReader对象将其source属性赋值为表单输入的值jk9hmnmh2#
经过更好的网上搜索,我找到了我问题的答案。
可以将canvas与File API结合使用。
尝试上传下面演示中的任何图片,您会看到一个新生成的缩略图将出现在表单的右侧。
演示:http://jsfiddle.net/a_incarnati/fua75hpv/
DerekR对这个问题给出了一个很好的答案:
How to upload image into HTML5 canvas
fcipmucu3#
在阿莱桑德罗所写的基础上建立了更务实的东西。
该函数从File API获取一个文件,并尝试将其放入boundBox中,同时保持长宽比不变,但不会绘制任何内容,而是返回一个
Promise
,其中显示了生成的dataUrl。它可以像下面这样使用
jaxagkaj4#
我认为可能值得添加一个更现代的答案并引用MDN Web Docs。
您可以在input元素上添加一个“change”事件监听器,然后通过
this.files
访问文件列表来显示所选图像的缩略图(如MDN示例所示)。3pmvbmvn5#
靶病变;DR:See the JSFiddle
由于我想通过API上传图像并显示图像的预览(这两件事实际上彼此很好地结合在一起),我想到了这个:
预览工作所需的两个元素是:
代码段如下:
一个一个二个一个一个一个三个一个一个一个一个一个四个一个
chhkpiq46#
您可以使用URL.createObjectUrl()来实现它。
注意
URL.createObjectUrl()会导致内存泄漏,所以你必须在使用url之后通过URL.revokeObjectURL()释放它。