为了方便测试,我们可以使用一个图片编码网站,将图片进行base64编码
解密的代码如下
public static String generateImage(String base64, String path) { // 解密 try { String savePath = "/**/imgtest/"; // 图片分类路径+图片名+图片后缀 String imgClassPath = path.concat(UUID.randomUUID().toString()).concat(".jpg"); // 去掉base64前缀 data:image/jpeg;base64, base64 = base64.substring(base64.indexOf(",", 1) + 1); // 解密,解密的结果是一个byte数组 Base64.Decoder decoder = Base64.getDecoder(); byte[] imgbytes = decoder.decode(base64); for (int i = 0; i < imgbytes.length; ++i) { if (imgbytes[i] < 0) { imgbytes[i] += 256; } } // 保存图片 OutputStream out = new FileOutputStream(savePath.concat(imgClassPath)); out.write(imgbytes); out.flush(); out.close(); // 返回图片的相对路径 = 图片分类路径+图片名+图片后缀 return imgClassPath; } catch (IOException e) { return null; } }
因为图片的Base64字符串非常大,动辄几百K,所以不能直接使用String base64 = "${该图片的base64串}"
进行测试,否则编译器会报错Java "constant string too long" compile error"
。这个错误的出现,是因为字符串常量值的长度超过了65534,编译期检查没通过。运行时不存在这个限制,运行时的内存限制走的是堆内存,跟CPU分配内存相关。
解决方法1:如果将字符串预先存到一个文件里,使用的时候再从文件里读出来,就不会有什么问题文章来源:https://www.toymoban.com/news/detail-408476.html
// 从文件中读取字符串 public static String getFileContent(FileInputStream fis, String encoding) throws IOException { try (BufferedReader br = new BufferedReader(new InputStreamReader(fis, encoding))) { StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) { sb.append(line); } return sb.toString(); } } public static void main(String[] args) throws IOException { // 从txt文件中读取base64字符串 FileInputStream fis = new FileInputStream("/Users/valor/workspace/imgtest/bigimg.txt"); String base64 = getFileContent(fis, "UTF-8"); String path = ""; // 将base64字符串翻译成图片 String fileName = generateImage(base64, path); System.out.println(fileName); }
解决方法2:或者如果我们是处于前后端数据交换的环境中,由于json对于string的长度是没有限制的,所以可以直接使用@ResponseBody
通过一个Bean,去接收这串base64。文章来源地址https://www.toymoban.com/news/detail-408476.html
// bean @Data @AllArgsConstructor @NoArgsConstructor public class ImgInfo { Long id; String base64; } // controller @RestController public class String2ImgController { @Autowired private String2ImgService imgService; @PostMapping("/img/base64") public String transferImg(@RequestBody ImgInfo imgInfo) { String base64 = imgInfo.getBase64(); // System.out.println(base64); // 去掉base64前缀 data:image/jpeg;base64, base64 = base64.substring(base64.indexOf(",", 1) + 1); // 解密,解密的结果是一个byte数组 Base64.Decoder decoder = Base64.getDecoder(); byte[] imgbytes = decoder.decode(base64); for (int i = 0; i < imgbytes.length; ++i) { if (imgbytes[i] < 0) { imgbytes[i] += 256; } } // 对 byte 数组进行你所需要的操作…… } }
到了这里,关于Java - 将base64编码解码成图片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!