前文中我们聊了 Data URI 和 base64编码,稍微回顾下。base64编码 是将数据用 64 个可打印的字符进行编码的方式,任何数据底层实现都是二进制,所以都可以进行 base64编码,base64编码 主要用在数据传输过程中(编码、解码)。而 Data URI 是将数据用 URI 的形式进行展现。常用的是将图片进行 base64 编码,用 Data URI 的形式进行展现,可以说,base64编码后的字符串是某些 Data URI(这里就包括图片的 base64 URL) 的一部分。(图片转 Base64码 之后是通过 Data URI scheme来实现显示的)

那么,如何获取一张图片 base64 编码后的数据呢?Data URI 应用场景小结 的最后我们给出了几个链接,如果不能上网,我们可以用如下几种方法试试。

我们以 这张图 为例,它的 base64编码为:

 data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub//ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7

chrome

打开 chrome 浏览器,将图片拖入浏览器中,打开调试面板(F12),在 Sources 栏下即可看到该图片的 base64编码 字符串。

PHP

很多语言都有内置的 base64 encode 以及 decode 函数。比如 PHP 里有 base64_encode() 函数:

<?php
  $file = "1.gif"; // 文件路径
  if($fp = fopen($file, "rb", 0)) {
    $binary = fread($fp, filesize($file)); // 文件读取
    fclose($fp);
    $base64 = base64_encode($binary); // 转码
    echo $base64; // 显示base64码
  }
?>

echo 出来的东西就是图片的 base64 编码。

File API

2016.07.31 补

详细可以参考 HTML5 File API — 让前端操作文件变的可能 一文

demo 地址 http://hanzichi.github.io/2016/image2base64/

Canvas

