JAVA生成解析二维码详解编程语言

 
package com.mohe.twocode; 
import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import javax.imageio.ImageIO; 
import jp.sourceforge.qrcode.QRCodeDecoder; 
import jp.sourceforge.qrcode.data.QRCodeImage; 
import jp.sourceforge.qrcode.exception.DecodingFailedException; 
import com.swetake.util.Qrcode; 
public class TwoDimensionCode implements QRCodeImage { 
private BufferedImage bufImg = null; 
public TwoDimensionCode() { 
} 
public TwoDimensionCode(BufferedImage bufImg) { 
this.bufImg = bufImg; 
} 
@Override 
public int getHeight() { 
return bufImg.getHeight(); 
} 
@Override 
public int getPixel(int x, int y) { 
return bufImg.getRGB(x, y); 
} 
@Override 
public int getWidth() { 
return bufImg.getWidth(); 
} 
/** 
* 生成二维码(QRCode)图片 
*  
* @param content 
*            存储内容 
* @param imgPath 
*            图片路径 
*/ 
public void encoderQRCode(String content, String imgPath) { 
this.encoderQRCode(content, imgPath, "png", 7); 
} 
/** 
* 生成二维码(QRCode)图片 
*  
* @param content 
*            存储内容 
* @param output 
*            输出流 
*/ 
public void encoderQRCode(String content, OutputStream output) { 
this.encoderQRCode(content, output, "png", 7); 
} 
/** 
* 生成二维码(QRCode)图片 
*  
* @param content 
*            存储内容 
* @param imgPath 
*            图片路径 
* @param imgType 
*            图片类型 
*/ 
public void encoderQRCode(String content, String imgPath, String imgType) { 
this.encoderQRCode(content, imgPath, imgType, 7); 
} 
/** 
* 生成二维码(QRCode)图片 
*  
* @param content 
*            存储内容 
* @param output 
*            输出流 
* @param imgType 
*            图片类型 
*/ 
public void encoderQRCode(String content, OutputStream output, String imgType) { 
this.encoderQRCode(content, output, imgType, 7); 
} 
/** 
* 生成二维码(QRCode)图片 
*  
* @param content 
*            存储内容 
* @param imgPath 
*            图片路径 
* @param imgType 
*            图片类型 
* @param size 
*            二维码尺寸 
*/ 
public void encoderQRCode(String content, String imgPath, String imgType, int size) { 
try { 
BufferedImage bufImg = this.qRCodeCommon(content, imgType, size); 
File imgFile = new File(imgPath); 
if (!imgFile.exists()) { 
imgFile.mkdirs(); 
} 
// 生成二维码QRCode图片 
ImageIO.write(bufImg, imgType, imgFile); 
} catch (Exception e) { 
e.printStackTrace(); 
} 
} 
/** 
* 生成二维码(QRCode)图片 
*  
* @param content 
*            存储内容 
* @param output 
*            输出流 
* @param imgType 
*            图片类型 
* @param size 
*            二维码尺寸 
*/ 
public void encoderQRCode(String content, OutputStream output, String imgType, int size) { 
try { 
BufferedImage bufImg = this.qRCodeCommon(content, imgType, size); 
// 生成二维码QRCode图片 
ImageIO.write(bufImg, imgType, output); 
} catch (Exception e) { 
e.printStackTrace(); 
} 
} 
/** 
* 生成二维码(QRCode)图片的公共方法 
*  
* @param content 
*            存储内容 
* @param imgType 
*            图片类型 
* @param size 
*            二维码尺寸 
* @return 
*/ 
private BufferedImage qRCodeCommon(String content, String imgType, int size) { 
BufferedImage bufImg = null; 
try { 
Qrcode qrcodeHandler = new Qrcode(); 
// 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小 
qrcodeHandler.setQrcodeErrorCorrect('M'); 
qrcodeHandler.setQrcodeEncodeMode('B'); 
// 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大 
qrcodeHandler.setQrcodeVersion(size); 
// 获得内容的字节数组,设置编码格式 
byte[] contentBytes = content.getBytes("utf-8"); 
// 图片尺寸 
int imgSize = 67 + 12 * (size - 1); 
bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB); 
Graphics2D gs = bufImg.createGraphics(); 
// 设置背景颜色 
gs.setBackground(Color.WHITE); 
gs.clearRect(0, 0, imgSize, imgSize); 
// 设定图像颜色> BLACK 
gs.setColor(Color.BLACK); 
// 设置偏移量,不设置可能导致解析出错 
int pixoff = 2; 
// 输出内容> 二维码 
if (contentBytes.length > 0 && contentBytes.length < 800) { 
boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes); 
for (int i = 0; i < codeOut.length; i++) { 
for (int j = 0; j < codeOut.length; j++) { 
if (codeOut[j][i]) { 
gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3); 
} 
} 
} 
} else { 
throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800]."); 
} 
gs.dispose(); 
bufImg.flush(); 
} catch (Exception e) { 
e.printStackTrace(); 
} 
return bufImg; 
} 
/** 
* 解析二维码(QRCode) 
*  
* @param imgPath 
*            图片路径 
* @return 
*/ 
public String decoderQRCode(String imgPath) { 
// QRCode 二维码图片的文件 
File imageFile = new File(imgPath); 
BufferedImage bufImg = null; 
String content = null; 
try { 
bufImg = ImageIO.read(imageFile); 
QRCodeDecoder decoder = new QRCodeDecoder(); 
content = new String(decoder.decode(new TwoDimensionCode(bufImg)), "utf-8"); 
} catch (IOException e) { 
System.out.println("Error: " + e.getMessage()); 
e.printStackTrace(); 
} catch (DecodingFailedException dfe) { 
System.out.println("Error: " + dfe.getMessage()); 
dfe.printStackTrace(); 
} 
return content; 
} 
/** 
* 解析二维码(QRCode) 
*  
* @param input 
*            输入流 
* @return 
*/ 
public String decoderQRCode(InputStream input) { 
BufferedImage bufImg = null; 
String content = null; 
try { 
bufImg = ImageIO.read(input); 
QRCodeDecoder decoder = new QRCodeDecoder(); 
content = new String(decoder.decode(new TwoDimensionCode(bufImg)), "utf-8"); 
} catch (IOException e) { 
System.out.println("Error: " + e.getMessage()); 
e.printStackTrace(); 
} catch (DecodingFailedException dfe) { 
System.out.println("Error: " + dfe.getMessage()); 
dfe.printStackTrace(); 
} 
return content; 
} 
/** 
* 生成二维码 
*  
* @param filePath 
* @return 
*/ 
public static void encoder(String filePath, String deskCode) { 
String imgPath = filePath + deskCode + ".png"; 
TwoDimensionCode handler = new TwoDimensionCode(); 
handler.encoderQRCode(deskCode, imgPath, "png"); 
} 
/** 
* 解析二维码 
*  
* @param filePath 
* @return 
*/ 
public static String decoder(String filePath, int deskType, String deskCode) { 
String imgPath = filePath + deskCode + ".png"; 
TwoDimensionCode handler = new TwoDimensionCode(); 
return handler.decoderQRCode(imgPath); 
} 
/** 
* 生成中间带LOG二维码(QRCode)图片 
*  
* @param content 
*            二维码图片的内容 
* @param imgPath 
*            生成二维码图片完整的路径 
* @param ccbpath 
*            二维码图片中间的logo路径 
*/ 
public static int createQRCode(String content, String imgPath, String ccbPath) { 
try { 
Qrcode qrcodeHandler = new Qrcode(); 
qrcodeHandler.setQrcodeErrorCorrect('M'); 
qrcodeHandler.setQrcodeEncodeMode('B'); 
qrcodeHandler.setQrcodeVersion(7); 
// System.out.println(content); 
byte[] contentBytes = content.getBytes("utf-8"); 
BufferedImage bufImg = new BufferedImage(140, 140, BufferedImage.TYPE_INT_RGB); 
Graphics2D gs = bufImg.createGraphics(); 
gs.setBackground(Color.WHITE); 
gs.clearRect(0, 0, 140, 140); 
// 设定图像颜色 > BLACK 
// gs.setColor(new Color(255, 200, 0)); 
gs.setColor(Color.BLACK); 
// 设置偏移量 不设置可能导致解析出错 
int pixoff = 2; 
// 输出内容 > 二维码 
if (contentBytes.length > 0 && contentBytes.length < 120) { 
boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes); 
for (int i = 0; i < codeOut.length; i++) { 
for (int j = 0; j < codeOut.length; j++) { 
if (codeOut[j][i]) { 
gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3); 
} 
} 
} 
} else { 
System.err.println("QRCode content bytes length = " + contentBytes.length + " not in [ 0,120 ]. "); 
return -1; 
} 
// Image img = ImageIO.read(new File(ccbPath));// 实例化一个Image对象。 
// gs.drawImage(img, 47, 54, null); 
// gs.setColor(Color.BLUE); 
// gs.setFont(new Font("微软雅黑", Font.BOLD, 18)); 
// gs.drawString("交享越", 50, 70); 
// gs.dispose(); 
bufImg.flush(); 
// 生成二维码QRCode图片 
File imgFile = new File(imgPath); 
ImageIO.write(bufImg, "png", imgFile); 
} catch (Exception e) { 
e.printStackTrace(); 
return -100; 
} 
return 0; 
} 
public static void main(String[] args) { 
// String imgPath = "F:/TDDOWNLOAD/Michael_QRCode.png"; 
// String encoderContent = "123131"; 
// TwoDimensionCode handler = new TwoDimensionCode(); 
// handler.encoderQRCode(encoderContent, imgPath, "png"); 
// // try { 
// // OutputStream output = new FileOutputStream(imgPath); 
// // handler.encoderQRCode(content, output); 
// // } catch (Exception e) { 
// // e.printStackTrace(); 
// // } 
// System.out.println("========encoder success"); 
// 
// String decoderContent = handler.decoderQRCode(imgPath); 
// System.out.println("解析结果如下:"); 
// System.out.println(decoderContent); 
// System.out.println("========decoder success!!!"); 
// TwoDimensionCode 
// .createQRCode( 
// "http://jxy.misuland.com//jxy_manager//downLoadAction!downLoad.action?path=jxy_android.apk", 
// "F://jxy_android.png", 
// "C://Documents and Settings//Administrator//My Documents//My Pictures//image//white.jpg"); 
TwoDimensionCode.createQRCode("http://localhost:8080//jxy_manager//downLoadAction!downLoad.action?path=jxy_android.apk", "F://jxy_android.png", "C://Documents and Settings//Administrator//My Documents//My Pictures//image//white.jpg"); 
TwoDimensionCode.createQRCode("http://localhost:8080//jxy_manager//downLoadAction!downLoad.action?path=jxy_ios.apk", "F://jxy_ios.png", "C://Documents and Settings//Administrator//My Documents//My Pictures//image//white.jpg"); 
} 
} 
所需jar包可以在这个地址下载http://download.csdn.net/detail/daixinmei/5974269 

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/10608.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论