Java封装BufferedImage与base64互转方法

一、BufferedImage转base64 


 
 /**
     * BufferedImage 编码转换为 base64
     * @param bufferedImage
     * @return
     */
    private static String BufferedImageToBase64(BufferedImage bufferedImage) {
        ByteArrayOutputStream bao = new ByteArrayOutputStream();//io流
        try {
            ImageIO.write(bufferedImage, "png", bao);//写入流中
        } catch (IOException e) {
            e.printStackTrace();
        }
        byte[] bytes = Base64.getEncoder().encode(bao.toByteArray());
        String base64 = new String(bytes);
        base64 = base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n
        return "data:image/png;base64," + base64;
    }

二、base64转BufferedImage

导包

import java.util.Base64;
import java.util.Base64.Decoder;
/**
     * base64 编码转换为 BufferedImage
     * @param base64
     * @return
     */
    public static BufferedImage base64ToBufferedImage(String base64) {
       Decoder decoder = Base64.getDecoder();
        try {
            byte[] byteArray = decoder.decode(base64);
            ByteArrayInputStream bai = new ByteArrayInputStream(byteArray);
            return ImageIO.read(bai);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

三、调用示例

3.1 调用BufferedImage转base64方法

controller代码

@GetMapping(value = "/testImg")
    @ResponseBody
    public String testImg(){
        return JSON.toJSONString(new CommonView("200","成功",imgService.testBannerImg()));
    }

service代码

public String testBannerImg() {
        BufferedImage banner = null;
        try {
          banner = ImageIO.read(new File("F:\\Img\\ghost_K\\bj9.png"));//本地背景图
          BufferedImage code = ImageIO.read(new URL("https://*********************"));//二维码
            code = resizeImage(code, 360, 360);//调整图片大小
            if (banner == null || code == null) {
                return null;
            }
            Graphics2D g = banner.createGraphics();
            int x = 250;    //x轴偏移
            int y = 375;   //y轴偏移
            g.drawImage(code, x, y, code.getWidth(), code.getHeight(), null);
            g.dispose();
            String base64 = BufferedImageToBase64(banner);//调用转base64方法
            return base64;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

运行结果

3.1 调用base64转BufferedImage

controller代码

由于base64数据过长,所以直接使用http请求刚才生成的结果转成JSON数据获取base64数据

    @GetMapping(value = "/testImg2")
    public Object testImg2(HttpServletResponse response){
        String urlResult = HttpUtil.get("http://localhost:9080/test/testImg");
        JSONObject jsonObject = JSONObject.parseObject(urlResult);
        Object base64 = jsonObject.get("data");
        BufferedImage bufferedImage = imgService.testBannerImg2(base64.toString());
        try {
            ImageIO.write(bufferedImage, "png", response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

service代码

public BufferedImage testBannerImg2(String base64) {
        return base64ToBufferedImage(base64);//调用base64转BufferedImage
    }

注意点

        直接调用ImageIO.write(bufferedImage, "png", response.getOutputStream());输出图片时base64中不能包含"data:image/png;base64,",否则会报IllegalArgumentException: Illegal base64 character 3a这个错误。

错误原因:base64 编码中存在 data:image/png;base64,

运行结果,成功解析出图片

### Java 实现 Base64 编码换为图片并执行 OCR 换 #### 将 Base64 字符串解码为图片 在 Java 中,可以使用 `javax.imageio.ImageIO` 类来读取和写入图像文件。以下是将 Base64 字符串解码为图片的具体方法: ```java import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.util.Base64; public class Base64ToImage { public static void decodeBase64ToFile(String base64String, String outputPath) throws Exception { byte[] decodedBytes = Base64.getDecoder().decode(base64String.split(",")[1]); // 去掉前缀数据 try (FileOutputStream fos = new FileOutputStream(outputPath)) { fos.write(decodedBytes); } } public static BufferedImage decodeBase64ToBufferedImage(String base64String) throws Exception { byte[] decodedBytes = Base64.getDecoder().decode(base64String.split(",")[1]); return javax.imageio.ImageIO.read(new ByteArrayInputStream(decodedBytes)); } } ``` 上述代码展示了两种方式:一种是直接将 Base64 数据保存到磁盘上的文件;另一种则是将其加载到内存中的 `BufferedImage` 对象。 --- #### 使用 Tesseract 执行 OCR 处理 Tesseract 是一个开源的 OCR 工具,支持多种编程语言调用。对于 Java 来说,可以通过封装库 `tess4j` 来简化操作流程。以下是一个简单的例子展示如何利用 Tess4J 进行 OCR 文本提取: ```java import net.sourceforge.tess4j.ITesseract; import net.sourceforge.tess4j.Tesseract; import net.sourceforge.tess4j.TesseractException; import java.awt.image.BufferedImage; public class ImageToText { private static final ITesseract tesseract = new Tesseract(); static { tesseract.setDatapath("/path/to/tessdata"); // 设置 tessdata 文件夹路径 tesseract.setLanguage("eng"); // 设置识别的语言 } public static String extractTextFromImage(BufferedImage image) throws TesseractException { return tesseract.doOCR(image); // 返回从图片中提取的文字 } } ``` 注意,在运行此程序之前需要安装 Tesseract 并配置好环境变量以及下载对应的语言包[^3]。 --- #### 完整的工作流示例 下面提供了一个完整的端到端工作流实例,它先将 Base64 解码成图片对象,接着通过 OCR 提取出其中包含的文字信息。 ```java import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.util.Base64; public class MainWorkflow { public static void main(String[] args) { String base64EncodedImage = "your_base64_encoded_image_string_here"; try { // Step 1: Decode Base64 string into a BufferedImage object. BufferedImage bufferedImage = Base64ToImage.decodeBase64ToBufferedImage(base64EncodedImage); // Step 2: Perform OCR using Tess4J library. String extractedText = ImageToText.extractTextFromImage(bufferedImage); System.out.println("Extracted Text:"); System.out.println(extractedText); } catch (Exception e) { e.printStackTrace(); } } } ``` 以上代码片段实现了从 Base64 到图片再到文字的整体化过程[^1]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值