How to use the ^DG command send image to a zebra printer in java?

后端 未结 2 1316
无人及你
无人及你 2021-01-15 14:42

Is anyone know how to convert a image(such as *.bmp files) to HEX string in java,so the HEX string can used in the ^DG command(one of command in zpl).thanks!

相关标签:
2条回答
  • 2021-01-15 14:52

    I have written an java example that can do that. You can also create ascii hex code or compressed ZPL code and select blackness percentage to improve accuracy.

    Change the parameters in the main method accordingly. For a more extensive explanation here

    *To test the result without printing here enter

    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.imageio.ImageIO;
    public class ZPLConveter {
        private int blackLimit = 380;
        private int total;
        private int widthBytes;
        private boolean compressHex = false;
        private static Map<Integer, String> mapCode = new HashMap<Integer, String>();
        {
            mapCode.put(1, "G");
            mapCode.put(2, "H");
            mapCode.put(3, "I");
            mapCode.put(4, "J");
            mapCode.put(5, "K");
            mapCode.put(6, "L");
            mapCode.put(7, "M");
            mapCode.put(8, "N");
            mapCode.put(9, "O");
            mapCode.put(10, "P");
            mapCode.put(11, "Q");
            mapCode.put(12, "R");
            mapCode.put(13, "S");
            mapCode.put(14, "T");
            mapCode.put(15, "U");
            mapCode.put(16, "V");
            mapCode.put(17, "W");
            mapCode.put(18, "X");
            mapCode.put(19, "Y");
            mapCode.put(20, "g");
            mapCode.put(40, "h");
            mapCode.put(60, "i");
            mapCode.put(80, "j");
            mapCode.put(100, "k");
            mapCode.put(120, "l");
            mapCode.put(140, "m");
            mapCode.put(160, "n");
            mapCode.put(180, "o");
            mapCode.put(200, "p");
            mapCode.put(220, "q");
            mapCode.put(240, "r");
            mapCode.put(260, "s");
            mapCode.put(280, "t");
            mapCode.put(300, "u");
            mapCode.put(320, "v");
            mapCode.put(340, "w");
            mapCode.put(360, "x");
            mapCode.put(380, "y");        
            mapCode.put(400, "z");            
        }
        public String convertfromImg(BufferedImage image) throws IOException {
            String body = createBody(image);
            if(compressHex)
               body = encodeHexAscii(body);
            return headDoc() + body + footDoc();        
        }
        private String createBody(BufferedImage orginalImage) throws IOException {
            StringBuffer sb = new StringBuffer();
            Graphics2D graphics = orginalImage.createGraphics();
            graphics.drawImage(orginalImage, 0, 0, null);
            int height = orginalImage.getHeight();
            int width = orginalImage.getWidth();
            int rgb, red, green, blue, index=0;        
            char auxBinaryChar[] =  {'0', '0', '0', '0', '0', '0', '0', '0'};
            widthBytes = width/8;
            if(width%8>0){
                widthBytes= (((int)(width/8))+1);
            } else {
                widthBytes= width/8;
            }
            this.total = widthBytes*height;
            for (int h = 0; h<height; h++)
            {
                for (int w = 0; w<width; w++)
                {
                    rgb = orginalImage.getRGB(w, h);
                    red = (rgb >> 16 ) & 0x000000FF;
                    green = (rgb >> 8 ) & 0x000000FF;
                    blue = (rgb) & 0x000000FF;
                    char auxChar = '1';
                    int totalColor = red + green + blue;
                    if(totalColor>blackLimit){
                        auxChar = '0';
                    }
                    auxBinaryChar[index] = auxChar;
                    index++;
                    if(index==8 || w==(width-1)){
                        sb.append(fourByteBinary(new String(auxBinaryChar)));
                        auxBinaryChar =  new char[]{'0', '0', '0', '0', '0', '0', '0', '0'};
                        index=0;
                    }
                }
                sb.append("\n");
            }
            return sb.toString();
        }
        private String fourByteBinary(String binaryStr){
            int decimal = Integer.parseInt(binaryStr,2);
            if (decimal>15){
                return Integer.toString(decimal,16).toUpperCase();
            } else {
                return "0" + Integer.toString(decimal,16).toUpperCase();
            }
        }
        private String encodeHexAscii(String code){
            int maxlinea =  widthBytes * 2;        
            StringBuffer sbCode = new StringBuffer();
            StringBuffer sbLinea = new StringBuffer();
            String previousLine = null;
            int counter = 1;
            char aux = code.charAt(0);
            boolean firstChar = false; 
            for(int i = 1; i< code.length(); i++ ){
                if(firstChar){
                    aux = code.charAt(i);
                    firstChar = false;
                    continue;
                }
                if(code.charAt(i)=='\n'){
                    if(counter>=maxlinea && aux=='0'){
                        sbLinea.append(",");
                    } else     if(counter>=maxlinea && aux=='F'){
                        sbLinea.append("!");
                    } else if (counter>20){
                        int multi20 = (counter/20)*20;
                        int resto20 = (counter%20);
                        sbLinea.append(mapCode.get(multi20));
                        if(resto20!=0){
                            sbLinea.append(mapCode.get(resto20) + aux);    
                        } else {
                            sbLinea.append(aux);    
                        }
                    } else {
                        sbLinea.append(mapCode.get(counter) + aux);
                        if(mapCode.get(counter)==null){
                        }
                    }
                    counter = 1;
                    firstChar = true;
                    if(sbLinea.toString().equals(previousLine)){
                        sbCode.append(":");
                    } else {
                        sbCode.append(sbLinea.toString());
                    }                
                    previousLine = sbLinea.toString();
                    sbLinea.setLength(0);
                    continue;
                }
                if(aux == code.charAt(i)){
                    counter++;                
                } else {
                    if(counter>20){
                        int multi20 = (counter/20)*20;
                        int mod20 = (counter%20);
                        sbLinea.append(mapCode.get(multi20));
                        if(mod20!=0){
                            sbLinea.append(mapCode.get(mod20) + aux);    
                        } else {
                            sbLinea.append(aux);    
                        }
                    } else {
                        sbLinea.append(mapCode.get(counter) + aux);
                    }
                    counter = 1;
                    aux = code.charAt(i);
                }            
            }
            return sbCode.toString();
        }
        private String headDoc(){
            String str = "^XA " +
                            "^FO0,0^GFA,"+ total + ","+ total + "," + widthBytes +", ";
            return str;
        }
        private String footDoc(){
            String str = "^FS"+
                            "^XZ";        
            return str;
        }
        public void setCompressHex(boolean compressHex) {
            this.compressHex = compressHex;
        }
        public void setBlacknessLimitPercentage(int percentage){
            blackLimit = (percentage * 768 / 100);
        }
        public static void main(String[] args) throws Exception {
            BufferedImage orginalImage = ImageIO.read(new File("/tmp/logo.jpg"));
            ZPLConveter zp = new ZPLConveter();
            zp.setCompressHex(true);
            zp.setBlacknessLimitPercentage(50);        
            System.out.println(zp.convertfromImg(orginalImage));        
        }
    }
    
    0 讨论(0)
  • 2021-01-15 14:59

    It's not easy. You have to convert the image to 1-bit per pixel b/w, and then calculate the size including the bytes per row, and then properly form up the parameters of the ~DG command to store it.

    Or...

    Zebra provides an API to convert images to GRFs (Zebra internal image type). There are a bunch of developer demos in the package, including a demo on how to print/store an image as a GRF on your printer

    Zebra Link-OS SDK download

    Hope this helps

    0 讨论(0)
提交回复
热议问题