sinobuy
  

你好! 访客. 请先 登陆注册一个帐号.
七月 19, 2019, 02:44:37 pm
论文答辩趣闻 新年祝福短信 淘淘成长日记 可爱发行全攻略 鬼故事一箩筐 杨柳青石家大院 淘淘成长日记
* 首页 说明 搜索 日历 登陆 注册
公告和新闻:现在关注原生态购物网微博 ,转发就送3元  点击进入
原生态论坛  |  设计专版  |  网页/程序设计 (版主: tianya)  |  主题: java 生成带logo二维码 0 会员 以及 1 访客 正在阅读本篇主题. « 上一篇主题 下一篇主题 »
页: [1] 向下 打印
作者 主题: java 生成带logo二维码  (阅读 1904 次)
水影凝月
Administrator(管理员)
级别:东方不败
*****

受欢迎度: 190
离线 离线

帖子: 22836


451314485
个人网站 电子邮件
java 生成带logo二维码
« 于: 十二月 08, 2014, 11:09:16 am »

Java代码:
/**
 *
 */
package com.sinpok.tops.util;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

/**
 * @author tangb
 *
 */
public class QRCode {
   // 图片宽度的一半
   private static final int IMAGE_WIDTH = 100;
   private static final int IMAGE_HEIGHT = 100;
   private static final int IMAGE_HALF_WIDTH = IMAGE_WIDTH / 2;
   private static final int FRAME_WIDTH = 2;
   // 二维码写码器
   private static MultiFormatWriter mutiWriter = new MultiFormatWriter();

   public static void encode(String content, int width, int height,
         String srcImagePath, String destImagePath) {
      try {
         ImageIO.write(genBarcode(content, width, height, srcImagePath),
               "jpg", new File(destImagePath));
      } catch (IOException e) {
         e.printStackTrace();
      } catch (WriterException e) {
         e.printStackTrace();
      }
   }

   private static BufferedImage genBarcode(String content, int width,
         int height, String srcImagePath) throws WriterException,
         IOException {
      // 读取源图像
      BufferedImage scaleImage = scale(srcImagePath, IMAGE_WIDTH,
            IMAGE_HEIGHT, true);
      int[][] srcPixels = new int[IMAGE_WIDTH][IMAGE_HEIGHT];
      for (int i = 0; i < scaleImage.getWidth(); i++) {
         for (int j = 0; j < scaleImage.getHeight(); j++) {
            srcPixels[j] = scaleImage.getRGB(i, j);
         }
      }

      Map<EncodeHintType, Object> hint = new HashMap<EncodeHintType, Object>();
      hint.put(EncodeHintType.CHARACTER_SET, "utf-8");
      hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
      // 生成二维码
      BitMatrix matrix = mutiWriter.encode(content, BarcodeFormat.QR_CODE,
            width, height, hint);

      // 二维矩阵转为一维像素数组
      int halfW = matrix.getWidth() / 2;
      int halfH = matrix.getHeight() / 2;
      int[] pixels = new int[width * height];

      for (int y = 0; y < matrix.getHeight(); y++) {
         for (int x = 0; x < matrix.getWidth(); x++) {
            //左上角颜色,根据自己需要调整颜色范围和颜色
            if(x>0&&x<170&&y>0&&y<170){
               Color color= new Color(231,144,56);
               int colorInt=color.getRGB();
               pixels[y * width + x] = matrix.get(x, y) ? colorInt: 16777215;
            }
            // 读取图片
            else if (x > halfW - IMAGE_HALF_WIDTH
                  && x < halfW + IMAGE_HALF_WIDTH
                  && y > halfH - IMAGE_HALF_WIDTH
                  && y < halfH + IMAGE_HALF_WIDTH) {
               pixels[y * width + x] = srcPixels[x - halfW
                     + IMAGE_HALF_WIDTH][y - halfH + IMAGE_HALF_WIDTH];
            }
            // 在图片四周形成边框
            else if ((x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH
                  && x < halfW - IMAGE_HALF_WIDTH + FRAME_WIDTH
                  && y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH
                  + IMAGE_HALF_WIDTH + FRAME_WIDTH)
                  || (x > halfW + IMAGE_HALF_WIDTH - FRAME_WIDTH
                        && x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH
                        && y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH
                        + IMAGE_HALF_WIDTH + FRAME_WIDTH)
                  || (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH
                        && x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH
                        && y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH
                        - IMAGE_HALF_WIDTH + FRAME_WIDTH)
                  || (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH
                        && x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH
                        && y > halfH + IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH
                        + IMAGE_HALF_WIDTH + FRAME_WIDTH)) {
               pixels[y * width + x] = 0xfffffff;
            } else {
               //二维码颜色
               int num1=(int)(50-(50.0-13.0)/matrix.getHeight()*(y+1));
               int num2=(int)(165-(165.0-72.0)/matrix.getHeight()*(y+1));
               int num3=(int)(162-(162.0-107.0)/matrix.getHeight()*(y+1));
               Color color= new Color(num1,num2,num3);
               int colorInt=color.getRGB();
               // 此处可以修改二维码的颜色,可以分别制定二维码和背景的颜色;
               pixels[y * width + x] = matrix.get(x, y) ? colorInt: 16777215;//0x000000:0xffffff
            }
         }
      }

      BufferedImage image = new BufferedImage(width, height,
            BufferedImage.TYPE_INT_RGB);
      image.getRaster().setDataElements(0, 0, width, height, pixels);

      return image;
   }

