java base64 不一样,java中对base64与图片的互转实现

本文介绍了如何使用Java和Node.js进行图片与Base64字符串之间的转换。提供了详细的代码示例,包括Java的FileInputStream和OutputStream以及Node.js的fs模块来读写文件,并使用Base64编码解码。示例展示了图片转Base64字符串以及Base64字符串转回图片的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中有使用到对图片进行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);

})

最后简单贴个截图看下

e74ac29f59076c635d4f68ddc2d09580.png

实现都不算是复杂,至于效率神马的..我也没测,估摸着相差应该也不会很大(额.也不一定。我瞎猜的)

以上是java和nodejs 对图片和base64两种格式的相互转化实现。

### Java图片Base64 编码结果在线工具一致的原因分析 在 Java实现图片Base64 的转换过程中,可能会遇到生成的 Base64 字符串其他在线工具生成的结果一致的情况。这种差异通常由以下几个原因引起: #### 1. **字符集编码的同** Java 默认使用的字符集可能在线工具同。如果未显式指定字符集,则可能导致编码后的字符串存在差异。例如,在线工具可能默认使用 UTF-8 而 Java 使用的是 ISO-8859-1 或其他编码方式[^1]。 ```java byte[] imageBytes = Files.readAllBytes(Paths.get("path/to/image")); String base64Str = Base64.getEncoder().encodeToString(imageBytes); // 如果需要确保一致性,可以强制指定字符集为 UTF-8 String utf8EncodedBase64 = new String(Base64.getEncoder().encode(imageBytes), StandardCharsets.UTF_8); ``` #### 2. **Base64 编码器的选择** 同的 Base64 编码库可能存在细微差别。例如,某些在线工具可能支持 MIME 风格的 Base64 输出(带有换行符),而 Java 的 `Base64` 类则提供无换行符的标准输出模式。可以通过调整编码选项来匹配目标格式[^2]。 ```java import java.util.Base64; // 标准 Base64 编码 String standardEncoding = Base64.getMimeEncoder().encodeToString(imageBytes); // 带有换行符的 MIME 风格 Base64 编码 String mimeEncoding = Base64.getMimeEncoder(76, "\n".getBytes()).encodeToString(imageBytes); ``` #### 3. **图片数据预处理的影响** 部分在线工具会在读取图片前对其进行压缩、裁剪或其他操作,从而改变原始二进制数据的内容。而在 Java 实现中,如果没有类似的预处理逻辑,则会直接基于完整的像文件生成 Base64 结果,这也会导致两者之间的差异。 #### 解决方案 为了使 Java 生产的 Base64 数据特定在线工具保持一致,可以从以下方面入手: - 显式设置统一的字符集编码,推荐使用 UTF-8。 - 确认并适配所选在线工具采用的具体 Base64 变体形式(标准 vs MIME)。 - 对输入图片执行相同的预处理步骤(如有必要)。例如,通过第三方库如 ImageMagick 进行标准化处理后再进行编码[^2]。 以下是改进版代码示例,展示如何控制这些因素以提高兼容性: ```java import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.Base64; public class ImageToBase64 { public static void main(String[] args) throws Exception { String imgFilePath = "http://example.com/path/to/image.jpg"; try (InputStream inputStream = new URL(imgFilePath).openStream(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } byte[] imageData = outputStream.toByteArray(); // 使用 UTF-8 编码和 MIME 风格 Base64 String base64Mime = Base64.getMimeEncoder(76, "\r\n".getBytes(StandardCharsets.US_ASCII)) .encodeToString(imageData); System.out.println(base64Mime); } } } ``` ### 总结 通过对字符集、Base64 编码变体以及图片预处理流程的一致化配置,能够有效减少因环境差异带来的 Base64 表达上的偏差。最终达到预期在线工具相吻合的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值