0 Replies Latest reply on Nov 5, 2018 10:26 AM by Gurpreet Waraich

    How to convert png image to zpl string in java?

    Gurpreet Waraich

      I have found a code to generate zpl string for an image in java. However, when I am executing this java code it is giving me zpl string which is nothing but black image.

       

      Code is

       

      Java Code

       

      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 cuerpo = createBody(image);

              if(compressHex)

                 cuerpo = encodeHexAscii(cuerpo);

              return headDoc() + cuerpo + 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 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);

                      }

                      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.png"));

              ZPLConveter zp = new ZPLConveter();

              zp.setCompressHex(true);

              zp.setBlacknessLimitPercentage(50);       

              System.out.println(zp.convertfromImg(orginalImage));       

          }

      }