Android实战技巧之三十七:图片的Base64编解码
2015-06-22 22:37
465 查看
通常用Base64这种编解码方式将二进制数据转换成可见的字符串格式,就是我们常说的大串,10块钱一串的那种,^_^。
Android的android.util包下直接提供了一个功能十分完备的Base64类供我们使用,下面就演示一下如何将一张图片进行Base64的编解码。
1.找到那张图片
2.将图片转换成bitmap并编码
3.将大串还原成图片
需要注意的是,一张图片的编码速度会很慢,如果图片很大就更慢了。毕竟手机的处理能力有限。不过decode的速度确实相当的快,超出你的想象。好了,就是这样简单,今天就到这里了,晚安!
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笔记(三十九):Session入门_Session原理
- android ListView 在初始化时多次调用getView()原因分析
- Android自定义控件View的探讨
- Android ContentProvider总结
- Android MMS数据库
- Android MMS之草稿管理
- android 内存优化
- Android显示GIF图片
- android 中 unable to start service 错误解决方法
- Android中Activity四种启动模式和taskAffinity属性详解
- Android 属性动画(Property Animation) 完全解析 (下)
- Android 属性动画(Property Animation) 完全解析 (上)
- Android - LayoutInflater
- 6.22 android计算字符高度宽度,红蓝3D图片的制作原理及NDK生成实现
- Android内核剖析:Binder
- Android基础知识_Activity之间传递参数
- Android中scrollview和viewpage滑动冲突解决
- Google《Android性能优化》学习笔记
- 自己动手写一个测试Android事件传递机制的demo
- Android进程间通信(IPC)机制Binder简介和学习计划