android Java BASE64编码和解码二:图片的编码和解码
1、准备工作
(1)在项目中集成 Base64 代码,集成方法见第一篇博文:android Java BASE64编码和解码一:基础
(2)添加 ImgHelper 工具类
package com.app21; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Bitmap.CompressFormat; import android.util.Base64; import sun.misc.BASE64Decoder.encoder.BASE64Decoder; import sun.misc.BASE64Decoder.encoder.BASE64Encoder; public class ImgHelper { /** * TODO:将byte数组以Base64方式编码为字符串 * @param bytes 待编码的byte数组 * @return 编码后的字符串 * */ public static String encode(byte[] bytes){ return new BASE64Encoder().encode(bytes); } /** * TODO:将以Base64方式编码的字符串解码为byte数组 * @param encodeStr 待解码的字符串 * @return 解码后的byte数组 * @throws IOException * */ public static byte[] decode(String encodeStr) throws IOException{ byte[] bt = null; BASE64Decoder decoder = new BASE64Decoder(); bt = decoder.decodeBuffer(encodeStr); return bt; } /** * TODO:将两个byte数组连接起来后,返回连接后的Byte数组 * @param front 拼接后在前面的数组 * @param after 拼接后在后面的数组 * @return 拼接后的数组 * */ public static byte[] connectBytes(byte[] front, byte[] after){ byte[] result = new byte[front.length + after.length]; System.arraycopy(front, 0, result, 0, after.length); System.arraycopy(after, 0, result, front.length, after.length); return result; } /** * TODO:将图片以Base64方式编码为字符串 * @param imgUrl 图片的绝对路径(例如:D:\\jsontest\\abc.jpg) * @return 编码后的字符串 * @throws IOException * */ public static String encodeImage(String imgUrl) throws IOException{ FileInputStream fis = new FileInputStream(imgUrl); byte[] rs = new byte[fis.available()]; fis.read(rs); fis.close(); return encode(rs); } /** * 将Bitmap转换成字符串 * @param bitmap * @return */ public static String bitmaptoString(Bitmap bitmap) { String string = null; ByteArrayOutputStream bStream = new ByteArrayOutputStream(); bitmap.compress(CompressFormat.PNG, 100, bStream); byte[] bytes = bStream.toByteArray(); string = Base64.encodeToString(bytes, Base64.DEFAULT); return string; } /** * 把byte数组转化成 bitmap对象 * @param b * @return */ public static Bitmap bytes2Bimap(byte[] b) { if (b.length != 0) { return BitmapFactory.decodeByteArray(b, 0, b.length); } else { return null; } } }
2、把drawable里面的 图片进行编码和解码
主要布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.app21.MainActivity" tools:ignore="MergeRootFrame" > <Button android:id="@+id/bt" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="点击到Sd卡文件界面内" /> <ImageView android:id="@+id/image1" android:layout_width="100dp" android:layout_height="100dp" /> </LinearLayout>
主要代码:
package com.app21; import java.io.IOException; import java.io.InputStream; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; /** * @author admin * 对drawable里面的图片进行存取 */ public class MainActivity extends Activity { ImageView imageView1 ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main ); imageView1 = (ImageView) findViewById( R.id.image1 ) ; //得到bitmap流字符串 String bitmapString = ImgHelper.bitmaptoString( getBitmap() ) ; try { Bitmap bitmap = ImgHelper.bytes2Bimap( ImgHelper.decode( bitmapString )) ; imageView1.setImageBitmap( bitmap ) ; } catch (IOException e) { e.printStackTrace(); } Button button = (Button) findViewById( R.id.bt ) ; button.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { startActivity( new Intent( MainActivity.this , MainActivityFile.class )); } }); } //得到bitmap public Bitmap getBitmap(){ InputStream inputStream = getResources().openRawResource(R.drawable.ic_launcher ); BitmapDrawable drawable = new BitmapDrawable(inputStream); Bitmap bitmap = drawable.getBitmap(); return bitmap ; } }
3、对Sd卡中的图片进行编码和解码
主要布局
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" 6 tools:ignore="MergeRootFrame" > 7 8 <ImageView 9 android:id="@+id/image_file" 10 android:layout_width="wrap_content" 11 android:layout_height="wrap_content" /> 12 13 </LinearLayout>
主要代码
package com.app21; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.widget.ImageView; public class MainActivityFile extends Activity { ImageView imageView1 ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_file ); imageView1 = (ImageView) findViewById( R.id.image_file ) ; String str ; //将图片转化为字符串 try { str = ImgHelper.encodeImage( getFileName() ); Bitmap bitmap = ImgHelper.bytes2Bimap( ImgHelper.decode( str )) ; imageView1.setImageBitmap( bitmap ) ; } catch (IOException e) { e.printStackTrace(); } } /** * 把图片存到本地 * @return sd卡图片的路径 */ String getFileName(){ Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.libingbing ); File SpicyDirectory = new File("/sdcard/Images/"); SpicyDirectory.mkdirs(); String filename="/sdcard/Images/" + "test11111" + ".jpg"; FileOutputStream out = null ; try { out = new FileOutputStream(filename); bmp.compress(Bitmap.CompressFormat.JPEG , 100 , out); }catch (Exception e) { e.printStackTrace(); }finally{ try { out.flush(); }catch (IOException e){ e.printStackTrace();} }try { out.close(); } catch (IOException e){ e.printStackTrace(); } out=null; return filename ; } }
4、注意事项 :
在对SD卡中的图片编码和解码是需要添加权限
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 从SDCard读取数据权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
5、运行结果 :
6、项目下载地址:
http://download.csdn.net/detail/yanzi2015/8712419
7、其他图片Base64编码的相关博客
http://www.cnblogs.com/coco1s/p/4375774.html
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。