以前要想在图片上传前,对图片剪裁下,纯用js的话,很难实现。现在有了html5了,腰也不疼了,腿也不抽筋了。
主要用到html5的2个特性:
1、FileReader
FileReader可以把本地文件进行读取并且转化为Base64编码的数据,很便于在html页面里显示。
2、canvas
对图片的放大缩小啊,左移右移啊,实现起来很简单。尤其是它还可以对图片的像素进行操作(红、绿、蓝、透明),最后利用toDataURL方法用图片进行剪裁。美中不足的话,目前还不支持gif格式,有点小遗憾。
下面是我写的一个简易小例子的片段(完整代码在附件里)
选择图片用的是
<input id="upload" type="file" />
选择文件生成Base64及图片加载后初始化canvas的代码:
var upload = $('#upload');
upload.change(function (e) {
e.preventDefault();
var file = upload[0].files[0],
reader = new FileReader();
reader.onload = function (event) {
img.src = event.target.result;
var result = img.src.toString().match(/^data:(image\/[a-z+]+);base64,/);
if (result) {
imgType = result[1];
}
};
reader.readAsDataURL(file);
return false;
});
img.onload = function () {
var min = Math.min(img.width, img.height);
scale = (bWH - 2 * borderWH) / min;
$('#range').attr('min', scale * 100);
// 判断下可放缩的范围
if (min >= (bWH - 2 * borderWH)) {
$('#range').attr('max', 100);
}
else {
$('#range').attr('max', scale * 100)
}
canvasScale(true, scale);
$('#range').val(scale * 100);
}
对图片放缩时,我没有使用canvas的scale方法,因为它会把canvas的大小也一起放缩了,和我想实现的需求不符。我利用的是canvas的drawImage的方法。放大就把dw、dh相应放大,缩小就相应缩小达到类似的效果。
function canvasScale(init, num) {
var w = img.width;
var h = img.height;
scale = num;
dw = w * scale;
dh = h * scale;
if (init) {
dx = 0;
dy = 0;
if (bWH > dw) {
dx = (bWH - dw) / 2;
}
if (bWH > dh) {
dy = (bWH - dh) / 2;
}
}
else {
if (dx > borderWH) {
dx = borderWH;
}
else if (dx < bWH - borderWH - dw) {
dx = bWH - borderWH - dw;
}
if (dy > borderWH) {
dy = borderWH;
}
else if (dy < bWH - borderWH - dh) {
dy = bWH - borderWH - dh;
}
}
// 大图
ctx.clearRect(0, 0, bWH, bWH);
ctx.drawImage(img, 0, 0, w, h, dx, dy, dw, dh);
// 大图四周的框
canvasPadding(ctx, borderWH, bWH);
// 小图
ctxSmall.clearRect(0, 0, sWH, sWH);
ctxSmall.drawImage(img, (15 - dx) / scale, (15 - dy) / scale,
(bWH - 2 * borderWH) / scale, (bWH - 2 * borderWH) / scale,
0, 0, sWH, sWH);
}
最后就剩下一个截取功能了
function canvasToDataURL() {
var canvasTmp = document.createElement('canvas');
canvasTmp.width = bWH - 2 * borderWH;
canvasTmp.height = bWH - 2 * borderWH;
var ctxTmp = canvasTmp.getContext('2d');
ctxTmp.drawImage(img, (15 - dx) / scale, (15 - dy) / scale,
(bWH - 2 * borderWH) / scale, (bWH - 2 * borderWH) / scale,
0, 0, canvasTmp.width, canvasTmp.height);
// 像素操作
var imgPixels = ctxTmp.getImageData(0, 0, canvasTmp.width, canvasTmp.height);
var lenW = imgPixels.width;
var lenH = imgPixels.height;
var red = $('#red').val();
var green = $('#green').val();
var blue = $('#blue').val();
var opacity = $('#opacity').val();
for (var y = 0; y < lenH; y++) {
for (var x = 0; x < lenW; x++) {
imgPixels.data[4 * (y * lenW + x) + 0] *= red;
imgPixels.data[4 * (y * lenW + x) + 1] *= green;
imgPixels.data[4 * (y * lenW + x) + 2] *= blue;
imgPixels.data[4 * (y * lenW + x) + 3] = opacity;
}
}
ctxTmp.putImageData(imgPixels, 0, 0, 0, 0, imgPixels.width, imgPixels.height);
// 生成对应类型的图片
return canvasTmp.toDataURL(imgType);
}
测试如下:
ff,chrome,mx3都支持FileReader和canvas。
mx3下FileReader还有点问题,估计日后会改好。
chrome本地安全问题,需要放到服务器上才能看效果。
ff目前对<input type="range" />还不支持。
分享到:
相关推荐
其中一个显著的改进就是对文件上传的支持,尤其是批量图片上传功能。在传统的HTML4中,文件上传通常只能单个进行,而HTML5引入了新的API和特性,使得批量上传成为可能。 批量图片上传的核心是`<input type="file">`...
html5 div图片放大插件手机端图片放大预览效果 html5 div图片放大插件手机端图片放大预览效果 html5 div图片放大插件手机端图片放大预览效果 html5 div图片放大插件手机端图片放大预览效果
【HTML5图片轮播插件】是一种常见的网页交互元素,用于在网页上展示一组图片,以动态、自动或用户触发的方式进行切换。这种技术利用了HTML5的新特性,结合JavaScript库如jQuery,来提供跨平台的兼容性和丰富的用户...
HTML5是一种先进的网页标记语言,它为网页开发者提供了丰富的功能和强大的工具,使得网页制作更加高效、...开发者可以通过学习和理解这个插件的实现,提升自己的前端开发技能,尤其是对HTML5和CSS3动画的理解与应用。
HTML5是现代网页开发的重要标准,它为网页应用带来了许多增强功能,其中之一就是对手机端图片上传的支持。在移动设备上,用户可能希望通过点击或拖拽来上传照片,或者从设备的媒体库中选择图片。以下是对这个主题的...
总之,"支持手机触屏左右拖拽滑动图片_html5左右滑动图片切换插件"是HTML5与JQUERY结合的一个实例,它通过监听触屏事件和智能处理图片切换,为移动用户提供了流畅的交互体验。开发者可以根据自己的需求调整和扩展此...
### HTML5去掉图片背景颜色 在HTML5中,去除图片背景颜色主要涉及到Canvas元素的应用以及JavaScript的编程技术。本文将详细介绍如何利用HTML5 Canvas技术来实现去除图片背景颜色的效果。 #### 一、HTML5 Canvas...
综上所述,HTML5通过其语义化元素、CSS3动画、JavaScript API和单页应用技术,为我们提供了实现图片滚动效果的强大支持。这种效果不仅可以提升用户体验,还可以使网站内容更加生动、吸引人。通过深入学习和实践这些...
例如,可以使用Modernizr这样的库来检测浏览器对HTML5特性的支持情况,从而提供适当的回退方案。 总的来说,“HTML5图文布局点击图片弹出放大查看特效”涉及到了HTML5的`<img>`标签、CSS3的`transform`和`...
HTML5是下一代超文本标记语言,它在2004...随着浏览器对HTML5支持的不断改进,开发者能够构建更加丰富、交互性更强的网络应用,而无需依赖第三方插件。随着移动互联网的发展,HTML5也成为了跨平台应用开发的重要选择。
在“html5实现页面的显示本地图片”这个主题中,我们主要关注的是HTML5的`<input type="file">`标签以及File API,它们允许用户选择本地图片并在网页上预览或处理。 **1. `<input type="file">`标签** `...
在“HTML5 实现本地图片裁剪”这个主题中,我们将深入探讨如何利用 HTML5 的 canvas 元素和 File API 来实现在本地浏览器环境中对图片进行裁剪操作。 首先,HTML5 的 `<canvas>` 元素是一个可编程的图形画布,允许...
HTML图片懒加载,亲测可用,插件也比较小,使用起来挺方便的.根据jquery 提供的 lazyload.js 插件实现图片懒加载,demo 在最下面。 lazyLoading.js 可以缓解庞大项目的网络压力lazyLoading.js图片懒加载
`<img>`元素在HTML5中也得到了改进,支持了新的属性,如`srcset`和`sizes`,这些属性可以根据用户的设备和屏幕尺寸,自动选择最适合的图片资源,从而实现响应式图片加载,提高网页性能。同时,`<img>`的`alt`属性...
5. **使用GitHub资源**:在GitHub上的`cychai/html2pdf`仓库,你可以找到更复杂的示例代码,这些示例通常包含了更多的配置选项和功能,比如自定义页面大小、水印、表格等,有助于你更好地理解和使用HTML2PDF。...
HTML5 base64 图片下载 参考文档 http://blog.csdn.net/fenglailea/article/details/56488096
HTML5是一种强大的网页开发语言,它为网页开发者提供了丰富的功能和接口,其中之一就是对多媒体的支持。在本场景中,我们关注的是如何利用HTML5和一个名为Swiper的第三方库来实现图片预览功能。Swiper是一款流行的...
【标题】"uploadify H5版(uploadifive)基于html5的手机上传图片插件"涉及的关键技术点包括HTML5、Uploadify、uploadifive和.NET后端处理。Uploadify是一个JavaScript上传组件,而其H5版本uploadifive则是针对现代...
HTML5图片上传功能是现代网页应用中的一个重要特性,它提供了对拖放操作的支持,使得用户可以方便地将本地图片直接拖放到网页上进行上传。批量图片上传插件则进一步优化了这一过程,允许用户一次性上传多张图片,...