js获取图片的EXIF,解决图片旋转难点

你会学习克罗地亚语吗?

深信不疑我们在做项目标时候会遇见在canvas里投入图片时,图片产生90°,180°的旋转。当时的你肯定时懵逼的,为毛。

不得置疑的是,无论是在咱们的就学、工作依然在世中,朝鲜语都扮演着13分首要的角色,它不不过一门语言,更是一门技术。

骨子里那就是图表的EXIF搞的鬼。

后天,给大家推荐一些上学德语的网站。

什么是EXIF

简单易行来说,Exif
消息便是由单反相机在水墨画经过中募集一多种的新闻,然后把音讯放置在我们熟稔的
JPEG/TIFF 文件的头顶,也便是说 Exif消息是镶嵌在 JPEG/TIFF
图像文件格式内的一组录像参数,它就接近是白痴相机的日期打字与印刷成效雷同,只不过Exif消息所记录的资源音讯更为详细和完备。Exif
所记录的元数据消息分外丰富,主要包涵了以下几类音讯:

  • 拍录日期
  • 摄器材(机身、镜头、闪光灯等
  • 录制参数(快门速度、光圈F值、ISO速度、焦距、测光形式等
  • 图像处理参数(锐化、相比较度、饱和度、白平衡等)
  • 图像描述及版权音信
  • GPS定位数据
  • 缩略图

那里面就富含了图片的角度音讯,正是说你用手提式有线电话机摄像时是否倒着拍依旧侧着拍,这个都以有记录的。
接下去正是教我们怎么获取图片内的exif音信
先给我们看看exif音信都存在何地:(角度就在0x0112)
图片 1

// 这里的获取exif要将图片转ArrayBuffer对象,这里假设获取了图片的baes64
// 步骤一
// base64转ArrayBuffer对象
  function base64ToArrayBuffer(base64) {
    base64 = base64.replace(/^data\:([^\;]+)\;base64,/gmi, '');
    var binary = atob(base64);
    var len = binary.length;
    var buffer = new ArrayBuffer(len);
    var view = new Uint8Array(buffer);
    for (var i = 0; i < len; i++) {
      view[i] = binary.charCodeAt(i);
    }
    return buffer;
  }
// 步骤二,Unicode码转字符串
// ArrayBuffer对象 Unicode码转字符串
  function getStringFromCharCode(dataView, start, length) {
    var str = '';
    var i;
    for (i = start, length += start; i < length; i++) {
      str += fromCharCode(dataView.getUint8(i));
    }
    return str;
  }

// 步骤三,获取jpg图片的exif的角度(在ios体现最明显)
  function getOrientation(arrayBuffer) {
    var dataView = new DataView(arrayBuffer);
    var length = dataView.byteLength;
    var orientation;
    var exifIDCode;
    var tiffOffset;
    var firstIFDOffset;
    var littleEndian;
    var endianness;
    var app1Start;
    var ifdStart;
    var offset;
    var i;
    // Only handle JPEG image (start by 0xFFD8)
    if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) {
      offset = 2;
      while (offset < length) {
        if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) {
          app1Start = offset;
          break;
        }
        offset++;
      }
    }
    if (app1Start) {
      exifIDCode = app1Start + 4;
      tiffOffset = app1Start + 10;
      if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') {
        endianness = dataView.getUint16(tiffOffset);
        littleEndian = endianness === 0x4949;

        if (littleEndian || endianness === 0x4D4D /* bigEndian */) {
          if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) {
            firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian);

            if (firstIFDOffset >= 0x00000008) {
              ifdStart = tiffOffset + firstIFDOffset;
            }
          }
        }
      }
    }
    if (ifdStart) {
      length = dataView.getUint16(ifdStart, littleEndian);

      for (i = 0; i < length; i++) {
        offset = ifdStart + i * 12 + 2;
        if (dataView.getUint16(offset, littleEndian) === 0x0112 /* Orientation */) {

          // 8 is the offset of the current tag's value
          offset += 8;

          // Get the original orientation value
          orientation = dataView.getUint16(offset, littleEndian);

          // Override the orientation with its default value for Safari (#120)
          if (IS_SAFARI_OR_UIWEBVIEW) {
            dataView.setUint16(offset, 1, littleEndian);
          }
          break;
        }
      }
    }
    return orientation;
  }

