html5对图片的支持

以前要想在图片上传前,对图片剪裁下,纯用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" />还不支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
### 回答1: HTML5提供了多种实现预览图片和视频的方式。 预览图片可以使用HTML5的`<img>`标签,通过设置`src`属性指定图片的路径来展示图片。可以通过添加`width`和`height`属性来控制图片的显示大小。另外,可以使用CSS属性来设置图片的样式,比如调整边框、圆角等。如果需要预览多张图片,可以使用JavaScript来动态地修改`src`属性。 预览视频可以使用HTML5的`<video>`标签,通过设置`src`属性指定视频文件的路径来播放视频。可以使用`controls`属性来显示视频的播放控制栏,包括播放/暂停、音量和进度条等。同时,可以设置`width`和`height`属性来控制视频的显示大小。另外,还可以使用JavaScript来控制视频的播放、暂停、音量、全屏等功能,通过对`<video>`标签的属性和方法进行操作。 为了兼容不同浏览器和不同文件格式,可以在`<video>`标签内添加多个`<source>`标签,每个`<source>`标签指定一个不同格式的视频文件。浏览器会选择支持的第一个视频格式进行播放。此外,可以使用`poster`属性设置视频封面,在视频加载前显示一张图片。 总结起来,HTML5可以通过`<img>`标签和`<video>`标签来实现图片和视频的预览功能,通过设置相关属性和样式,以及使用JavaScript来控制播放和操作。这些功能的实现可以根据需求来灵活选择,并且需要考虑浏览器的兼容性和文件格式的支持。 ### 回答2: 在HTML5中,我们可以使用HTML标签和JavaScript来实现预览图片和视频的功能。 对于图片预览,可以使用HTML的<input type="file">标签来创建一个文件上传表单,用户可以选择本地的图片文件进行上传。然后,借助JavaScript的FileReader对象,可以读取这个文件,并以DataURL的形式将其显示在页面中。通过设置<img>标签的src属性为DataURL,可实现预览图片的效果。 对于视频预览,HTML5提供了<video>标签。通过设置<video>标签的src属性为视频文件的URL,即可将视频加载到页面中进行预览。此外,<video>标签还提供了一些属性和方法用于控制视频的播放、暂停和调整播放进度等功能,可以根据需求进行配置。 在实际使用中,可以使用JavaScript添加事件监听器,以便根据用户的操作来控制图片和视频的预览效果,比如播放、暂停、拖动进度条等。另外,可以根据需要设置一些样式或使用其他的第三方库来美化预览效果,增强用户体验。 总而言之,通过使用HTML5中提供的相关标签和JavaScript的操作,我们可以方便地实现图片和视频的预览功能,为用户提供更好的浏览体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值