斑马公司的打印机需要用到zpl语言,但是,zpl在线转换🔗 Labelary ZPL Image Converter是有次数限制的,根本满足不了大量的需求,现在搞一个本地的转换器
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
public class ZplImageConverter {
public static void main(String[] args) throws IOException {
String imageUrl = "https://example.com/image.png"; // 改成你的图片地址
BufferedImage image = ImageIO.read(new URL(imageUrl));
// 1. 转为黑白图像
BufferedImage monochrome = convertToBlackWhite(image);
// 2. 转为 ZPL
String zpl = convertToZpl(monochrome);
System.out.println(zpl);
}
// 将图像转换为黑白(单色)图像
public static BufferedImage convertToBlackWhite(BufferedImage image) {
int width = image.getWidth();
int height = image.getHeight();
BufferedImage bwImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY);
Graphics2D g2d = bwImage.createGraphics();
g2d.drawImage(image, 0, 0, null);
g2d.dispose();
return bwImage;
}
// 将黑白图像转换为 ZPL 格式
public static String convertToZpl(BufferedImage image) {
int width = image.getWidth();
int height = image.getHeight();
int bytesPerRow = (int) Math.ceil(width / 8.0);
int totalBytes = bytesPerRow * height;
StringBuilder sb = new StringBuilder();
sb.append("^XA\n");
sb.append("^FO0,0^GFA,")
.append(totalBytes).append(",")
.append(totalBytes).append(",")
.append(bytesPerRow).append(",\n");
for (int y = 0; y < height; y++) {
StringBuilder row = new StringBuilder();
int bitBuffer = 0;
int bitCount = 0;
for (int x = 0; x < width; x++) {
int color = image.getRGB(x, y);
boolean isBlack = (color & 0xFFFFFF) == 0x000000;
bitBuffer = (bitBuffer << 1) | (isBlack ? 1 : 0);
bitCount++;
if (bitCount == 8 || x == width - 1) {
row.append(String.format("%02X", bitBuffer << (8 - bitCount)));
bitBuffer = 0;
bitCount = 0;
}
}
sb.append(row).append("\n");
}
sb.append("^FS\n^XZ");
return sb.toString();
}
}