措施getStringFromCharCode(arrayBuffer)再次回到的orientation就是图片的趋向约等于旋转的值,再对应上边包车型大巴表,对图片举办拍卖

orientation值 旋转角度
1
3 180°
6 顺时针90°
8 逆时针90°

我们能够先判断图片Exif的orientation值再依据上表对应的转动值,在canvas上对图纸展开反方向旋转消除影响

事后作者会对canvas上什么旋转进行详细讲解。
Canvas-图片旋转

1、BBC学英语

United Kingdom广播公司(BBC),创设于一九二五年,是英帝国最大的音讯广播机构,也是世界最大的音信广播机构之一。在一定长的一段时间内,BBC一贯占据着United Kingdom的电视、电视台。在壹玖伍肆年独立广播台和1975年单身电视台创造以前,BBC平素是大不列颠及苏格兰联合王国唯一的TV、广播台广播公司。

BBC学罗马尼亚(罗曼ia)语的这几个网站整合了BBC广泛的能源,能够为科学普及韩教育学习爱好者们提供许多立见成效的帮扶。BBC的专业性毋庸置疑,涵盖面也要命广,里面包车型大巴立陶宛(Lithuania)语能源是诸多土耳其共和国(The Republic of Turkey)语考试的来源,适合超过一半人读书。

2、多邻国

在线教育以往已经是二个老大紧俏的互连网创业趋势,它最大的优势在于,首先它结合了丰硕的就学能源,同时它还提供了就学的途径和格局,让您可见在纷纷的条件中寻找到本身所须求的文化。

用作言语学习类的在线教育集团,多邻国已经小有成就:方今在美利坚协作国,通过多邻国学习语言的人口已经超先生越了颇具在线下学习语言人数的总数。

自然,多邻国也有协调的APP版本,而作为一款语言学习类应用,多邻国最大的本性已经不在众包领域,而是寓教于乐的求学格局,让学习变得像玩游戏一样有趣。多邻国在和谐的课程中引入了游戏里“掉血”、“生命”等概念。当用户在攻读也许演习的时候,答错一题就会“掉血”,答错三题就会“掉命”。只可以从头开端。多邻国还足够利用了数据解析的技艺来不断革新课程。

3、沪江网

沪江是1个正规的网络学习平台,尤其是语言类的读书。

它致力于为用户提供方便、优质的整整互连网学习产品和劳动,营造了抢先的上学资源信息、学习社区、学习工具及学习平台四大事情系统,涵盖升学、语言、留学、职场、兴趣等充分的情节。

新近,沪江着力支援网络教育创业团队,积极塑造在线教育生态圈,达成产业双赢。同时,与价值观高校合营探索,减少学教育育差距,推进教育公平,把优质的教育能源通过互连网传递到世界的种种角落。

4、TED

TED(指 technology, entertainment,
design在英文中的缩写,即技术、娱乐、设计
) 是美利坚合众国的一家个体非营利机构,该单位以它组织的TED大会著称,这些会议的主旨是”用思想的能力来改变世界”。TED诞生于一九八三年,其发起人是里查德·沃曼。二〇〇二年起,ChrisAnderson接管TED,创制了种子基金会(The
Sapling Foundation),并运转TED大会。

历年三月,TED大会在美国集合众多不错、设计、管理学、音乐等领域的特出人物,分享他们关于技术、社会、人的思辨和商量。

TED中阐述者们的阐述稿水平都比较高,是演练克罗地亚(Croatia)语听力和作品的极品范本。

5、Babbel

Babbel,那是一家来自德意志联邦共和国的在线语言学习网站。Babbel的开发商是来自德意志联邦共和国的Lesson
Nine。而传说那笔钱将用于Babbel在全世界市场上的恢弘。早在二〇〇九年,Babbel收购了一家名为FriendsAbroad的言语在线学习社区。而其近期一度能够提供十多样种语言的劳务。

从语言分布上来看,贝布bel已经覆盖了一定多的言语连串,而对Babbel来说,大概国际化的扩大主要依旧从成品角度、用户角度等地点考虑,而并非不难地进来到某一种语言或是某1个当地市集。

此处有为数不少不一样的模块,包含初级课程、中级课程、口语、听力、语法等等。它们有例外的时光铺排,灵活性较高,你也得以遵照本身的须要,在悠然时间安插学习。

(若是认为本文不错,请点赞评论啊。)

正文作者:一言,撰稿人,设计师,媒体人。

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注