zoukankan      html  css  js  c++  java
  • 读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. 操作

    未完待续。

  • 相关阅读:
    oracle数据库迁移---windows环境下
    Tomcat内存溢出(java.lang.OutOfMemoryError: PermGen space)
    64位win系统上面tomcat6启动不了 window不能再本地计算机启动
    linux学习之一些琐碎知识点
    mysql备份与还原
    linux学习中遇到的各种故障与解决方法
    Jmeter调试工具---Debug Sampler
    python+requests接口自动化测试框架实例详解教程
    互联网架构的演变
    面试时如何考察应聘者的素质?
  • 原文地址:https://www.cnblogs.com/rixin/p/4177849.html
Copyright © 2011-2022 走看看