制作一个类似 Instagram的图片滤镜web App(上)

标签: html5 javascript | 发表时间:2013-03-23 15:06 | 作者:明河
出处:http://www.36ria.com

原文看: http://tutorialzine.com/2013/02/instagram-filter-app/,明河扩写了下。

这篇教程会非常有意思, Instagram或美图秀秀或camera360的照片滤镜功能想必大家都完成,这篇教程将教大家使用html5的知识,实现类似功能。

源码可以到 明河的github上查看

通过这篇教程你将学到什么?

请不要用过时的浏览器运行这个demo,亲们懂的…

创建一个源图片容器

      

#photo层用于创建一个拖拽区域和canvas容器。

从demo来看,在容器中有”拖拽一个图片到这里”的文案,但html代码中并不存在,这里我们来学习个css知识 :after伪类。

#photo:after{
    content: '拖拽一个图片到这里';
    top: 150px;
    z-index: 1;
    color: #ccc;
    display: block;
    font-size: 20px;
    position: absolute;
    width: 100%;
    letter-spacing: 1px;
}

:after伪类会在容器元素内容的最后面插入指定的内容, content属性必须存在!

插入的为inline行内元素,所以这里使用了 display: block;

给容器增加拖拽读取图片逻辑

这里需要用到名为 FileReader.js的jquery插件,FileReader.js可以实现创建一个拖拽层,并暴露出了方便读取文件数据API。

引入jquery和FileReader插件:



使用方法:

    var photo = $('#photo');
    //调用FileReader插件
    photo.fileReaderJS({
        //监听拖拽的各个事件
        on:{

            beforestart: function(e, file) {
                // 如果你想要跳过这个文件直接 return false
            },
            loadstart: function(e, file) {

            },
            progress: function(e, file) {

            },
            load: function(e, file) {

            },
            error: function(e, file) {
            },
            loadend: function(e, file) {
            },
            abort: function(e, file) {
            },
            skip: function(e, file) {
                // 当一个文件被跳过处理时触发
            }
        }
    })

FileReader的 on参数非常重要,内置所有拖拽和读取文件事件,比如常用的 load事件(读取完文件后触发)。

FileReader支持的事件非常丰富,基本上可以控制整个拖拽读取文件的过程。

接下来我们利用FileReader来实现拖拽读取图片信息的功能。

    var photo = $('#photo');
    //调用FileReader插件
    photo.fileReaderJS({
        //监听拖拽的各个事件
        on:{

            beforestart: function(e, file) {
                //只接受图片
				return /^image/.test(file.type);
            },
            load: function(e, file) {

            }
        }
    })

图片滤镜只能对图片起作用,所以我们需要将图片外的文件过滤掉。

    beforestart: function(e, file) {
        //只接受图片,通过过滤file数据中的type属性
        return /^image/.test(file.type);
    }

将读取图片并插入到#photo层内

    load: function(e, file) {
        //向拖拽容器添加一个图片元素
        var img = $('  ').appendTo(photo);
        //图片读取成功后触发,这样才能找到图片原始宽度和高度
        img.load(function(){
            //...
        });
        // 设置图片的src,直接读取二进制图片数据
        // 触发img的load事件
        img.attr('src', e.target.result);
    }

load事件有二个参数:

  • e:事件对象,带有文件的二进制数据(base64),通过 e.target.result获得;
  • file:文件数据对象

在高级浏览器(IE6之类的滚粗就不说了)下图片的src是可以直接设置为base64编码的二进制数据,格式类似如下:

  

这是html5实现本地图片预览的核心。

(PS:css中的background-image也是支持base64编码的二进制数据。)

详细内容,明河推荐看 《base64:URL背景图片与web页面性能优化》。

img读取图片完毕会触发load事件,这是才能取到图片的原始尺寸!而且load函数请写在 src设置之前!。

接下来处理下图片尺寸过大的情况:

    //图片宽度和高度
    var imgWidth,imgHeight;
    //图片允许的最大宽度和高度
    var	maxWidth = 500, maxHeight = 500;
    var newHeight,newWidth;
    var ratio;
    //图片读取成功后触发,这样才能找到图片原始宽度和高度
    img.load(function(){
        imgWidth  = this.width;
        imgHeight = this.height;
        // 控制在500*500px内
        if (imgWidth >= maxWidth || imgHeight >= maxHeight) {
            if (imgWidth > imgHeight) {
                //ratio是希望处理图片时,依旧可以保证比例的正确
                ratio = imgWidth / maxWidth;
                newWidth = maxWidth;
                newHeight = imgHeight / ratio;

            } else {
                ratio = imgHeight / maxHeight;
                newHeight = maxHeight;
                newWidth = imgWidth / ratio;
            }

        } else {
            newHeight = imgHeight;
            newWidth = imgWidth;
        }
    });

下一篇教程将完成最有意思的部分:实现图片滤镜功能。

这里先放放,来听听明河唠叨下 FileReaderJs的的原理。

FileReaderJS的原理

