二维码(带有图片)的生成
![](https://images2015.cnblogs.com/blog/988767/201607/988767-20160707151121842-1788091298.png)
/*************编码转换类【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};\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 }