/*************编码转换类【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】************************************/
1 package cn.gp.tools.ErWCodeUtils;
2
3 import java.awt.Color;
4 import java.awt.Graphics2D;
5 import java.awt.Image;
6 import java.awt.image.BufferedImage;
7 import java.io.ByteArrayInputStream;
8 import java.io.File;
9 import java.io.IOException;
10 import java.io.InputStream;
11 import java.io.UnsupportedEncodingException;
12 import java.util.UUID;
13
14 import javax.imageio.ImageIO;
15
16 import jp.sourceforge.qrcode.QRCodeDecoder;
17 import jp.sourceforge.qrcode.exception.DecodingFailedException;
18 import jp.sourceforge.qrcode.geom.Point;
19 import cn.gp.tools.ImageUtil;
20
21 import com.swetake.util.Qrcode;
22
23 public class QRCodeAction {
24
25
26
27
28 /***************************成员变量-属性****************************************/
29 private static int DEFAULT_WIDTH;
30 private static int UNIT_WIDTH = 12;
31 //输入流
32 private ByteArrayInputStream inputStream;
33 public ByteArrayInputStream getInputStream() {
34 return inputStream;
35 }
36 public void setInputStream(ByteArrayInputStream inputStream) {
37 this.inputStream = inputStream;
38 }
39
40 /***************************重写父类方法****************************************/
41
42
43 /***************************方法****************************************/
44 /**
45 * 生成二维码(QRCode)图片的公共方法
46 * @param content 存储内容
47 * @param imgType 图片类型
48 * @param size 二维码尺寸
49 * @return
50 */
51 public static BufferedImage qRCodeCommon(String content, String imgType, int size) {
52
53 BufferedImage bufImg = null;
54
55 try {
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 // 获得内容的字节数组,设置编码格式
65 byte[] contentBytes = content.getBytes("utf-8");
66 boolean[][] 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 // 设置偏移量,不设置可能导致解析出错
85 int pixoff = 4;
86 // 输出内容> 二维码
87 if (contentBytes.length > 0 && contentBytes.length < 1800) {
88 for (int i = 0; i < bRect.length; i++) {
89 for (int j = 0; j < bRect.length; j++) {
90 if (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,
115 null);
116
117 } else {
118 throw 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 }
129 return bufImg;
130 }
131
132
133
134 /**
135 * 解析二维码(QRCode)
136 * @param imgPath 图片路径
137 * @return
138 */
139 public static String decoderQRCode(String imgPath) {
140 // QRCode 二维码图片的文件
141 File imageFile = new File(imgPath);
142 BufferedImage bufImg = null;
143 String content = null;
144 try {
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 }
155 return content;
156 }
157
158 /**
159 * 解析二维码(QRCode)
160 * @param input 输入流
161 * @return
162 */
163 public static String decoderQRCode(InputStream input) {
164 BufferedImage bufImg = null;
165 String content = null;
166 try {
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 }
177 return content;
178 }
179
180 /**
181 * 产生二维码图片:
182 * @param infos 二维码信息
183 * @return 返回产生的图片路径
184 */
185 public static String getErWCode(String infos){
186 String imagePath="";
187 try {
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);
193 if(file.exists()){
194 System.err.println("新产生一张二维码图片");
195 }
196 } catch (IOException e) {
197 e.printStackTrace();
198 }
199 return imagePath;
200 }
201 public 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
209 return null;
210 }
211 /**
212 * 获取项目运行根路径
213 * @return
214 */
215 public static String getProgramPath(){
216 //获得项目运行路径下的图片文件夹
217 String path=QRCodeAction.class.getClassLoader().getResource("./images/ErWCodes/").getPath();
218 return path;
219 }
220 /**
221 * 程序测试入口
222 * @param args
223 */
224 public static void main(String[] args) {
225
226 //生成二维码
227 // StringBuffer msg=new StringBuffer();
228 // msg.append("int[] arr=new int[]{8,2,1,0,3};
");
229 // msg.append("int[] index=new int[]{2,0,3,2,4,0,1,3,2,3,3};
");
230 // msg.append("String tel="";
");
231 // msg.append("for (int i : index) {
");
232 // msg.append("tel+=arr[i];
");
233 // msg.append("}
");
234 // msg.append("System.out.println("联系方式:"+tel);
");
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 }