使用Zxing实现二维码生成器内嵌图片

使用Zxing实现二维码生成器内嵌图片,具有一定的参考价值,具体如下:

基本思路是先使用zxing生成的二维码图片,然后读取图片,在其中插入图标,然后整个输出图片。

最近的项目中需要生成二维码,找了几个例子综合下,做出了最后的效果,二维码可以生成图片格式(jpg等)或者在web页面上显示,此片文章仅作记录,雷同之处多多,包涵。。。。

注:需要Zxing包装的工具类,大概的流程是读取内嵌的图片,将内容转化成二维码,将图片内嵌到二维码中,出图。

下面是完整代码:

import Java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.AffineTransformOp;
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;

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 Zxing {

private static final int BLACK = 0xFF000000;
private static final int WHITE = 0xFFFFFFFF;
// 图片宽度的一般
 private static final int IMAGE_WIDTH = 80;
 private static final int IMAGE_HEIGHT = 80;
 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 main(String[] args) {
try {
//BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, 400, 400,hints);
String content="13400000000";//二维码的内容
BufferedImage image = genBarcode(content, 400, 400, "F:\\amazed.png");
  if (!ImageIO.write(image, "jpg", new File("F:\\2122.jpg"))) {
   throw new IOException("Could not write an image of format ");
  }

          /**

           //将上面的代码换成此处,使用流读入到页面即可

OutputStream os = response.getOutputStream();

 if (!ImageIO.write(image, "jpg",os)) {

       throw new IOException("Could not write an image of format ");

      }

          **/
} catch (WriterException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
}
}
return image;
}
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);//错误等级
   hint.put(EncodeHintType.MARGIN, 1); //设置二维码外边框的空白区域的宽度
   // 生成二维码
   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 > 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 {
         // 此处可以修改二维码的颜色,可以分别制定二维码和背景的颜色;
         pixels[y * width + x] = matrix.get(x, y) ? 0xff000000
             : 0xfffffff;
       }
     }
   } 

   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.PINK);
     graphic.fillRect(10, 10, width, height);
     graphic.drawRect(100, 360, 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);
       Shape shape = new RoundRectangle2D.Float(0, (height - destImage.getHeight(null)) / 2, width, width, 20, 20);
       graphic.setStroke(new BasicStroke(5f));
       graphic.draw(shape);
     }
     else {
       graphic.drawImage(destImage,
           (width - destImage.getWidth(null)) / 2, 0,
           destImage.getWidth(null), destImage.getHeight(null),
           Color.white, null);
       Shape shape = new RoundRectangle2D.Float((width - destImage.getWidth(null)) / 2, 0, width, width, 20, 20);
       graphic.setStroke(new BasicStroke(5f));
       graphic.draw(shape);
     }
     graphic.dispose();
     destImage = image; 

   }
   return (BufferedImage) destImage;
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java实现二维码生成的几个方法(推荐)

    java实现二维码生成的几个方法,具体如下: 1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.jp/projects/qrcode/downloads/28391/qrcode.zip 这个是日本人写的,生成的是我们常见的方形的二维码 可以用中文 如:5677777ghjjjjj 2: 使用BarCode4j生成条形码和二维码 BarCode4j网址:http://sourcefor

  • Python实现的二维码生成小软件

    前几天,我估摸着做一个能生成QR Code小程序,并能用wxPython在屏幕上显示出来.当然,我想用纯Python实现,观望了一会后,我找到了三个候选: github 上的 python-qrcode sourceforge上的 pyqrcode Goolge code 上的 pyqrnative 我尝试了python-qrcode以及pyqrnative,因为它们能够运行在Windows/Mac/Linux.也不需要依赖额外的其他库除了Python图像库.pyqrcode项目需要其他一些先决

  • c#二维码生成的代码分享

    复制代码 代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Web; /// <summary>/// 调用外网API 生成二维码  周祥 2013年11月12日10:54:38/// </summary>public class Qr{    public Qr()    {        //        //TODO: 在此处添加构造函数逻辑        /

  • 月下载量上千次Android实现二维码生成器app源码分享

    在360上面上线了一个月,下载量上千余次.这里把代码都分享出来,供大家学习哈!还包括教大家如何接入广告,赚点小钱花花,喜欢的帮忙顶一个,大神见了勿喷,小学僧刚学Android没多久.首先介绍这款应用:APP是一款二维码生成器,虽然如何制作二维码教程网上有很多,我这里再唠叨一下并把我的所有功能模块代码都分享出来. 在这里我们需要一个辅助类RGBLuminanceSource,这个类Google也提供了,我们直接粘贴过去就可以使用了 package com.njupt.liyao; import c

  • google提供二维码生成器

    google提供二维码生成器 其实就是参考下面的传参方法 复制代码 代码如下: http://chart.apis.google.com/chart?cht=qr&chs=200x200&chl=http://www.jb51.net&choe=UTF-8 具体看下面二维码的图片路径.

  • php二维码生成

    本文介绍两种使用 php 生成二维码的方法. (1)利用google生成二维码的开放接口,代码如下: /** * google api 二维码生成[QRcode可以存储最多4296个字母数字类型的任意文本,具体可以查看二维码数据格式] * @param string $data 二维码包含的信息,可以是数字.字符.二进制信息.汉字.不能混合数据类型,数据必须经过UTF-8 URL-encoded.如果需要传递的信息超过2K个字节,请使用POST方式 * @param int $widhtHeig

  • PHP微信开发之二维码生成类

    <?php /** * Created by PhpStorm. * User: bin * Date: 15-1-16 * Time: 上午9:48 */ namespace Home\Common; // 微信处理类 set_time_limit(30); class Weixin{ //构造方法 static $qrcode_url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?"; static $token_url

  • 详解二维码生成工厂

    本次主要分享的是3个免费的二维码接口的对接代码和测试得出的注意点及区别,有更好处理方式多多交流,相互促进进步:最近在学习JavsScript的扩展TypeScript,感觉语法糖很甜,大部分与C#更为类似,可能都是微软项目的原因吧,有兴趣的朋友可以多多相互交流下: 以上是个人的看法,下面来正式分享今天的文章吧: Google的Api二维码生成接口 2d-code的Api二维码生成接口 topscan的Api二维码生成接口 使用面向对象+加载程序集创建对象合并以上接口封装成二维码生成工厂 下面一步

  • Python二维码生成库qrcode安装和使用示例

    二维码简称 QR Code(Quick Response Code),学名为快速响应矩阵码,是二维条码的一种,由日本的 Denso Wave公司于 1994 年发明.现随着智能手机的普及,已广泛应用于平常生活中,例如商品信息查询.社交好友互动.网络地址访问等等. 安装 Python 的二维码库 -- qrcode 由于生成 qrcode 图片需要依赖 Python 的图像库,所以需要先安装 Python 图像库 PIL(Python Imaging Library),不然会遇到 "ImportE

  • iOS 二维码生成及扫码详解及实例代码

    iOS二维码生成及扫码 现在越来越多的应用加入二维码相关的业务,在iOS开发市场上很多开发人员都在使用第三方的扫码与生成二维码的控件,个人认为此类的第三方控件识别度不高.最近正好整理新框架的事情,研究了一下.具体代码如下 生成二维码代码 /** * @author 半 饱, 15-12-18 * * @brief 生成二维码图片 * * @param code 生成二维码图片内容 * @param width 二维码图片宽度 * @param height 二维码图片高度 * * @return

  • 批处理制作二维码生成器

    这个程序不能直接支持 Unicode, 同样不能直接支持任何双字节或多字节字符(包括汉字), 但可以用十六进制转码的方式生成包含 Unicode (或其他任何编码)字符的二维码图形. 如果数据含有UTF-8 Unicode 字符时, 在数据头部加上 BOM (\xEF\xBB\xBF) 即可. 例如: \xEF\xBB\xBF\xE6\xB1\x89\xE5\xAD\x97 上面的代码表示中文字符 "汉字" 任何 ASCII 字符(\x00 到 \xFF)都可以用十六进制转码方式输入,

随机推荐