Android实战技巧之三十七:图片的Base64编解码
通经常使用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编解码的更多相关文章
- Android中使用commons-codec-1.6.jar 进行Base64编解码出现的问题
编码时出现异常: java.lang.NoSuchMethodError: No static method encodeBase64String([B)Ljava/lang/String; in c ...
- Android实战技巧之三十八:Handler使用中可能引发的内存泄漏
问题描写叙述 曾几何时,我们用原来的办法使用Handler时会有以下一段温馨的提示: This Handler class should be static or leaks might occur ...
- java 图片数据Base64编解码
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...
- Android实战技巧:深入解析AsyncTask
AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧:多线程AsyncTask这里就不重复. AsyncTask引发的一个问题 上 ...
- python base64 编解码,转换成Opencv,PIL.Image图片格式
二进制打开图片文件,base64编解码,转成Opencv格式: # coding: utf-8 import base64 import numpy as np import cv2 img_file ...
- C++,Base64编解码字符串或文件
参考链接:在C语言中使用libb64进行Base64编解码 GitHub地址:https://github.com/BuYishi/cpp_base64_demo base64_demo.cpp #i ...
- C#字符串Base64编解码
C#字符串Base64编解码 首先讲一下什么是Base64编码所谓Base64就是一种基于64个可打印字符来表示二进制数据的方法.Base64编码是从二进制到字符的过程,常用于在网络上传输不可见字符( ...
- Delphi Base64 编解码函数
Delphi 自带 Base64 编解码的单元, EncdDecd这个单元提供两套四个公开函数: 对流的编解码:procedure EncodeStream(Input, Output: TStrea ...
- ios Base64编解码工具类及使用
为了避免明码传递http内容,可以用base64编码后传输,收到方再解码,也方便了2进制数据的字符串式传输. 对于ios来说,google给提供了一个很好的工具类,方便进行base64编解码,当然也可 ...
随机推荐
- 使用InstelliJ IDEA创建Spring MVC应用程序
环境版本 Windows 8.1 IDE:InstelliJ IDEA 13 Spring:Spring 4.1.1 & Spring MVC 4.1.1 WebLogic 10. ...
- java类的方法
我前面说的都是类的属性,现在说类的方法: 类{ 属性:“类有什么” 方法:“类能做什么” } 首先我们在之前创建的学生类中添加个打印1-10数字的方法,参数是name package cuteSnow ...
- POI 详细介绍
Apache POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.目前POI已经有了Ruby版本. 结构: HSSF - 提供读写Microsoft Excel XLS格式 ...
- Maven学习总结(24)——Maven版本管理详解
Maven的版本分为快照和稳定版本,快照版本使用在开发的过程中,方便于团队内部交流学习.而所说的稳定版本,理想状态下是项目到了某个比较稳定的状态,这个稳定包含了源代码和构建都要稳定. 一.如何衡量项目 ...
- shell 键盘录入和运算
一.read 命令,从键盘读入数据,赋给变量 1.脚本代码 #!/bin/sh read arg1 arg2 echo "第一个参数: $arg1" echo "第二个参 ...
- Raspberry PI 系列 —— 裸机点亮LED灯
Raspberry PI 系列 -- 裸机点亮LED灯 背景 近期刚买了Raspberry PI B+,配置执行了官方提供的Raspbian系统,折腾了一周Linux系统,感觉没啥意思,于是就试着想了 ...
- xftp和xshell的使用
Xftp和Xshell配合使用部署环境. (linux系统) Xftp为可视化工具.主要用来复制文件. xshell则通过输入命令来对server进行操作,如启动服务等等. 一. Xftp的连接 新 ...
- Android px,dp,pt,sp的差别
px(像素点) mm 等Android不建议用 为什么电脑web开发能够用而Android不建议用? 由于px代表像素点个数,一般电脑分辨率都同样 不管14寸还是15寸都是1366*768而手机分辨率 ...
- (OpenGL ES 2.0 Shading Language) attribute 、uniform 和 varying
一:attribute .uniform 和 varying 都是glsl的变量的内存指示器(storage qualifiers),指明变量的内存特性 二:attribute attribute 是 ...
- elasticsearch如何安全重启
elasticsearch如何安全重启节点 问题: elasticsearch集群,有时候可能需要修改配置,增加硬盘,扩展内存等操作,需要对节点进行维护升级.但是业务不能停,如果直接kill掉节 点, ...