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

  

时间: 2024-08-03 19:27:24

android Java BASE64编码和解码二:图片的编码和解码的相关文章

android Java BASE64编码和解码一:基础

 今天在做Android项目的时候遇到一个问题,需求是向服务器上传一张图片,要求把图片转化成图片流放在 json字符串里传输.  类似这样的: {"name":"jike","age":"20","pic":"图片流"} ,  把图片转化为图片流要用到 Base64 的技术.   1.Base64  的作用     主要不是加密,它主要的用途是把一些二进制数转成普通字符用于网络传输.  

jsp编码-jsp上的utf-8的编码解决问题

问题描述 jsp上的utf-8的编码解决问题 求解,在jsp页面输入中文并保存到数据库,结果在数据库显示的是???,然后在jsp上从数据库取出来也是???,应该怎么解决?我是设置utf-8,也用了request.set--设置了编码,为什么还是不行? 解决方案 jsp中文utf-8编码JSP版(utf8编码)的Ueditor百度文章编辑器配置以及使用说明用UTF-8完全解决JSP+MYSQL多国语言文字编码问题 解决方案二: 数据库编码方式是什么呀?? 解决方案三: 数据库编码方式是什么呀??

【APACHE MINA2.0开发之二】自定义实现SERVER/CLIENT端的编解码工厂(自定义编码与解码器)!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/apache-mina/839.html 在上一篇博文中已经简单介绍过"过滤器"的概念,那么在Mina 中的协议编解码器通过过滤器 ProtocolCodecFilter 构造,这个过滤器的构造方法需 要一个 ProtocolCodecFactory,这从前面注册 TextLineCodecFactory 的代码就可以看出来. Pr

代码-用java语言编写android程序,实现调用usb打印机图片功能

问题描述 用java语言编写android程序,实现调用usb打印机图片功能 用java语言编写android程序,实现调用usb打印机图片功能,打印机不能联网,只是用代码去调用usb接口的打印机.急需实现此功能,请大神们帮帮忙 解决方案 http://blog.csdn.net/kangear/article/details/18141741 解决方案二: http://www.360doc.com/content/13/0906/12/11482448_312596809.shtml

Java Base64位编码与String字符串的相互转换,Base64与Bitmap的相互转换实例代码

首先是网上大神给的类 package com.duanlian.daimengmusic.utils; public final class Base64Util { private static final int BASELENGTH = 128; private static final int LOOKUPLENGTH = 64; private static final int TWENTYFOURBITGROUP = 24; private static final int EIGH

怎样用java调用微信接口生成二维码,并将图片存图硬盘中,求那位大神可以伸出援手,万分感激。

问题描述 怎样用java调用微信接口生成二维码,并将图片存图硬盘中,求那位大神可以伸出援手,万分感激. 怎样用java调用微信接口生成二维码,并将图片存图硬盘中,求那位大神可以伸出援手,万分感激. 解决方案 调用之后,微信会返回一个图片的二进制?还是一个图片地址?如果是图片的二进制直接用inputstream存就可以了啊,如果是图片地址,用网络请求相应地址,然后保存即可. 解决方案二: 回调的是一个URL,根据这个URL调用zing的方法生成二维码图片(bitmap类型),再把图片用文件流的形式

简洁实用的Java Base64编码加密异常处理类代码_java

本文所述为Java Base64加密.解密编码异常处理类,代码虽然很简短,但是可以有效避免在采用Base64加解密时候执行出错的问题,这里使用了com.gootrip.util包,并引入了java.io的所有方法. 具体功能代码如下: package com.gootrip.util; import java.io.*; public class Base64DecodingException extends IOException { private char c; public Base64

Android应用程序之间共享文字和图片(二)

MainActivity如下: package cn.testshare1; import java.io.File; import java.util.ArrayList; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.view.V

base64的格式转换成图片

问题描述 base64的格式转换成图片 将base64作为参数来传递的方法,方法将base64转换成图片并且保存,返回一个路径 解决方案 base64 EnCode将任何数据文件转换. base64 DeCode将Base64转换成原来的,事先要指定好相应的扩展名. 看看Java和DotNet,里面肯定有相应的库函数. MSDN也可以去查查. 解决方案二: base64不是一种格式,而是一种数据的编码方式,经过编码后,所有字节都是可打印字符 base64的编码和解码都很简单的,看一下相关资料就行