FileReaderJS其实是对html5对象 FileReader的封装。FileReader用于读取文件数据,在html5的异步文件上传中有广泛的应用,所以这个API非常重要,也是为什么明河要唠叨的原因,推荐大家掌握。

典型使用:

function readFile(){
        //FileList中的一个文件
        var file = this.files[0];
        var reader = new FileReader();
        reader.readAsDataURL(file);
        reader.onload = function(e){
                result.innerHTML = '  '
        }
}

readAsDataURL:核心方法,用于读取文件数据。
onload:事件,在读取文件成功后触发,通过读取result属性,可以获取到文件数据(base64编码)。

详细内容推荐大家阅读 《FileReader详解与实例—读取并显示图像文件》

file api

相关 [制作 instagram 图片] 推荐:

制作一个类似 Instagram的图片滤镜web App(上)

- - ria之家--RIA三部曲:jquery、ext、flex
原文看: http://tutorialzine.com/2013/02/instagram-filter-app/,明河扩写了下. 这篇教程会非常有意思, Instagram或美图秀秀或camera360的照片滤镜功能想必大家都完成,这篇教程将教大家使用html5的知识,实现类似功能. 源码可以到 明河的github上查看.

国内类Instagram图片分享服务汇总

- bluesnail - 互联网的那点事...
最近一阵介绍了很多Instagram相关的服务,Instagram在不长的时间内,仅依靠其iPhone客户端就吸引了数百万的用户,而之前开放API又吸引了很多的开发者为其开发包括Mac在内的客户端,以及基于其图片的很多第三方应用,通过手机拍照分享这个较为强烈的需求,通过一款合适的产品,使得分享图片逐渐成为了一种生活方式.

Instagram的变异

- 小白 - 互联网的那点事...
周末打算写手机拍照社交,为查资料,仔细看了看Instagram(最近两个月我的活跃度明显降低),大吃一惊,和年初我还活跃那阵子相比变化极大,之前的论点几乎全被推翻. 我之前的论点是这样的:手机拍照社交产品存在两个天然瓶颈. 第一个瓶颈是“信息”,即通过手机拍照传递出去的信息. 在传统渠道里,常见情形是摸出手机给朋友看,边看边讲,这是我家猫猫狗狗的相片,这是我去xxx玩的时候拍的相片——信息通过面对面的交流来传递.

Instagram的迷思

- Shell Wang - 坏脾气的小肥
这辈子遇到的,令我特别着迷的产品只有两款,2008年5月遇到开心,2010年11月遇到Instagram. 我在Instagram上面已经有200多个follower,哇哈哈哈哈,可惜每天两点一线,又没什么生活情趣,总是发以前去动物园拍的相片. 我猜是“与真实好友分享生活中的这一刻”. 作为背景介绍,Instagram是iPhone上(目前只支持iPhone)新出的APP,据说10天增长了20万个用户.

Instagram启示录

- Wenhuan - 所有文章 - UCD大社区
不管认为Instagram是lomo-twitter还是poladroid+iphoneography. 照片分享服务Instagram于 6个月之前上线,上个月24日公开发布了支持实时功能的API,第三方开发人员可以根据标签、地点和地区抓取照片. 数据显示,Instagram目前每周新增13万用户.

Trover 超越 Instagram ?

- PH囧ENIX - 爱范儿 · Beats of Bits
5月4日,Trover 上线,第二周成为 App Store 的 “本周推荐”,现在已经有来自140个国家的用户上传了照片. Trover 是一家小公司,由3名程序员和一名设计. Trover 的起步和 Instagram 很像,尽管它还有一些不完善的地方,但由于其拥有一些 Instagram 不具备的元素,我认为它将超越 Instagram.

【移动互联网】Instagram允许用户自动将“Like”的图片发送到FB账户

- - 爱Apps - 专注限时免费、应用评测、移动资讯
Facebook收购Instagram大概也有3个月的时间了,两者之间也做了不少的功能整合. 今天要介绍的是区别之前所有的功能改进,这次是直接允许用户(可关闭该功能)将Instagram里喜欢的照片分享到自己的Facebook账户上. 但是从现在起,在你Facebook的新鲜事里你就会看到那些你原先并不关心的朋友他们在Instagram里拍的或者喜欢的照片都涌到你的页面上来.

用 Instagram 拍摄 Instagram 办公室

- 笑炊 - 爱范儿 · Beats of Bits
Kevin 分享过 Instagram  的创业故事:四个人,八周时间,推倒重建的项目,吸引了超过 500 万用户,成为 iPhone 平台上最受欢迎的图片分享社区之一. 这家位于旧金山的公司有何过人之处. 记者 Nicholas Jackson 拿着 iPhone 走进了  South Park St.

instagram 和不联网

- sylvia - 爱范儿 · Beats of Bits
by 李楠 (newkhonsou@twitter). instagram 是近期窜红的 iPhone App 和图片分享社区. 仅一周时间就积累了 10 万注册用户. 但 InstaCamera 可不是新玩意,那东西以前叫“拍立得”. 谁拿个 Polaroid 在手,立马文艺的牛比闪闪. 数码时代, Polaroid 没落了.