如何在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
相关产品推荐
相关产品推荐

