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