读ImageCropper源码

原库首页http://andyshora.com/angular-image-cropper.html

根据项目的需求,要在Web上面裁剪图片,找到了这个可以用的AngularJs的库,涉及到了一些没有用到的知识。在这里做一下总结。

1. JSHint

原码里面有一些JSHint的warning, 要注意修一下。

2. 缩放

缩放时如果zoom变成1,会占满整个canvas,这对我项目中的使用是无益的,要把它删除掉。

3. 移动

原码中如果移动图片偏离了可视窗口就会被禁止掉,实际中,移动图片的时候人手难免会抖动,例如左移之前可能都会稍微向右移一下,这样操作起来会很不方便,合适的逻辑应该是在移动时如果超出边界,便设置成边界。

下面是相关的知识点。

对于Directive

1. restrict

The restrict option is typically set to:

  • ‘A‘ - only matches attribute name
  • ‘E‘ - only matches element name
  • ‘C‘ - only matches class name

2. 读取文件并显示在canvas内

这是比较关键的一部,比较关键的点有:

element.on(‘change‘, function(e){
      files = e.target.files;
      if(!files) {
           return;
       }
       fileReader.readAsDataURL(files[0]);
});

这步是当有文件选择的时候,通过监听change事件来获得file input里面的文件,需要注意的是,文件在e.target.files里面。

关于FileReader, https://developer.mozilla.org/en-US/docs/Web/API/FileReader, 看起来兼容性还不错,主要用到的api都是readAsDataURL,然后再在onload里面进行监听。

readAsDataURL:

Starts reading the contents of the specified Blob, once finished, the result attribute contains a data: URL representing the file‘s data.

这个API会将文件读取成一个base64 encoded的字符串,会有一个例如data:image/png;base64, 的前缀

          fileReader.onload = function(e) {
            $img.src = this.result;
            scope.step = 2;
            scope.$apply();

            var byteString = atob(this.result.split(‘,‘)[1]);
            var binary = new BinaryFile(byteString, 0, byteString.length);
            exif = EXIF.readFromBinaryFile(binary);

          };

0) $img是一个Image对象,参照https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement.Image, 这是一个HTML5标准的对象,可以设定它的src然后监听onload事件。

1) 文件在this.result里面, 而且是base64编码后的。

2) 需要使用$apply来更新image的src.

3) atob, https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64.atob, 根据这篇文章,这个函数是非H5标准的,用来将base64 encoded string decode, 还有相反的一个函数btoa是将一个字符串base64 encode. 使用时要将url的前缀去掉。

4) BinaryFile, 这是在库中自定义的一个类,用于从二进制文件中读取byte, short, 或者long等值

5)exif, readFromBinaryFile, 这个函数只会处理jpeg,获取文件中exif的信息。

当文件加载时

    $img.onload = function() {
            ctx.drawImage($img, 0, 0);

            imgWidth = $img.width;
            imgHeight = $img.height;

            if (exif && exif.Orientation) {        /*此处略去500字*/
            }

            /*此处再略去500字*/
            scope.$apply();

          };

1) 使用canvas将文件画出来,这个canvas是用户用来操作图片的地方。比目标图片高100, 宽100,如下图所示:

上面的部分就是所说的canvas, 下面的输入框是根据需求自己添加的,

2) 第一处省略的500字是对图片进行一些修正,主要是根据手机(?)上的一些横置竖置的一些问题。

3) 第二次省略500字是初始化一些参数 ,例如最大的缩放,拖拽等。

文件终于显示在canvas里面了,然后就有一些操作相关的功能。

3. 操作

未完待续。

时间: 2024-10-09 08:16:54

读ImageCropper源码的相关文章

读Zepto源码之样式操作

