java生成二維碼有很多開發(fā)的jar包如zxing是谷歌開發(fā)的,這里的話我使用zxing的開發(fā)包來實現(xiàn)的。我們在很多項目中需要動態(tài)生成二維碼,來提供給用戶,這樣讓更多人能夠很好的通過二維碼來體驗自己的應用。
下面貼出代碼,已經(jīng)測試通過,大家可以直接復制代碼使用:
最后實現(xiàn)結果:
java生成二維碼
代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
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); // 二維矩陣轉(zhuǎn)為一維像素數(shù)組 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++) { // 左上角顏色,根據(jù)自己需要調(diào)整顏色范圍和顏色 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 { // 依次為內(nèi)容(不支持中文),寬,長,中間圖標路徑,儲存路徑 MatrixToImageWriter.encode( "http://www.baidu.com/" , 512 , 512 , "D:\\logo.png" , "D:\\2013-01.jpg" ); } } |
以上就是本文的全部內(nèi)容,幫助大家設計屬于自己的二維碼。