我正在处理一个组件,其中包含文件上传 HTML 控件。通过使用文件上传元素选择图像后,该图像将呈现在 HTML5 画布元素上。
这里是一个带有示例代码的 JSFiddle:https://jsfiddle.net/govi20/spmc7ymp/
id=target => jcrop 元素的选择器
id=photograph => 文件上传元素的选择器
id=preview => 画布元素的选择器
id=clear_selection => 清除画布内容的按钮的选择器
使用的第三方 JS 库:
<script src="./js/jquery.min.js"></script>
<script src="./js/jquery.Jcrop.js"></script>
<script src="./js/jquery.color.js"></script>
设置JCrop:
<script type="text/javascript">
jQuery(function($){
var api;
$('#target').Jcrop({
// start off with jcrop-light class
bgOpacity: 0.5,
keySupport: false,
bgColor: 'black',
minSize:[240,320],
maxSize:[480,640],
onChange : updatePreview,
onSelect : updatePreview,
height:160,
width:120,
addClass: 'jcrop-normal'
},function(){
api = this;
api.setSelect([0,0,240,320]);
api.setOptions({ bgFade: true });
api.ui.selection.addClass('jcrop-selection');
});
});
清除画布事件,在点击清除按钮时将被触发:
jQuery('#clear_selection').click(function(){
$('#target').Jcrop({
setSelect: [0,0,0,0],
});
});
呈现图像在HTML5画布上的代码:
function readURL(input) {
if (input.files && input.files[0]) {
var reader = new FileReader();
reader.onload = function (e) {
$('#target').attr('src', e.target.result);
setProperties();
}
reader.readAsDataURL(input.files[0]);
}
}
function setProperties(){
$('#target').Jcrop({
setSelect: [0,0,240,320]
});
}
$("#photograph").change(function(){
readURL(this);
});
裁剪并在画布上渲染图像的代码:
var canvas = document.getElementById('preview'),
context = canvas.getContext('2d');
make_base();
function updatePreview(c) {
console.log("called");
if(parseInt(c.w) > 0) {
// Show image preview
var imageObj = $("#target")[0];
var canvas = $("#preview")[0];
var context = canvas.getContext("2d");
context.drawImage(imageObj, c.x, c.y, c.w, c.h, 0, 0, canvas.width, canvas.height);
}
};
function make_base() {
console.log("make_base called");
var base_image = new Image();
base_image.src = '';
base_image.onload = function () {
context.drawImage(base_image, 0, 0);
}
}
这里有一些我遇到的问题:
updatePreview
函数没有在选择时被调用,因此画布没有被渲染。- 裁剪选择框无法拖动(我正在使用Bootstrap CSS,我怀疑是由于缺少/不匹配的依赖关系造成的)。
- 画布是
HTML5
元素,这意味着最终用户必须具有HTML5
兼容的浏览器,我正在开发一个拥有数百万用户的应用程序。强迫用户使用最新的浏览器并不可行。这里应该有什么应急机制?