java中对base64与图片的互转实现

java中对base64与图片的互转实现

月光魔力鸭

2018-12-13 11:54 阅读 583 喜欢 0 base64图片转化

项目中有使用到对图片进行base64转码,然后解码保存的小功能,这边先记录下实现,网上的方案超级多,我也是从上面整理的,拿下来测试下。

想到java的实现后,又想到自己小博客好像也有对base64进行转化存储的功能,赶紧也贴上来,两遍对照下,反正都用得着。

java 代码

package test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/***
 * 测试转化图片为base64字符串
 * @author Administrator
 *
 */
public class Base64 {

    //转化图片为base64
    public static String convertStr(String filePath) throws Exception {
        InputStream is = new FileInputStream(filePath);
        byte[] data = null;
        data = new byte[is.available()];
        is.read(data);
        is.close();
        return java.util.Base64.getEncoder().encodeToString(data);
    }
    //转化字符串为图片
    public static String convertImg(String base64,String filePath) throws Exception {
        byte[] arr = java.util.Base64.getDecoder().decode(base64);
        for (int i = 0; i < arr.length; ++i) {
            if (arr[i] < 0) {// 调整异常数据
                arr[i] += 256;
            }
        }
        OutputStream out = new FileOutputStream(filePath);
        out.write(arr);
        out.flush();
        out.close();

        return filePath;
    }
    
    public static void main(String[] args) throws Exception {
        String filePath = "d:/ttt/a.png";
//		System.out.println(filePath);
//		String str = convertStr(filePath);
//		System.out.println(str);
        String ab = "--- 这个是转码后的base64";//贴上后发现有点长,就去掉了
        String filePath2 = "d:/ttt/b.png";
        convertImg(ab,filePath2);
    }
}

nodejs 代码

//实现nodejs版本图片base64互转
let filePath = 'd:/ttt/a.png';
let filePath2 = 'd:/ttt/c.png';
let fs = require('fs');

function convertImg(filePath){
    //读取图片,并转为base64
    return new Promise((resolve,reject)=>{
        let rs = fs.createReadStream(filePath);
        let chunks = [];
        let size = 0;
        rs.on('data',chunk=>{
            chunks.push(chunk);
            size += chunk.length;
        });
        rs.on('error',()=>{
            reject('读取错误');
        })
        rs.on('close',()=>{
            let buffer = Buffer.concat(chunks,size);
            let baseStr = buffer.toString('base64');
            resolve(baseStr);
        });
    });
}
function convertStr(str,filePath){
    return new Promise((resolve,reject)=>{
        var base64Data = str.replace(/^data:image\/\w+;base64,/, "");
        var dataBuffer = new Buffer(base64Data, 'base64');
        fs.writeFile(filePath,dataBuffer,function(err){
        	if(err){
        		reject(err);
        	}else{
        		resolve(true);
        	}
        });
    });
}

convertImg(filePath).then((basestr)=>{
    return convertStr(basestr,filePath2);
})
.then(flag=>{
    console.log(flag);
})
.catch(err=>{
    console.log(err);
})

最后简单贴个截图看下

a.png - b.png - c.png


实现都不算是复杂,至于效率神马的..我也没测,估摸着相差应该也不会很大(额.也不一定。我瞎猜的) 以上是java和nodejs 对图片和base64两种格式的相互转化实现。

转载请注明出处: https://chrunlee.cn/article/java-base64-png.html


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
最近项目使用了spring-boot框架,在部署过程中出现了很多问题,这里记录下,防止后续遗忘。
项目为长期稳定运行中,由于新增功能或修复BUG,修改代码后无法启动。根据添加的代码删减,最后确认出的问题。
实际上,之前有对接过的... 但是忘记了,而且也没做详细记录,同时语言又换了.. 成java了,所有这里记录下,包括从微信的授权、token、以及到js-sdk 开发为止。
使用spring boot 来传递日期参数的时候,发现报错。顺手记录。
项目为nginx+tomcat 部署的,由于需要https环境,本来直接配置nginx https就可以了,结果在jsp 中获取request.getScheme 怎么都是http .. 可把我这个假运维愁坏了。
关于即时通讯,现在各路APP基本都有,虽然不能说是核心,但是如果没有又总会觉的少点啥。 如果对即时通讯要求不高,且用户量不大,只是想要从无到有的话,可以直接使用现有的服务即可,有不少免费的足够支持小量用户的要求。但是如果用户量稍微较大,且需要一些定制服务又不想受制于人,那么搭建自己的即时通讯服务器可能是你最终的选择。但是,从头开发肯定是不可能的。
nginx 监听的服务器的9000 端口,转的443 到tomcat 中,但是在java web jsp中获取的端口却还是443.
之前没接触过tigase,最近开始准备用这个来做IM ,开始预研..不过中间比较坎坷,虽然有忙别的事情,但是前前后后还是花了好几天的时间,资源太少,官网又看不懂,git还下不下来... 啥机制也不懂.. 真惆怅。