   /**
    * 把传入的原始图像按高度和宽度进行缩放,生成符合要求的图标
    *
    * @param srcImageFile
    *            源文件地址
    * @param height
    *            目标高度
    * @param width
    *            目标宽度
    * @param hasFiller
    *            比例不对时是否需要补白:true为补白; false为不补白;
    * @throws IOException
    */
   private static BufferedImage scale(String srcImageFile, int height,
         int width, boolean hasFiller) throws IOException {
      double ratio = 0.0; // 缩放比例
      File file = new File(srcImageFile);
      BufferedImage srcImage = ImageIO.read(file);
      Image destImage = srcImage.getScaledInstance(width, height,
            BufferedImage.SCALE_SMOOTH);
      // 计算比例
      if ((srcImage.getHeight() > height) || (srcImage.getWidth() > width)) {
         if (srcImage.getHeight() > srcImage.getWidth()) {
            ratio = (new Integer(height)).doubleValue()
                  / srcImage.getHeight();
         } else {
            ratio = (new Integer(width)).doubleValue()
                  / srcImage.getWidth();
         }
         AffineTransformOp op = new AffineTransformOp(
               AffineTransform.getScaleInstance(ratio, ratio), null);
         destImage = op.filter(srcImage, null);
      }
      if (hasFiller) {// 补白
         BufferedImage image = new BufferedImage(width, height,
               BufferedImage.TYPE_INT_RGB);
         Graphics2D graphic = image.createGraphics();
         graphic.setColor(Color.white);
         graphic.fillRect(0, 0, width, height);
         if (width == destImage.getWidth(null))
            graphic.drawImage(destImage, 0,
                  (height - destImage.getHeight(null)) / 2,
                  destImage.getWidth(null), destImage.getHeight(null),
                  Color.white, null);
         else
            graphic.drawImage(destImage,
                  (width - destImage.getWidth(null)) / 2, 0,
                  destImage.getWidth(null), destImage.getHeight(null),
                  Color.white, null);
         graphic.dispose();
         destImage = image;
      }
      return (BufferedImage) destImage;
   }

   public static void main(String[] args) throws UnsupportedEncodingException {
      //依次为内容(不支持中文),宽,长,中间图标路径,储存路径
      QRCode.encode("http://www.sinobuy.cn/",512, 512, "D:\\logo.jpg", "D:\\myQrcode.jpg");
   }
}
已记录


原生态特色礼品:沉香 紫檀 黄花梨
页: [1] 向上 打印 
原生态论坛  |  设计专版  |  网页/程序设计 (版主: tianya)  |  主题: java 生成带logo二维码 « 上一篇主题 下一篇主题 »
跳到:  

友情链接: 原生态购物网 原生态官方博客  佛珠网  搜狐社区 淑女情缘论坛 沉香
  原生态论坛© 2005~2017, www.sinobuy.cn 版权所有
Powered by SMF 1.1 RC1 Lewis Media.
Powered by MySQL  Powered by PHP  Valid XHTML 1.0!  Valid CSS!