Java利用Zxing生成与解析二维码

1、二维码的生成

http://www.cnblogs.com/jtmjx/archive/2012/06/18/2545209.html

1.1 将Zxing-core.jar 包加入到classpath下。

1.2 二维码的生成需要借助MatrixToImageWriter类,该类是由Google提供的,可以将该类拷贝到源码中,这里我将该类的源码贴上,可以直接使用。

import com.google.zxing.common.BitMatrix;

import javax.imageio.ImageIO;

import java.io.File;

import java.io.OutputStream;

import java.io.IOException;

import java.awt.image.BufferedImage;

public final class MatrixToImageWriter {

private static final int BLACK = 0xFF000000;

private static final int WHITE = 0xFFFFFFFF;

private MatrixToImageWriter() {}

public static 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;

}

public static void writeToFile(BitMatrix matrix, String format, File file)

throws IOException {

BufferedImage image = toBufferedImage(matrix);

if (!ImageIO.write(image, format, file)) {

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

}

}

public static void writeToStream(BitMatrix matrix, String format, OutputStream stream)

throws IOException {

BufferedImage image = toBufferedImage(matrix);

if (!ImageIO.write(image, format, stream)) {

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

}

}

}

1.3 编写生成二维码的实现代码

try {

String content = "120605181003;http://www.cnblogs.com/jtmjx";

String path = "C:/Users/Administrator/Desktop/testImage";

MultiFormatWriter multiFormatWriter = new MultiFormatWriter();

Map hints = new HashMap();

hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");

BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, 400, 400,hints);

File file1 = new File(path,"餐巾纸.jpg");

MatrixToImageWriter.writeToFile(bitMatrix, "jpg", file1);

} catch (Exception e) {

e.printStackTrace();

}

现在运行后即可生成一张二维码图片,是不是很简单啊? 接下来我们看看如何解析二维码

2、二维码的解析

2.1 将Zxing-core.jar 包加入到classpath下。

2.2 和生成一样,我们需要一个辅助类( BufferedImageLuminanceSource),同样该类Google也提供了,这里我同样将该类的源码贴出来,可以直接拷贝使用个,省去查找的麻烦

BufferedImageLuminanceSource

import com.google.zxing.LuminanceSource;

import java.awt.Graphics2D;

import java.awt.geom.AffineTransform;

import java.awt.image.BufferedImage;

public final class BufferedImageLuminanceSource extends LuminanceSource {

private final BufferedImage image;

private final int left;

private final int top;

public BufferedImageLuminanceSource(BufferedImage image) {

this(image, 0, 0, image.getWidth(), image.getHeight());

}

public BufferedImageLuminanceSource(BufferedImage image, int left, int top, int width, int height) {

super(width, height);

int sourceWidth = image.getWidth();

int sourceHeight = image.getHeight();

if (left + width > sourceWidth || top + height > sourceHeight) {

throw new IllegalArgumentException("Crop rectangle does not fit within image data.");

}

for (int y = top; y < top + height; y++) {

for (int x = left; x < left + width; x++) {

if ((image.getRGB(x, y) & 0xFF000000) == 0) {

image.setRGB(x, y, 0xFFFFFFFF); // = white

}

}

}

this.image = new BufferedImage(sourceWidth, sourceHeight, BufferedImage.TYPE_BYTE_GRAY);

this.image.getGraphics().drawImage(image, 0, 0, null);

this.left = left;

this.top = top;

}

@Override

public byte[] getRow(int y, byte[] row) {

if (y < 0 || y >= getHeight()) {

throw new IllegalArgumentException("Requested row is outside the image: " + y);

}

int width = getWidth();

if (row == null || row.length < width) {

row = new byte[width];

}

image.getRaster().getDataElements(left, top + y, width, 1, row);

return row;

}

@Override

public byte[] getMatrix() {

int width = getWidth();

int height = getHeight();

int area = width * height;

byte[] matrix = new byte[area];

image.getRaster().getDataElements(left, top, width, height, matrix);

return matrix;

}

@Override

public boolean isCropSupported() {

return true;

}

@Override

public LuminanceSource crop(int left, int top, int width, int height) {

return new BufferedImageLuminanceSource(image, this.left + left, this.top + top, width, height);

}

@Override

public boolean isRotateSupported() {

return true;

}

@Override

public LuminanceSource rotateCounterClockwise() {

int sourceWidth = image.getWidth();

int sourceHeight = image.getHeight();

AffineTransform transform = new AffineTransform(0.0, -1.0, 1.0, 0.0, 0.0, sourceWidth);

BufferedImage rotatedImage = new BufferedImage(sourceHeight, sourceWidth, BufferedImage.TYPE_BYTE_GRAY);

Graphics2D g = rotatedImage.createGraphics();

g.drawImage(image, transform, null);

g.dispose();

int width = getWidth();

return new BufferedImageLuminanceSource(rotatedImage, top, sourceWidth - (left + width), getHeight(), width);

}

}

2.3 编写解析二维码的实现代码

try {

MultiFormatReader formatReader = new MultiFormatReader();

String filePath = "C:/Users/Administrator/Desktop/testImage/test.jpg";

File file = new File(filePath);

BufferedImage image = ImageIO.read(file);;

LuminanceSource source = new BufferedImageLuminanceSource(image);

Binarizer  binarizer = new HybridBinarizer(source);

BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);

Map hints = new HashMap();

hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");

Result result = formatReader.decode(binaryBitmap,hints);

System.out.println("result = "+ result.toString());

System.out.println("resultFormat = "+ result.getBarcodeFormat());

System.out.println("resultText = "+ result.getText());

} catch (Exception e) {

e.printStackTrace();

}

www.cnblogs.com/jtmjx/archive/2012/06/18/2545209.html

http://www.cnblogs.com/jtmjx/archive/2012/06/18/2545209.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,719评论 0 33
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,351评论 0 17
  • 手势图片控件 PinchImageView 点击图片框架 photoView packagecom.example...
    Ztufu阅读 717评论 0 1
  • 2021期待与你一起共事,点击查看岗位[https://www.jianshu.com/p/6f4d67fa406...
    闲庭阅读 16,606评论 0 75
  • 感恩下雨,本来计划带大宝出去玩,改成了逛菜场。 感恩生活的便利,家附近就可以买到便宜又新鲜的青菜和水果。 感恩老公...
    米朵天天阅读 188评论 0 1