通经常使用Base64这样的编解码方式将二进制数据转换成可见的字符串格式,就是我们常说的大串。10块钱一串的那种,^_^。

Android的android.util包下直接提供了一个功能十分完备的Base64类供我们使用,以下就演示一下怎样将一张图片进行Base64的编解码。

1.找到那张图片

public void onEncodeClicked(View view) {

        //select picture
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, OPEN_PHOTO_FOLDER_REQUEST_CODE);
} @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(OPEN_PHOTO_FOLDER_REQUEST_CODE == requestCode && RESULT_OK == resultCode) { //encode the image
Uri uri = data.getData();
try {
//get the image path
String[] projection = {MediaStore.Images.Media.DATA};
CursorLoader cursorLoader = new CursorLoader(this,uri,projection,null,null,null);
Cursor cursor = cursorLoader.loadInBackground();
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst(); String path = cursor.getString(column_index);
Log.d(TAG,"real path: "+path);
encode(path);
} catch (Exception ex) {
Log.e(TAG, "failed." + ex.getMessage());
}
}
}

2.将图片转换成bitmap并编码

private void encode(String path) {
//decode to bitmap
Bitmap bitmap = BitmapFactory.decodeFile(path);
Log.d(TAG, "bitmap width: " + bitmap.getWidth() + " height: " + bitmap.getHeight());
//convert to byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] bytes = baos.toByteArray(); //base64 encode
byte[] encode = Base64.encode(bytes,Base64.DEFAULT);
String encodeString = new String(encode);
mTvShow.setText(encodeString);
}

3.将大串还原成图片

    public void onDecodeClicked(View view) {
byte[] decode = Base64.decode(mTvShow.getText().toString(),Base64.DEFAULT);
Bitmap bitmap = BitmapFactory.decodeByteArray(decode, 0, decode.length);
//save to image on sdcard
saveBitmap(bitmap);
} private void saveBitmap(Bitmap bitmap) {
try {
String path = Environment.getExternalStorageDirectory().getPath()
+"/decodeImage.jpg";
Log.d("linc","path is "+path);
OutputStream stream = new FileOutputStream(path);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, stream);
stream.close();
Log.e("linc","jpg okay!");
} catch (IOException e) {
e.printStackTrace();
Log.e("linc","failed: "+e.getMessage());
}
}

须要注意的是,一张图片的编码速度会非常慢,假设图片非常大就更慢了。毕竟手机的处理能力有限。只是decode的速度确实相当的快,超出你的想象。好了,就是这样简单,今天就到这里了,晚安!

Android实战技巧之三十七:图片的Base64编解码的更多相关文章

  1. Android中使用commons-codec-1.6.jar 进行Base64编解码出现的问题

    编码时出现异常: java.lang.NoSuchMethodError: No static method encodeBase64String([B)Ljava/lang/String; in c ...

  2. Android实战技巧之三十八:Handler使用中可能引发的内存泄漏

    问题描写叙述 曾几何时,我们用原来的办法使用Handler时会有以下一段温馨的提示: This Handler class should be static or leaks might occur ...

  3. java 图片数据Base64编解码

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...

  4. Android实战技巧:深入解析AsyncTask

    AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧:多线程AsyncTask这里就不重复. AsyncTask引发的一个问题 上 ...

  5. python base64 编解码,转换成Opencv,PIL.Image图片格式

    二进制打开图片文件,base64编解码,转成Opencv格式: # coding: utf-8 import base64 import numpy as np import cv2 img_file ...

  6. C++,Base64编解码字符串或文件

    参考链接:在C语言中使用libb64进行Base64编解码 GitHub地址:https://github.com/BuYishi/cpp_base64_demo base64_demo.cpp #i ...

  7. C#字符串Base64编解码

    C#字符串Base64编解码 首先讲一下什么是Base64编码所谓Base64就是一种基于64个可打印字符来表示二进制数据的方法.Base64编码是从二进制到字符的过程,常用于在网络上传输不可见字符( ...

  8. Delphi Base64 编解码函数

    Delphi 自带 Base64 编解码的单元, EncdDecd这个单元提供两套四个公开函数: 对流的编解码:procedure EncodeStream(Input, Output: TStrea ...

  9. ios Base64编解码工具类及使用

    为了避免明码传递http内容,可以用base64编码后传输,收到方再解码,也方便了2进制数据的字符串式传输. 对于ios来说,google给提供了一个很好的工具类,方便进行base64编解码,当然也可 ...

随机推荐

  1. WinServer-AD操作常用powershell命令

    powershell 操作AD常用命令 查询AD中默认的密码策略 Get-ADDefaultDomainPasswordPolicy 查询AD中密码永不过期的用户 Get-ADUser -Filter ...

  2. 终结者:负载均衡之Nginx(一)

            相信非常多人都听过Nginx.这个小巧的东西能够和Apache及IIS相媲美.那么它有什么作用呢?一句话.它是一个减轻Web应用server(如Tomcat)压力和实现Web应用ser ...

  3. 省赛i题/求1~n内全部数对(x,y),满足最大公约数是质数的对数

    求1~n内全部数对(x,y),gcd(x,y)=质数,的对数. 思路:用f[n]求出,含n的对数.最后用sum[n]求和. 对于gcd(x,y)=a(设x<=y,a是质数),则必有gcd(x/a ...

  4. 百度地图-----&gt;地图类型、定位模式、实时交通、我的位置、加入覆盖物、覆盖物详情及提示

    在百度地图开发平台 http://developer.baidu.com/map/index.php? title=androidsdk 进行创建应用,获取应用的AK,在进行下载BaiduLBS_An ...

  5. codeblocks开源的c、c++编译器,小巧方便

    1.下载带gun的版本 2.设置编译的位置 3.创建项目 4.执行项目 有意思的开源的c编译器 ~~~

  6. nyoj--301--递推求值(经典矩阵运算)

    递推求值 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n ...

  7. zookeeper的节点类型

    Znode有两种类型: 短暂(ephemeral):客户端和服务器端断开连接后,创建的节点自己删除 持久(persistent):客户端和服务器端断开连接后,创建的节点不删除 2)Znode有四种形式 ...

  8. POJ 1979 Red and Black (简单dfs)

    题目: 简单dfs,没什么好说的 代码: #include <iostream> using namespace std; typedef long long ll; #define IN ...

  9. Java文件(io)编程——File类的基本用法

    1.首先了解文件流的相关概念: 2.文件File类的基本用法 public class Demo_1 { public static void main(String[] args) { //创建一个 ...

  10. js函数参数理解

    eg: function setName(obj){ obj.name = "Nicholas"; obj = new Object(); obj.name = "Gre ...