pom
<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.0</version>
</dependency>
代码
import com. google. zxing. * ;
import com. google. zxing. common. BitMatrix ;
import com. google. zxing. common. HybridBinarizer ;
import com. google. zxing. qrcode. decoder. ErrorCorrectionLevel ;
import org. junit. Test ;
import org. wltea. analyzer. core. IKSegmenter ;
import org. wltea. analyzer. core. Lexeme ; import javax. imageio. ImageIO ;
import java. awt. * ;
import java. awt. geom. AffineTransform ;
import java. awt. geom. RoundRectangle2D ;
import java. awt. image. BufferedImage ;
import java. io. File ;
import java. io. IOException ;
import java. io. OutputStream ;
import java. io. StringReader ;
import java. util. ArrayList ;
import java. util. Hashtable ;
import java. util. List ;
public class QRCodeUtil extends LuminanceSource { private final BufferedImage IMAGE ; private final int LEFT ; private final int TOP ; private static final String CHARSET = "utf-8" ; private static final String FORMAT_NAME = "JPG" ; private static final int QRCODE_SIZE = 300 ; private static final int WIDTH = 60 ; private static final int HEIGHT = 60 ; public QRCodeUtil ( BufferedImage image) { this ( image, 0 , 0 , image. getWidth ( ) , image. getHeight ( ) ) ; } public QRCodeUtil ( 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 ) ; } } } this . IMAGE = new BufferedImage ( sourceWidth, sourceHeight, BufferedImage . TYPE_BYTE_GRAY ) ; this . IMAGE . getGraphics ( ) . drawImage ( image, 0 , 0 , null ) ; this . LEFT = left; this . TOP = top; } 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; } 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; } public boolean isCropSupported ( ) { return true ; } public LuminanceSource crop ( int left, int top, int width, int height) { return new QRCodeUtil ( IMAGE , this . LEFT + left, this . TOP + top, width, height) ; } public boolean isRotateSupported ( ) { return true ; } 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 QRCodeUtil ( rotatedImage, TOP , sourceWidth - ( LEFT + width) , getHeight ( ) , width) ; } private static BufferedImage createImage ( String content, String imgPath, boolean needCompress) throws Exception { Hashtable hints = new Hashtable ( ) ; hints. put ( EncodeHintType . ERROR_CORRECTION , ErrorCorrectionLevel. H ) ; hints. put ( EncodeHintType . CHARACTER_SET , CHARSET ) ; hints. put ( EncodeHintType . MARGIN , 1 ) ; BitMatrix bitMatrix = new MultiFormatWriter ( ) . encode ( content, BarcodeFormat . QR_CODE , QRCODE_SIZE , QRCODE_SIZE , hints) ; int width = bitMatrix. getWidth ( ) ; int height = bitMatrix. 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, bitMatrix. get ( x, y) ? 0xFF000000 : 0xFFFFFFFF ) ; } } if ( imgPath == null || "" . equals ( imgPath) ) { return image; } QRCodeUtil . insertImage ( image, imgPath, needCompress) ; return image; } private static void insertImage ( BufferedImage source, String imgPath, boolean needCompress) throws Exception { File file = new File ( imgPath) ; if ( ! file. exists ( ) ) { System . err. println ( "" + imgPath + " 该文件不存在!" ) ; return ; } Image src = ImageIO . read ( new File ( imgPath) ) ; int width = src. getWidth ( null ) ; int height = src. getHeight ( null ) ; if ( needCompress) { if ( width > WIDTH ) { width = WIDTH ; } if ( height > HEIGHT ) { height = HEIGHT ; } Image image = src. getScaledInstance ( width, height, Image . SCALE_SMOOTH ) ; BufferedImage tag = new BufferedImage ( width, height, BufferedImage . TYPE_INT_RGB ) ; Graphics g = tag. getGraphics ( ) ; g. drawImage ( image, 0 , 0 , null ) ; g. dispose ( ) ; src = image; } Graphics2D graph = source. createGraphics ( ) ; int x = ( QRCODE_SIZE - width) / 2 ; int y = ( QRCODE_SIZE - height) / 2 ; graph. drawImage ( src, x, y, width, height, null ) ; Shape shape = new RoundRectangle2D. Float ( x, y, width, width, 6 , 6 ) ; graph. setStroke ( new BasicStroke ( 3f ) ) ; graph. draw ( shape) ; graph. dispose ( ) ; } public static void encode ( String content, String imgPath, String destPath, boolean needCompress) throws Exception { BufferedImage image = QRCodeUtil . createImage ( content, imgPath, needCompress) ; mkdirs ( destPath) ; ImageIO . write ( image, FORMAT_NAME , new File ( destPath) ) ; } public static BufferedImage encode ( String content, String imgPath, boolean needCompress) throws Exception { BufferedImage image = QRCodeUtil . createImage ( content, imgPath, needCompress) ; return image; } public static void mkdirs ( String destPath) { File file = new File ( destPath) ; if ( ! file. exists ( ) && ! file. isDirectory ( ) ) { file. mkdirs ( ) ; } } public static void encode ( String content, String imgPath, String destPath) throws Exception { QRCodeUtil . encode ( content, imgPath, destPath, false ) ; } public static void encode ( String content, String destPath) throws Exception { QRCodeUtil . encode ( content, null , destPath, false ) ; } public static void encode ( String content, String imgPath, OutputStream output, boolean needCompress) throws Exception { BufferedImage image = QRCodeUtil . createImage ( content, imgPath, needCompress) ; ImageIO . write ( image, FORMAT_NAME , output) ; } public static void encode ( String content, OutputStream output) throws Exception { QRCodeUtil . encode ( content, null , output, false ) ; } public static String decode ( File file) throws Exception { BufferedImage image; image = ImageIO . read ( file) ; if ( image == null ) { return null ; } QRCodeUtil source = new QRCodeUtil ( image) ; BinaryBitmap bitmap = new BinaryBitmap ( new HybridBinarizer ( source) ) ; Result result; Hashtable hints = new Hashtable ( ) ; hints. put ( DecodeHintType . CHARACTER_SET , CHARSET ) ; result = new MultiFormatReader ( ) . decode ( bitmap, hints) ; String resultStr = result. getText ( ) ; return resultStr; } public static String decode ( String path) throws Exception { return QRCodeUtil . decode ( new File ( path) ) ; } }
解析用例
QRCodeUtil . decode ( File file) 传入二维码图片文件对象
QRCodeUtil . decode ( String filePath) 传入二维码图片文件路径
生成二维码用例
encode ( String content, String imgPath, String destPath, boolean needCompress)
content: 需要写入二维码中的数据
imgPath: 二维码 中嵌入的图片路径 ( 就是 微信用户二维码中的头像 里面有你的头像的那种二维码)
destPath: 生成后的路径
needCompress: 是否需要压缩 true
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
encode ( String content, String destPath)
content: 需要写入二维码中的数据
destPath: 生成后的路径
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
encode ( String content, String imgPath, boolean needCompress)
返回BufferedImage 对象
content: 需要写入二维码中的数据
imgPath: 二维码 中嵌入的图片路径 ( 就是 微信用户二维码中的头像 里面有你的头像的那种二维码)
needCompress: 是否需要压缩 true
返回的BufferedImage 对象并没有将图片写入磁盘 我们可以调用下面的方法 写入磁盘
ImageIO . write ( image, FORMAT_NAME , new File ( destPath) ) ;
image: BufferedImage 对象
FORMAT_NAME : 图片扩展名 JPG
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - public static void main ( String [ ] args) throws Exception { String content = "孙张熠!!" ;
String imgPath = "C:\\Users\\Administrator\\Desktop\\image\\20180923010802416.jpg" ;
String destPath = "D:\\hello.jpg" ;
ImageIO . write ( QRCodeUtil . encode ( content, imgPath, true ) , "jpg" , new File ( destPath) ) ; }