1、小票打印数据
{
"dvsno":"xxx",
"kind":"PRINT_TASK",
"count":"1",
"list":[
{
"task_id":"C147956F-C688-40CB-B0C5-A68E9677AA41",
"usbidx":"0",
"file_size":"652",
"target_file":"HSERG2EBveHVyrWlDQrT4M62yqjNt7bso6i088DLteqjqQ0KG0AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCh0hEcH3y666xaO6MDAzMRtADQrA4NDNo7rMw8qzDQq94dXKyrG85KO6MjAyMi0wOS0xOCAxMjo0OToxNg0KytXS+NSxo7rT4M62yqjNt7bso6i088DLteqjqQ0KtaW6xaO6NDgxNDQwMTIyMDkxODAwMzENCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KxrfP7iAgICAgICAgICAgICAgICAgIMr9wb8gICAgICDQobzGICAgICAg08W73bzbDQrW7b3Fy6vGtLe5ICAgICAgICAgICAgICAgMbfdICAgIDI2ICAgICAgICAgMjYNCiAgsbjXoqO61u22+g0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQqyy8a3vNu48brPvMYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYNCraptaW98LbuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQodIRHTpri2vfC27qO6ICAgICAgICAgICAgMjYNChtALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQrJqMLr1qe4ti3OotDFDQodIRHWp7i2vfC27qO6ICAgICAgICAgICAgMjYNChtALS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQrPwrWlyMujutPgzrbKqM23tuyjqLTzwMu16qOpDQrPwrWlyrG85KO6MjAyMi0wOS0xOCAxMjo0OToxNg0KtPLTocjLo7rT4M62yqjNt7bso6i088DLteqjqQ0KtPLTocqxvOSjujIwMjItMDktMTggMTI6NDk6MTYNCg0KDQoNCg0K"
}
]
}
2、标签打印的数据
{
"dvsno":"xxx",
"kind":"PRINT_TASK",
"count":"1",
"list":[
{
"task_id":"C147956F-C688-40CB-B0C5-A68E9677AA41",
"usbidx":"0",
"file_size":"258",
"target_file":"U0laRSA0MCBtbSwyMCBtbQ0KQ0xTDQpURVhUIDEwLDEwLCIyNCIsMCwxLDEsIlRFWFQiDQpCQVJDT0RFIDEwLDUwLCIxMjhNIiw2MCwwLDAsMiwyLCIhMTA0ITA5NkFCQ0QhMTAxRUZHSCINClRFWFQgMTAsMTIwLCIyNCIsMCwxLDEsIlRoaXMgaXMgTVFUVCB0ZXN0Ig0KUFJJTlQgMSw1DQo="
}
]
}
JAVA图片转换示列代码
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.ImageIO;
public class BitmapPrinter {
public static byte[] convertToDitheredData(String inputPath, int targetWidth) throws IOException {
// --- 加载原始图像 ---
BufferedImage original = ImageIO.read(new File(inputPath));
if (original == null)
throw new IOException("Unsupported image format");
// --- 缩放 ---
BufferedImage scaled = scaleImage(original, targetWidth);
int width = scaled.getWidth();
int height = scaled.getHeight();
// --- 创建 TYPE_BYTE_BINARY 位图(1位黑白)---
BufferedImage dithered = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY);
// --- 灰度缓存 ---
int[] grayLine = new int[width];
int[] grayNext = new int[width];
// 初始化第一行灰度
for (int x = 0; x < width; x++) {
int rgb = scaled.getRGB(x, 0);
Color c = new Color(rgb);
grayLine[x] = clamp((int) (c.getRed() * 0.3 + c.getGreen() * 0.59 + c.getBlue() * 0.11 + 30));
}
// --- Floyd-Steinberg 抖动 ---
for (int y = 0; y < height; y++) {
// 下一行灰度
if (y < height - 1) {
for (int x = 0; x < width; x++) {
int rgb = scaled.getRGB(x, y + 1);
Color c = new Color(rgb);
grayNext[x] = clamp((int) (c.getRed() * 0.3 + c.getGreen() * 0.59 + c.getBlue() * 0.11 + 30));
}
}
for (int x = 0; x < width; x++) {
int oldPixel = grayLine[x];
int newPixel = (oldPixel < 160) ? 0 : 255; // 阈值 160,更白
int error = oldPixel - newPixel;
dithered.setRGB(x, y, (newPixel == 0) ? Color.BLACK.getRGB() : Color.WHITE.getRGB());
// 扩散误差
if (x + 1 < width)
grayLine[x + 1] = clamp(grayLine[x + 1] + (error * 7 / 16));
if (y < height - 1) {
if (x > 0)
grayNext[x - 1] = clamp(grayNext[x - 1] + (error * 3 / 16));
grayNext[x] = clamp(grayNext[x] + (error * 5 / 16));
if (x + 1 < width)
grayNext[x + 1] = clamp(grayNext[x + 1] + (error * 1 / 16));
}
}
if (y < height - 1)
System.arraycopy(grayNext, 0, grayLine, 0, width);
}
// --- 输出 BMP 到内存 ---
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(dithered, "BMP", baos);
byte[] bmpData = baos.toByteArray();
// --- 解析 BMP 文件结构 ---
int fileHeaderSize = 14;
int dibHeaderSize = readIntLE(bmpData, 14); // 从 offset 14 读取 DIB header 大小
int pixelDataOffset = readIntLE(bmpData, 10); // 像素数据偏移
int dataSize = bmpData.length - pixelDataOffset;
byte[] pixelData = new byte[dataSize];
System.arraycopy(bmpData, pixelDataOffset, pixelData, 0, dataSize);
// --- 反色(黑变白,白变黑)---
for (int i = 0; i < pixelData.length; i++) {
pixelData[i] = (byte) (~pixelData[i]);
}
return pixelData;
}
/** 缩放图像 */
private static BufferedImage scaleImage(BufferedImage src, int targetWidth) {
int width = src.getWidth();
int height = src.getHeight();
double ratio = (double) targetWidth / width;
int targetHeight = (int) Math.round(height * ratio);
BufferedImage scaled = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = scaled.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.drawImage(src, 0, 0, targetWidth, targetHeight, null);
g2d.dispose();
return scaled;
}
/** 限制范围 */
private static int clamp(int v) {
return (v < 0) ? 0 : ((v > 255) ? 255 : v);
}
/** 从 byte[] 按 little-endian 读取 4 字节整数 */
private static int readIntLE(byte[] data, int offset) {
return ((data[offset + 3] & 0xFF) << 24)
| ((data[offset + 2] & 0xFF) << 16)
| ((data[offset + 1] & 0xFF) << 8)
| (data[offset] & 0xFF);
}
// --- 测试 ---
public static void main(String[] args) {
try {
byte[] result = convertToDitheredData("test.png", 400);
System.out.println("Image data size = " + result.length + " bytes");
// 例如:将结果保存为原始数据文件
FileOutputStream fos = new FileOutputStream("test_data.bin");
fos.write(result);
fos.close();
System.out.println("Saved as test_data.bin");
} catch (Exception e) {
e.printStackTrace();
}
}
}
图片+文字+二维码打印示例数据:
示列数据下载地址:
作者:admin 创建时间:2023-09-10 11:20
最后编辑:admin 更新时间:2025-11-06 08:52
最后编辑:admin 更新时间:2025-11-06 08:52