前文中我们聊了 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. java web 开发 购物车功能的实现

    为了方便自己以后复习,所以写的比较仔细,记录下自己的成长..... 既然是做购物车,那么前提条件是首先需要一系列商品,也就是要建一个实体,这里建了一个商品表. 通过查询在浏览器上显示 基本显示已经做好 ...

  2. 基础篇之 Create Type

    Create Type 的话呢,是创建一个自定义的数据类型,等于说为常用的数据类型建造一个别名的样纸.然后就可以通用当前数据库的当前架构.(当然了,一般来说我们都是使用dbo架构,所以都会无事前面那个 ...

  3. 透过byte数组简单分析Java序列化、Kryo、ProtoBuf序列化

    序列化在高性能网络编程.分布式系统开发中是举足轻重的之前有用过Java序列化.ProtocolBuffer等,在这篇文章这里中简单分析序列化后的byte数组观察各种序列化的差异与性能,这里主要分析Ja ...

  4. 烂泥:CentOS6.5光盘以及ISO镜像文件的使用

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 学习CentOS有一段时间了,在平时使用过程中.系统镜像以及光盘使用的比较多,这篇文章就从实用的角度介绍相关有关光盘与镜像文件的使用. 因为物理机相关的 ...

  5. google-analytics.com

    最近有朋友问,为什么我的网站打开时在执行google analytics有较长的停顿时间.要如果解决?这个问题其实很早就有,最好的解决办法是将网站所有页面的传统追踪代码统一替换为最新的异步追踪代码.不 ...

  6. x01.Game.Main: 从零开始

    一切从零开始,一切皆有可能. 浅墨,90后,<逐梦之旅>深入浅出,堪比大师. 1.安装 DXSDK_June10.exe 或更新版本. 2.运行 vs2012,新建 VC Win32 空项 ...

  7. 005.TCP--拼接TCP头部IP头部,实现TCP三次握手的第一步(Linux,原始套接字)

    一.目的: 自己拼接IP头,TCP头,计算效验和,将生成的报文用原始套接字发送出去. 若使用tcpdump能监听有对方服务器的包回应,则证明TCP报文是正确的! 二.数据结构: TCP首部结构图: s ...

  8. 怎么找到占用usb的模块,linux下Jlink连接失败

    问题是这样产生的,我在linux下安装jlink,启动JLinkExe执行,总是提示不能通过usb连接: SEGGER J-Link Commander V5.10q (Compiled Mar :: ...

  9. [转]ASP.NET中使用UpdatePanel实现局部异步刷新方法和攻略

    本文转自:http://blog.csdn.net/chenhongwu666/article/details/41392529/ asp.net UpdatePanel实现异步局部刷新 如有雷同,不 ...

  10. [转]backbone.js template()函数

    本文转自:http://book.2cto.com/201406/43974.html 本文所属图书 > Backbone.js实战 资深Web开发专家根据Backbone js最新版本撰写,对 ...