1. 程式人生 > >二維碼(帶有圖片)的生成

二維碼(帶有圖片)的生成

fault odin mod 5% src 要求 domu 解讀 bytearray

技術分享

技術分享


/*************編碼轉換類【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 }
技術分享

二維碼(帶有圖片)的生成