二维码(带有图片)的生成
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⼆维码(带有图⽚)的⽣成/*************编码转换类【1】***********************/
package cn.gp.tools.ErWCodeUtils;
import java.io.UnsupportedEncodingException;
/**
* 作⽤:编码转换
* @author⼩风微灵
*
*/
public class encodingFunction {
public static String getMethodEncoding(String input){
try {
String result=new String(input.getBytes("iso-8859-1"),"utf-8");
return result;
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}
}
}
/***********************⼆维码图⽚实现类【2】************************************/
package cn.gp.tools.ErWCodeUtils;
import java.awt.image.BufferedImage;
import jp.sourceforge.qrcode.data.QRCodeImage;
public class TwoDimensionCodeImage implements QRCodeImage {
BufferedImage bufImg;
public TwoDimensionCodeImage(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();
}
}
/*******************⽣成带有图⽚⼆维码的类【3】************************************/
1package cn.gp.tools.ErWCodeUtils;
2
3import java.awt.Color;
4import java.awt.Graphics2D;
5import java.awt.Image;
6import java.awt.image.BufferedImage;
7import java.io.ByteArrayInputStream;
8import java.io.File;
9import java.io.IOException;
10import java.io.InputStream;
11import java.io.UnsupportedEncodingException;
12import java.util.UUID;
13
14import javax.imageio.ImageIO;
15
16import jp.sourceforge.qrcode.QRCodeDecoder;
17import jp.sourceforge.qrcode.exception.DecodingFailedException;
18import jp.sourceforge.qrcode.geom.Point;
19import cn.gp.tools.ImageUtil;
20
21import com.swetake.util.Qrcode;
22
23public class QRCodeAction {
24
25
26
27
28/***************************成员变量-属性****************************************/
29private static int DEFAULT_WIDTH;
30private static int UNIT_WIDTH = 12;
31//输⼊流
32private ByteArrayInputStream inputStream;
33public ByteArrayInputStream getInputStream() {
34return inputStream;
35 }
36public void setInputStream(ByteArrayInputStream inputStream) {
37this.inputStream = inputStream;
38 }
39
40/***************************重写⽗类⽅法****************************************/
41
42
43/***************************⽅法****************************************/
44/**
45 * ⽣成⼆维码(QRCode)图⽚的公共⽅法
46 * @param content 存储内容
47 * @param imgType 图⽚类型
48 * @param size ⼆维码尺⼨
49 * @return
50*/
51public static BufferedImage qRCodeCommon(String content, String imgType, int size) {
52
53 BufferedImage bufImg = null;
54
55try {
56//⼆维码⽣成类
57 Qrcode qrcodeHandler = new Qrcode();
58// 设置⼆维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越⾼可存储的信息越少,但对⼆维码清晰度的要求越⼩
59 qrcodeHandler.setQrcodeErrorCorrect('M');
60 qrcodeHandler.setQrcodeEncodeMode('B');//AlphaNumeric(0.2),Numeric(0/1/2),Byte(中英⽂)
61
62// 设置设置⼆维码尺⼨,取值范围1-40,值越⼤尺⼨越⼤,可存储的信息越⼤
63 qrcodeHandler.setQrcodeVersion(size);
64// 获得内容的字节数组,设置编码格式
65byte[] contentBytes = content.getBytes("utf-8");
66boolean[][] bRect = qrcodeHandler.calQrcode(contentBytes);
67// 图⽚尺⼨
68 DEFAULT_WIDTH = (int) (bRect.length * UNIT_WIDTH+8*Math.sqrt(2));
69//图⽚的w,h
70 bufImg = new BufferedImage(DEFAULT_WIDTH, DEFAULT_WIDTH,
71 BufferedImage.TYPE_INT_RGB);
72
73//画笔⼯具
74 Graphics2D gs = bufImg.createGraphics();
75
76// 设置背景颜⾊
77 gs.setBackground(Color.white);
78 gs.clearRect(0, 0,DEFAULT_WIDTH+10,DEFAULT_WIDTH+10);
79//背景区域的图⽚
80// Image image=ImageUtil.getImageIcon("aaa.jpg").getImage();
81// gs.drawImage(image, 0, 0, null);
82// 设定图像颜⾊:前景⾊
83 gs.setColor(Color.black);
84// 设置偏移量,不设置可能导致解析出错
85int pixoff = 4;
86// 输出内容> ⼆维码
87if (contentBytes.length > 0 && contentBytes.length < 1800) {
88for (int i = 0; i < bRect.length; i++) {
89for (int j = 0; j < bRect.length; j++) {
90if (bRect[j][i]) {
91 gs.fillRect(j * UNIT_WIDTH + pixoff,
92 i * UNIT_WIDTH+ pixoff,
93 12, 12);
94// gs.drawRect(j * UNIT_WIDTH + pixoff,
95// i * UNIT_WIDTH+ pixoff,
96// 6, 6);
97 }
98 }
99 }
100//中⼼区域的图⽚
101 Image image2=ImageUtil.getImageIcon("123.jpg").getImage();
102//外边框
103 gs.setColor(Color.white);
104 gs.fillRect(DEFAULT_WIDTH/8*3-3, DEFAULT_WIDTH/8*3-3,
105 (int)(DEFAULT_WIDTH/4+3*Math.sqrt(3)),
106 (int)(DEFAULT_WIDTH/4+3*Math.sqrt(3))+4);
107//内部背景区域
108 gs.setColor(Color.white);
109 gs.fillRect(DEFAULT_WIDTH/8*3, DEFAULT_WIDTH/8*3,
110 DEFAULT_WIDTH/4,DEFAULT_WIDTH/4+4);
111//画出中⼼图⽚
112 gs.drawImage(image2,
113 DEFAULT_WIDTH/8*3+3, DEFAULT_WIDTH/8*3+5,
114 DEFAULT_WIDTH/4-6,DEFAULT_WIDTH/4-6,
115null);
116
117 } else {
118throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 1800]."); 119
120 }
121 gs.dispose();
122 bufImg.flush();
123 } catch (UnsupportedEncodingException e) {
124 e.printStackTrace();
125 } catch (Exception e) {
126// TODO Auto-generated catch block
127 e.printStackTrace();
128 }
129return bufImg;
130 }
131
132
133
134/**
135 * 解析⼆维码(QRCode)
136 * @param imgPath 图⽚路径
137 * @return
138*/
139public static String decoderQRCode(String imgPath) {
140// QRCode ⼆维码图⽚的⽂件
141 File imageFile = new File(imgPath);
142 BufferedImage bufImg = null;
143 String content = null;
144try {
145 bufImg = ImageIO.read(imageFile);
146 QRCodeDecoder decoder = new QRCodeDecoder();
147 content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8");
148 } catch (IOException e) {
149 System.out.println("Error: " + e.getMessage());
150 e.printStackTrace();
151 } catch (DecodingFailedException dfe) {
152 System.out.println("Error: " + dfe.getMessage());
153 dfe.printStackTrace();
154 }
155return content;
156 }
157
158/**
159 * 解析⼆维码(QRCode)
160 * @param input 输⼊流
161 * @return
162*/
163public static String decoderQRCode(InputStream input) {
164 BufferedImage bufImg = null;
165 String content = null;
166try {
167 bufImg = ImageIO.read(input);
168 QRCodeDecoder decoder = new QRCodeDecoder();
169 content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8");
170 } catch (IOException e) {
171 System.out.println("Error: " + e.getMessage());
172 e.printStackTrace();
173 } catch (DecodingFailedException dfe) {
174 System.out.println("Error: " + dfe.getMessage());
175 dfe.printStackTrace();
176 }
177return content;
178 }
179
180/**
181 * 产⽣⼆维码图⽚:
182 * @param infos ⼆维码信息
183 * @return返回产⽣的图⽚路径
184*/
185public static String getErWCode(String infos){
186 String imagePath="";
187try {
188 BufferedImage image = qRCodeCommon(infos, "JPEG",5);
189 String path=QRCodeAction.getProgramPath();
190 imagePath=path+UUID.randomUUID()+".jpg";
191 File file = new File(imagePath);
192 ImageIO.write(image, "jpg", file);
193if(file.exists()){
194 System.err.println("新产⽣⼀张⼆维码图⽚");
195 }
196 } catch (IOException e) {
197 e.printStackTrace();
198 }
199return imagePath;
200 }
201public static Image getErWCodeImage(String infos){
202
203
204 BufferedImage image = qRCodeCommon(infos, "JPEG",10);
205 String path=QRCodeAction.getProgramPath();
206
207 Image image2=(Image)image;
208
209return null;
210 }
211/**
212 * 获取项⽬运⾏根路径
213 * @return
214*/
215public static String getProgramPath(){
216//获得项⽬运⾏路径下的图⽚⽂件夹
217 String path=QRCodeAction.class.getClassLoader().getResource("./images/ErWCodes/").getPath(); 218return path;
219 }
220/**
221 * 程序测试⼊⼝
222 * @param args
223*/
224public static void main(String[] args) {
225
226//⽣成⼆维码
227// StringBuffer msg=new StringBuffer();
228// msg.append("int[] arr=new int[]{8,2,1,0,3};\r\n");
229// msg.append("int[] index=new int[]{2,0,3,2,4,0,1,3,2,3,3};\r\n");
230// msg.append("String tel=\"\";\r\n");
231// msg.append("for (int i : index) {\r\n");
232// msg.append("tel+=arr[i];\r\n");
233// msg.append("}\r\n");
234// msg.append("System.out.println(\"联系⽅式:\"+tel);\r\n");
235// System.err.println(msg.toString());
236 QRCodeAction d=new QRCodeAction();
237 String path=d.getErWCode("我不是体育系的要不要我这系啊带你们呦!");
238//解读⼆维码
239// String infos= d.decoderQRCode(path);
240//System.err.println("解析⼆维码信息:"+infos);
241 }
242
243 }。