canvas 有内置的 toDataURL() 方法,可以将 canvas 图像转换为 Data URI 格式的字符串。其实这个过程有两步,首先把图像转成 PNG 数据,然后再把得到的二进制的 PNG 数据转成纯 ASCII 的 base64 编码的字符串。(将图像转化为Base64字符串的原理或者过程是什么

将需要编码的图片 "弄" 到 canvas 上可以用 drawImage() API。

var img = new Image();
img.onload = function() {
  var canvas = document.createElement('canvas');
  canvas.height = img.height;
  canvas.width = img.width;
  var ctx=canvas.getContext("2d");
  ctx.drawImage(img, 0, 0);
  console.log(canvas.toDataURL());  // 输出 Data URI
}
img.src = '1.gif';

但是该方法与前两种获取的 base64 编码不一样,我猜想应该是 canvas 图像转 png 图像时改变了 MiME TYPE 所致,那么显然 base64码 也不一样了。但是如果用 png 图的话也是一样结果,所以可以判断将一张 png图 用 drawImage API 附到 canvas 上,然后再用 toDataURL() 转为 png 的过程中,其实已经是两张不同的 png 图了。

所以 canvas 转换法其实并不可靠。


后续思考:本来我是想做个简单的 demo 实现,但是无法获取上传文件的绝对路径地址,如果用 file 控件的话会显示 fakepath,如 "C:\fakepath\1.png",原因也很好理解,如果上传文件能获取该文件在用户 PC 上的路径的话,那么岂不是泄露了用户隐私?用 PHP 的话可以考虑先将文件传到服务器,然后进行 base64 的编码,不过服务器得是自家的,用免费的服务器显然不行(405 Not Allowed)。后续可以考虑用 fileReader 试试。

获取图片base64编码的几种方法的更多相关文章

  1. 小程序获取图片base64编码

    项目中遇到了这个问题,在搜索过程中看到别人的博文,大多是下面这种方法,大致如下: let imgObj = { count: 1, success: (res) => { let tempFil ...

  2. Java通过图片url地址获取图片base64位字符串的两种方式

    工作中遇到通过图片的url获取图片base64位的需求.一开始是用网上的方法,通过工具类Toolkit,虽然实现的代码比较简短,不过偶尔会遇到图片转成base64位不正确的情况,至今不知道为啥. 之后 ...

  3. [转]玩转图片Base64编码

    转自:[前端攻略]:玩转图片Base64编码 图片处理在前端工作中可谓占据了很重要的一壁江山.而图片的 base64 编码可能相对一些人而言比较陌生,本文不是从纯技术的角度去讨论图片的 base64 ...

  4. MYSQL获取自增ID的四种方法

    MYSQL获取自增ID的四种方法 1. select max(id) from tablename 2.SELECT LAST_INSERT_ID() 函数 LAST_INSERT_ID 是与tabl ...

  5. Android获取APK包名的几种方法

    Android获取APK包名的几种方法:1.adb shell pm list package -f | findstr 关键字 #只能获取到包名,主Activity名无法获取到 2.使用aapt-- ...

  6. php获取网页header信息的4种方法

    php获取网页header信息的方法多种多样,就php语言来说,我知道的方法有4种, 下面逐一献上. 方法一:使用get_headers()函数 推荐指数: ★★★★★ get_header方法最简单 ...

  7. PHP获取文件后缀名的三种方法

    如下: <? PHP获取文件后缀名的几种方法1: function get_file_type($filename){ $type = substr($filename, strrpos($fi ...

  8. Knockout获取数组元素索引的2种方法,在MVC中实现

    原文:Knockout获取数组元素索引的2种方法,在MVC中实现 在遍历数组.集合的时候,通常要获取元素的索引,本篇体验使用Knockout获取索引的2种方法. 假设有这样的一个模型: namespa ...

  9. 原生JS—实现图片循环切换的两种方法

    今天我们主要讲讲如何使用原生JS实现图片的循环切换的方法.多余的话我们就不多说了,我们一个一个开始讲吧. 1  原生JS实现图片循环切换 -- 方法一 在上栗子之前我们先简单介绍一下所用的一些知识点. ...

随机推荐

  1. 如何删除或重置spfile中的参数

    在ORACLE中,修改spfile中的参数一般非常容易,那么如何删除spfile中的参数呢? 下面我们用一个案例来介绍一下,如何删除spfile中的参数,一种方法就是创建对应的pfile,删除对应的参 ...

  2. mongo数据备份及恢复脚本

    #!/bin/bashtime="$(date +"%Y.%m.%d")" id=`echo "show dbs;"|/usr/local/ ...

  3. x01.os.1: BIOS 中断

    这只是一点准备工作.为了显示字符串,需要调用中断:int  0x10 (AH=0x13).具体参数设置,参考我的归纳整理如下: INT 10 (AH = 0) -----------------功能: ...

  4. flock — 轻便的咨询文件锁定

    bool flock  ( resource $handle  , int $operation  [, int &$wouldblock  ] ) handle  文件系统指针,是典型地由 ...

  5. 多CPU下基于e1000e驱动的数据包以及网卡中断流程分析.doc

    http://wenku.baidu.com/link?url=mMKDH_fKmUXN7L6rANIFHjoHdKCYBLlDrqoYB1daDTEkNFk9Bt9xlJtS_4BKBj6w22WD ...

  6. hadoop2.6---windows下开发环境搭建

    一.准备插件 1.自己编译 1.1 安装Ant 官网下载Ant,apache-ant-1.9.6-bin.zip 配置环境变量,新建ANT_HOME,值是E:\apache-ant-1.9.6:PAT ...

  7. 如何把报表放到网页中显示(Web页面与报表简单集成例子)

    1.问题描述 现在用户开发的系统基本上趋向于BS架构的浏览器/服务器模式,这些系统可能由不同的语言开发,如HTML.ASP.JSP.PHP等,因此需要将制作好的报表嵌入到这些页面中. FineRepo ...

  8. unix automake 使用,快速生成你的Makefile

    使用automake快速生成编译的Makefile 1,确保自己装有的软件automake autoconf 2, 1)执行autoscan 并将生成的configure.scan重命名为config ...

  9. NOIP2000乘积最大[序列DP]

    题目描述 今年是国际数学联盟确定的“2000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得 ...

  10. flex sdk中mx_internal function getTextField() 这种函数如何调用?

    在用flex 开发中,一些函数前打上了 mx_internal 外部调用不了,其实这样写就可以了 xxx.mx_internal::getTextField() 而 xxx.getTextField( ...