Home > Java > javaTutorial > Java generates color QR code with logo

Java generates color QR code with logo

高洛峰
Release: 2017-01-20 16:08:59
Original
1687 people have browsed it

java生成二维码有很多开发的jar包如zxing是谷歌开发的,这里的话我使用zxing的开发包来实现的。我们在很多项目中需要动态生成二维码,来提供给用户,这样让更多人能够很好的通过二维码来体验自己的应用。

下面贴出代码,已经测试通过,大家可以直接复制代码使用:

java生成二维码

代码如下:

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;
  
public class MatrixToImageWriter {
  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[i][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 > halfW - 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;
  }
  
  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 {
    // 依次为内容(不支持中文),宽,长,中间图标路径,储存路径  
    MatrixToImageWriter.encode("http://www.baidu.com/", 512, 512,
        "D:\\logo.png", "D:\\2013-01.jpg");
  
  }
}
Copy after login

以上就是本文的全部内容,帮助大家设计属于自己的二维码。

更多java生成彩色附logo二维码相关文章请关注PHP中文网!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template