这篇依然是跟 dom 相关的方法,侧重点是操作样式的方法. 读Zepto源码系列文章已经放到了github上,欢迎star: reading-zepto 源码版本 本文阅读的源码为 zepto1.2.0 内部方法 classRE classCache = {} function classRE(name) { return name in classCache ? classCache[name] : (classCache[name] = new RegExp('(^|\\s)' + name

读 zepto 源码之工具函数

Zepto 提供了丰富的工具函数,下面来一一解读. 源码版本 本文阅读的源码为 zepto1.2.0 $.extend $.extend 方法可以用来扩展目标对象的属性.目标对象的同名属性会被源对象的属性覆盖. $.extend 其实调用的是内部方法 extend, 所以我们先看看内部方法 extend 的具体实现. function extend(target, source, deep) { for (key in source) // 遍历源对象的属性值 if (deep && (i

读Zepto源码之操作DOM

这篇依然是跟 dom 相关的方法,侧重点是操作 dom 的方法. 读Zepto源码系列文章已经放到了github上,欢迎star: reading-zepto 源码版本 本文阅读的源码为 zepto1.2.0 .remove() remove: function() { return this.each(function() { if (this.parentNode != null) this.parentNode.removeChild(this) }) }, 删除当前集合中的元素. 如果父

读 Zepto 源码之内部方法

数组方法 定义 var emptyArray = [] concat = emptyArray.concat filter = emptyArray.filter slice = emptyArray.slice zepto 一开始就定义了一个空数组 emptyArray,定义这个空数组是为了取得数组的 concat.filter.slice 方法 compact function compact(array) { return filter.call(array, function(item)

读jQuery源码之四(Callbacks,Deferred,when)

看了下Sizzle部分源码,核心的原理就是使用正则表达式去匹配,找到对应的原生获取元素的方法,我没有去细究了.大家有兴趣可以自己看看,分享分享! 从2850行开始,继续往下读jQuery源码(2850-3043行) 进入Callbacks(回调函数管理模块)之前,有几个扩展方法 1.dir方法 三个参数:elem——dom元素,dir——指定elem的层级名称(例如parentNode,nextSibling),until——结束判断.返回一个数组,比如获取某个元素的parentNode,如果不

session自定义存储,如何更好地进行session共享;读tomcat7源码,org.apache.catalina.session.FileStore可知

session自定义存储,如何更好地进行session共享: 读tomcat源码,org.apache.catalina.session.FileStore可知 一.详见: 方法1 public void save(Session session) try { ((StandardSession)session).writeObjectData(oos); } finally { oos.close(); } 方法2 public Session load(String id) ois = ne

读jQuery源码 - Deferred

Deferred首次出现在jQuery 1.5中,在jQuery 1.8之后被改写,它的出现抹平了javascript中的大量回调产生的金字塔,提供了异步编程的能力,它主要服役于jQuery.ajax. Deferred就是让一组函数在合适的时机执行,在成功时候执行成功的函数系列,在失败的时候执行失败的函数系列,这就是Deferred的本质.简单的说,模型上可以规划为两个数组来承接不同状态的函数——数组resolve里的函数列表在成功状态下触发,reject中的函数在失败状态下触发. 本文原创于

(转)读过滤器源码

今天按着Artech的文章又研究了研究过滤器的源码,主要究其实现,还有一点不清晰的地方,可惜周末得回趟家,老妈身体小样.周末只能小看一下书了.继续研究,过两天搞两个例子多试下,研究完了源码及其实现,清晰多了.要不用的总感觉不太清楚.还有几篇文章也看了,现在就不贴出了,等些例子的时候会一起给出. 在ActionInvoker对Action的执行过程中,除了通过利用ActionDescriptor对Action方法的执行,以及之前进行的Model绑定与验证之外,还具有一个重要的工作,那就是对相关筛选

读 Zepto 源码之内部方法[转载]

数组方法 定义 var emptyArray = [] concat = emptyArray.concat filter = emptyArray.filter slice = emptyArray.slice zepto 一开始就定义了一个空数组 emptyArray,定义这个空数组是为了取得数组的 concat.filter.slice 方法 compact function compact(array) { return filter.call(array, function(item)