You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中将ZPL GRF十六进制代码转换为JPG/PNG?

解决方案:ZPL GRF十六进制转JPG/PNG(Java实现)

先明确格式:你的十六进制代码是ZPL GRF格式

ZPL的.GRF是斑马打印机专用的单色位图格式,你的数据参数完全匹配:

  • 每行15字节 = 15×8=120像素(单像素1位,黑白)
  • 总1890字节 = 1890÷15=126行
  • 最终图像尺寸是120×126像素的单色位图

不要尝试用BMP加载GRF数据,两者格式完全不同,这就是你之前报错的原因。

Java实现步骤(按你的需求拆解)

1. 核心代码实现

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HexFormat;

public class GrfToImageConverter {
    public static void main(String[] args) throws IOException {
        // 替换为你的GRF十六进制输入字符串
        String grfHex = "你的十六进制代码内容";
        
        // 步骤1:解析十六进制为字节数组
        byte[] grfBytes = HexFormat.of().parseHex(grfHex);
        
        // 步骤2:计算图像尺寸
        int bytesPerLine = 15;
        int width = bytesPerLine * 8; // 1字节对应8个像素位
        int height = grfBytes.length / bytesPerLine;
        
        // 步骤3:创建内存图像(单色格式更高效)
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY);
        
        // 步骤4:逐字节逐位转换为像素
        for (int y = 0; y < height; y++) {
            int lineStart = y * bytesPerLine;
            for (int byteIdx = 0; byteIdx < bytesPerLine; byteIdx++) {
                byte b = grfBytes[lineStart + byteIdx];
                // 从高位到低位遍历每一位,对应图像从左到右的像素
                for (int bit = 7; bit >= 0; bit--) {
                    int x = byteIdx * 8 + (7 - bit);
                    // GRF中1代表黑色,0代表白色,颜色反转的话取反判断即可
                    boolean isBlack = (b & (1 << bit)) != 0;
                    image.setRGB(x, y, isBlack ? 0x000000 : 0xFFFFFF);
                }
            }
        }
        
        // 步骤5:保存为PNG/JPG
        ImageIO.write(image, "png", new File("output.png"));
        ImageIO.write(image, "jpg", new File("output.jpg"));
    }
}

2. 关键细节说明

  • 十六进制解析:Java 17+用HexFormat,低版本可替换为DatatypeConverter.parseHexBinary()(需引入javax.xml.bind包)
  • 像素位序:GRF字节是高位在前,所以从7到0遍历每一位,对应图像从左到右的像素
  • 颜色调整:如果生成图像颜色与预期相反,将isBlack的判断改为(b & (1 << bit)) == 0即可
  • 图像类型:TYPE_BYTE_BINARY是高效的黑白格式,若需彩色兼容可改用TYPE_INT_RGB

3. 简化替代方案(利用PBM格式兼容性)

GRF的二进制位流和PBM(便携式单色位图)的二进制格式完全兼容,可直接转换后用ImageIO处理:

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.HexFormat;

public class GrfToPbmConverter {
    public static void main(String[] args) throws IOException {
        String grfHex = "你的十六进制代码内容";
        byte[] grfBytes = HexFormat.of().parseHex(grfHex);
        
        int width = 15 * 8;
        int height = grfBytes.length / 15;
        
        // 生成PBM格式头+GRF数据
        StringBuilder pbmHeader = new StringBuilder();
        pbmHeader.append("P4\n").append(width).append(" ").append(height).append("\n");
        byte[] pbmData = new byte[pbmHeader.length() + grfBytes.length];
        System.arraycopy(pbmHeader.toString().getBytes(StandardCharsets.US_ASCII), 0, pbmData, 0, pbmHeader.length());
        System.arraycopy(grfBytes, 0, pbmData, pbmHeader.length(), grfBytes.length);
        
        // 读取PBM并保存为目标格式
        BufferedImage image = ImageIO.read(new ByteArrayInputStream(pbmData));
        ImageIO.write(image, "png", new File("output.png"));
    }
}

内容的提问来源于stack exchange,提问作者malz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:53:12