Android 中对图像进行 Base64 编码

首先我们来看看 维基百科 是怎么定义的这个概念的。

Base64 is a generic term for a number of similar encoding schemes that encode binary data by treating it numerically and translating it into a base 64 representation. The Base64 term originates from a specificMIME content transfer encoding.

Base64 encoding schemes are commonly used when there is a need to encode binary data that needs be stored and transferred over media that are designed to deal with textual data. This is to ensure that the data remains intact without modification during transport. Base64 is used commonly in a number of applications including email via MIME, and storing complex data in XML.

当然我们对于概念可以不做过多的理会,只要知道这是一种编码方式, 设计用来进行数据传输,而且要不易为人读懂,也就是为了加密用的 设计的目的是用文本字符串来传输二进制数据 (经 麦壳童鞋 和 KongQue 童鞋二人提醒后,更正)。至于他的算法实现,我们可以 Google 出来很多中成熟的算法。

我选用了 这个网站 上提供的源码,测试之后暂时还没有发现问题,并且该源码的作者将版权完全放弃了,无需任何的 License 授权,也不怕 License 感染,拿过来用就是了,作者只是希望使用的人如果发现问题可以反馈给他,如果能参与进来一起解决那是更好。

Android SDK2.2 之后提供了 Base64 编码相关的 API 类 Base64, 不过鉴于开发的程序需要向下兼容,我想大部分的程序还是需要自己实现或者寻求第三方的实现来解决该问题。下面我们来一步步看看如何将图片编码成一个 Base64 编码的字符串进行传输。

任何图像到了程序中都需要解码成为 Bitmap 来进行绘制 (不论是显示的解码还是系统在 API 中帮的忙),解码之后的 Bitmap 就是一张位图也就是一个 byte 数组,在 Android 中 Bitmap 有 compress(Bitmap.CompressFormat format, int quality, OutputStream stream) 这个方法,该方法可以将 Bitmap 重新压缩存储为别的格式,可以是 PNG/JPG 文件,或者是 ByteArrayOutputStream 输出。

public static String getBitmapStrBase64(Bitmap bitmap){
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    bitmap.compress(CompressFormat.PNG, 100, baos);
    byte[] bytes  = baos.toByteArray();
    return Base64.encodeBytes(bytes);
}

这就是获取位图 Base64 编码的代码,同理也可以将 Base64 编码字符串转化为 Bitmap 对象

public Bitmap getBitmap(){
        try {
            byte[] bitmapArray;
            bitmapArray = Base64.decode(iconBase64);
            return BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

以上就是所有的代码实现了,比较简单,效率还不错。