分享

使用zxing生成嵌图片的二维码【java】

 俯仰之间111 2015-04-21
文章转载自:http://blog.csdn.net/lcx46/article/details/13626841

[java]
  1. /** 
  2.  *  
  3.  */  
  4. package barcode;  
  5.   
  6. import java.awt.Color;  
  7. import java.awt.Graphics2D;  
  8. import java.awt.Image;  
  9. import java.awt.geom.AffineTransform;  
  10. import java.awt.image.AffineTransformOp;  
  11. import java.awt.image.BufferedImage;  
  12. import java.io.File;  
  13. import java.io.IOException;  
  14. import java.util.HashMap;  
  15. import java.util.Map;  
  16.   
  17. import javax.imageio.ImageIO;  
  18.   
  19. import com.google.zxing.BarcodeFormat;  
  20. import com.google.zxing.EncodeHintType;  
  21. import com.google.zxing.MultiFormatWriter;  
  22. import com.google.zxing.WriterException;  
  23. import com.google.zxing.common.BitMatrix;  
  24. import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;  
  25.   
  26. /** 
  27.  * @author lichunxi 
  28.  *  
  29.  */  
  30. public class BarcodeFactory {  
  31.     // 图片宽度的一般  
  32.     private static final int IMAGE_WIDTH = 80;  
  33.     private static final int IMAGE_HEIGHT = 80;  
  34.     private static final int IMAGE_HALF_WIDTH = IMAGE_WIDTH / 2;  
  35.     private static final int FRAME_WIDTH = 2;  
  36.   
  37.     // 二维码写码器  
  38.     private static MultiFormatWriter mutiWriter = new MultiFormatWriter();  
  39.   
  40.     public static void encode(String content, int width, int height,  
  41.             String srcImagePath, String destImagePath) {  
  42.         try {  
  43.             ImageIO.write(genBarcode(content, width, height, srcImagePath),  
  44.                     "jpg"new File(destImagePath));  
  45.         } catch (IOException e) {  
  46.             e.printStackTrace();  
  47.         } catch (WriterException e) {  
  48.             e.printStackTrace();  
  49.         }  
  50.     }  
  51.   
  52.     private static BufferedImage genBarcode(String content, int width,  
  53.             int height, String srcImagePath) throws WriterException,  
  54.             IOException {  
  55.         // 读取源图像  
  56.         BufferedImage scaleImage = scale(srcImagePath, IMAGE_WIDTH,  
  57.                 IMAGE_HEIGHT, true);  
  58.         int[][] srcPixels = new int[IMAGE_WIDTH][IMAGE_HEIGHT];  
  59.         for (int i = 0; i < scaleImage.getWidth(); i++) {  
  60.             for (int j = 0; j < scaleImage.getHeight(); j++) {  
  61.                 srcPixels[i][j] = scaleImage.getRGB(i, j);  
  62.             }  
  63.         }  
  64.   
  65.         Map<EncodeHintType, Object> hint = new HashMap<EncodeHintType, Object>();  
  66.         hint.put(EncodeHintType.CHARACTER_SET, "utf-8");  
  67.         hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);  
  68.         // 生成二维码  
  69.         BitMatrix matrix = mutiWriter.encode(content, BarcodeFormat.QR_CODE,  
  70.                 width, height, hint);  
  71.   
  72.         // 二维矩阵转为一维像素数组  
  73.         int halfW = matrix.getWidth() / 2;  
  74.         int halfH = matrix.getHeight() / 2;  
  75.         int[] pixels = new int[width * height];  
  76.   
  77.         for (int y = 0; y < matrix.getHeight(); y++) {  
  78.             for (int x = 0; x < matrix.getWidth(); x++) {  
  79.                 // 读取图片  
  80.                 if (x > halfW - IMAGE_HALF_WIDTH  
  81.                         && x < halfW + IMAGE_HALF_WIDTH  
  82.                         && y > halfH - IMAGE_HALF_WIDTH  
  83.                         && y < halfH + IMAGE_HALF_WIDTH) {  
  84.                     pixels[y * width + x] = srcPixels[x - halfW  
  85.                             + IMAGE_HALF_WIDTH][y - halfH + IMAGE_HALF_WIDTH];  
  86.                 }   
  87.                 // 在图片四周形成边框  
  88.                 else if ((x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH  
  89.                         && x < halfW - IMAGE_HALF_WIDTH + FRAME_WIDTH  
  90.                         && y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH  
  91.                         + IMAGE_HALF_WIDTH + FRAME_WIDTH)  
  92.                         || (x > halfW + IMAGE_HALF_WIDTH - FRAME_WIDTH  
  93.                                 && x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH  
  94.                                 && y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH  
  95.                                 + IMAGE_HALF_WIDTH + FRAME_WIDTH)  
  96.                         || (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH  
  97.                                 && x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH  
  98.                                 && y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH  
  99.                                 - IMAGE_HALF_WIDTH + FRAME_WIDTH)  
  100.                         || (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH  
  101.                                 && x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH  
  102.                                 && y > halfH + IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH  
  103.                                 + IMAGE_HALF_WIDTH + FRAME_WIDTH)) {  
  104.                     pixels[y * width + x] = 0xfffffff;  
  105.                 } else {  
  106.                     // 此处可以修改二维码的颜色,可以分别制定二维码和背景的颜色;  
  107.                     pixels[y * width + x] = matrix.get(x, y) ? 0xff000000  
  108.                             : 0xfffffff;  
  109.                 }  
  110.             }  
  111.         }  
  112.   
  113.         BufferedImage image = new BufferedImage(width, height,  
  114.                 BufferedImage.TYPE_INT_RGB);  
  115.         image.getRaster().setDataElements(00, width, height, pixels);  
  116.   
  117.         return image;  
  118.     }  
  119.   
  120.     /** 
  121.      * 把传入的原始图像按高度和宽度进行缩放,生成符合要求的图标 
  122.      *  
  123.      * @param srcImageFile 
  124.      *            源文件地址 
  125.      * @param height 
  126.      *            目标高度 
  127.      * @param width 
  128.      *            目标宽度 
  129.      * @param hasFiller 
  130.      *            比例不对时是否需要补白:true为补白; false为不补白; 
  131.      * @throws IOException 
  132.      */  
  133.     private static BufferedImage scale(String srcImageFile, int height,  
  134.             int width, boolean hasFiller) throws IOException {  
  135.         double ratio = 0.0// 缩放比例  
  136.         File file = new File(srcImageFile);  
  137.         BufferedImage srcImage = ImageIO.read(file);  
  138.         Image destImage = srcImage.getScaledInstance(width, height,  
  139.                 BufferedImage.SCALE_SMOOTH);  
  140.         // 计算比例  
  141.         if ((srcImage.getHeight() > height) || (srcImage.getWidth() > width)) {  
  142.             if (srcImage.getHeight() > srcImage.getWidth()) {  
  143.                 ratio = (new Integer(height)).doubleValue()  
  144.                         / srcImage.getHeight();  
  145.             } else {  
  146.                 ratio = (new Integer(width)).doubleValue()  
  147.                         / srcImage.getWidth();  
  148.             }  
  149.             AffineTransformOp op = new AffineTransformOp(  
  150.                     AffineTransform.getScaleInstance(ratio, ratio), null);  
  151.             destImage = op.filter(srcImage, null);  
  152.         }  
  153.         if (hasFiller) {// 补白  
  154.             BufferedImage image = new BufferedImage(width, height,  
  155.                     BufferedImage.TYPE_INT_RGB);  
  156.             Graphics2D graphic = image.createGraphics();  
  157.             graphic.setColor(Color.white);  
  158.             graphic.fillRect(00, width, height);  
  159.             if (width == destImage.getWidth(null))  
  160.                 graphic.drawImage(destImage, 0,  
  161.                         (height - destImage.getHeight(null)) / 2,  
  162.                         destImage.getWidth(null), destImage.getHeight(null),  
  163.                         Color.white, null);  
  164.             else  
  165.                 graphic.drawImage(destImage,  
  166.                         (width - destImage.getWidth(null)) / 20,  
  167.                         destImage.getWidth(null), destImage.getHeight(null),  
  168.                         Color.white, null);  
  169.             graphic.dispose();  
  170.             destImage = image;  
  171.         }  
  172.         return (BufferedImage) destImage;  
  173.     }  
  174.   /**
         * 需要导入的jar包:core.jar
         * 1.jpg为要嵌入到二维码中的小图片
         * 111.jpg为生成的二维码图片
         * @param args
         */
  175.     public static void main(String[] args) {  
  176.         BarcodeFactory  
  177.                 .encode("http://www.baidu.com",  
  178.                         300300"D:\\1.jpg""D:\\111.jpg");  
  179.     }  
  180. }  


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多