Base64转换图片,图片转换Base64实例

1、 下面是一个完整的代码示例。
指定文件路径转为二进制
将网络图片转为二进制
base64 转为图片资源

package com.xxx.example.file;
 
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
 
import javax.imageio.ImageIO;
 
import com.zxtc.syonline.support.common.StringUtil;
 
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
 
public class ImageBioChangeUtil {
    
    static BASE64Encoder encoder = new sun.misc.BASE64Encoder();   
    static BASE64Decoder decoder = new sun.misc.BASE64Decoder();
    
    //从文件路径中获取图片转为二进制
    public static String getImageBinary(String filePath){
        if(StringUtil.isEmpty(filePath)) {
            return null;
        }
        File f = new File(filePath);    //这里gif动态图不可以,虽然在后面也能输出gif格式,但是却不是动图
        BufferedImage bi;   
        try {   
            bi = ImageIO.read(f);   
            ByteArrayOutputStream baos = new ByteArrayOutputStream();   
            ImageIO.write(bi, "jpg", baos);   
            byte[] bytes = baos.toByteArray();   
               
            return encoder.encodeBuffer(bytes).trim();   
        } catch (IOException e) {   
            e.printStackTrace();   
        }   
        return null;   
    }
    //从URl中获取图片转为二进制
    public static String getImageBinaryFromUrl(String urlPath) throws Exception{
        if(StringUtil.isEmpty(urlPath)) {
            return "";
        }
        URL url=new URL(urlPath);
        HttpURLConnection conn= (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setConnectTimeout(3000);//超时提示1秒=1000毫秒
        InputStream inStream=conn.getInputStream();//获取输出流
        byte[] data=readInputStream(inStream);
        return encoder.encodeBuffer(data).trim();   
        
    }   
     //readInputStream方法
    private static byte[] readInputStream(InputStream inStream) throws Exception{
        ByteArrayOutputStream outStream=new ByteArrayOutputStream();
        byte[] buffer=new byte[1024];//转换为二进制
        int len=0;
        while((len =inStream.read(buffer))!=-1){
            outStream.write(buffer,0,len);
        }
        return  outStream.toByteArray();
    }
    //将二进制转为图片
    public static void base64StringToImage(String base64String,String outFilePath){
        if(StringUtil.isNotEmpty(base64String)&&StringUtil.isNotEmpty(outFilePath)) {
            try {   
                byte[] bytes1 = decoder.decodeBuffer(base64String);   
                   
                ByteArrayInputStream bais = new ByteArrayInputStream(bytes1);   
                BufferedImage bi1 =ImageIO.read(bais);   
                File w2 = new File(outFilePath);//可以是jpg,png格式   
                if (!w2.exists()) {   //文件不存在则创建文件,先创建目录
                    File dir = new File(w2.getParent());
                    dir.mkdirs();
                    w2.createNewFile(); // 创建新文件
                }
                ImageIO.write(bi1, "jpg", w2);//不管输出什么格式图片,此处不需改动   
            } catch (IOException e) {   
                e.printStackTrace();   
            }   
        }
    }
    
    public static void main(String[] args) {
        String imageBinary=null;
        try {
            imageBinary = getImageBinaryFromUrl("");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(imageBinary);   
        String outFilePath= "E://test//bio//zhh/aa.png";   
        base64StringToImage(imageBinary,outFilePath);   
    }
}


2、如何判断 base64 图片的格式?

//判断图片base64字符串的文件格式
    public static String checkImageBase64Format(String base64ImgData) {
        byte[] b = Base64Util.decode(base64ImgData);
        String type = "";
        if (0x424D == ((b[0] & 0xff) << 8 | (b[1] & 0xff))) {
            type = "bmp";
        } else if (0x8950 == ((b[0] & 0xff) << 8 | (b[1] & 0xff))) {
            type = "png";
        } else if (0xFFD8 == ((b[0] & 0xff) << 8 | (b[1] & 0xff))) {
            type = "jpg";
        }
        return type;
    }


3、将网络图片转为 base64 字符串
  

  /**
     * 将网络路径图片转为base64的格式
     * @param requestUrl 请求网络路径
     * @throws Exception
     */
    public static String getUrlImageToBase64(String requestUrl) throws Exception {
        ByteArrayOutputStream data = new ByteArrayOutputStream();
        try {
            // 创建URL
            URL url = new URL(requestUrl);
            byte[] by = new byte[1024];
 
            // 创建链接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(5 * 1000);
            InputStream is = conn.getInputStream();
 
            // 将内容读取内存中
            int len = -1;
            while ((len = is.read(by)) != -1) {
                data.write(by, 0, len);
            }
 
            // 关闭流
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        // 对字节数组Base64编码
        Base64.Encoder encoder = Base64.getEncoder();
//        return "data:image/" + photoType + ";base64," + encoder.encodeToString(data.toByteArray());
        return encoder.encodeToString(data.toByteArray());
    }


4、将 base64 字符串转为图片输出
    

/**
     * 将Base64编码的字符串转为文件输出
     * @param base64String 字符串
     * @param path 输出文件保存路径
     * @param fileName 输出文件名称
     * @return 是否转换成功
     */
    public static boolean writeFileFromBase64(String base64String, String path, String fileName) {
        if (base64String == null){
            return false;
        }
        try    {
            byte[] b = Base64Util.decode(base64String);
            File file = new File(path);
            if(!file.exists()){
                makeDir(file);
            }
            OutputStream out = new FileOutputStream(path + fileName);
            out.write(b);
            out.flush();
            out.close();
            return true;
        }catch(Exception e){
            e.printStackTrace();
            return false;
        }
    }


注:该方法的入参,base64 格式文件不得有 文件头部标识信息,否则会转换失败。所以这里我们需要自行判断是否包含有头部信息。

String urlImageToBase64 = "";//这里就是我们图片的base64字符串
if(urlImageToBase64.indexOf(",")>-1) {//包含头信息
                System.out.println("包含头部信息");
                urlImageToBase64 = urlImageToBase64.substring(urlImageToBase64.indexOf(",")+1);
}


 5、将文件转为 base64 字符串
    

/**
     * 读入文件转换为Base64编码并返回
     * @param filePath 文件路径
     * @return base64 的文件
     * @throws Exception
     */
    public static String readAsBase64FromFile(String filePath) {    
        InputStream in = null;
        byte[] data = null;
        
        try    {
            in = new FileInputStream(fileName);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch(Exception e) {
            e.printStackTrace();
            return null;
        }
        return Base64Util.encode(data);
    }


上面用到了一个 Base64Util.java

你可能感兴趣的:(java,spring,boot)