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

后端 未结 2 1318
无人及你
无人及你 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 mapCode = new HashMap();
        {
            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> 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));        
        }
    }
    

提交回复
热议问题