java 生成帶網路頭像的二維碼
阿新 • • 發佈:2018-12-08
最近做一個帶微信頭像的二維碼的功能,微信頭像是一個連結,所以先把微信頭像下載,臨時儲存,生成二維碼
/** * 檔案下載工具類 * * @author zhengxinghua */ public class DownFileUtils { /** * 下載連結圖片,臨時儲存 * @param urlStr 連結圖片地址 * @param savePath 要儲存的地址 * @return 檔案 * @throws IOException */ public static File downLoadFromUrl(String urlStr, String savePath) throws IOException { String fileName = System.currentTimeMillis() + ".jpg"; URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //設定超時間為3秒 conn.setConnectTimeout(3 * 1000); //防止遮蔽程式抓取而返回403錯誤 conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); //得到輸入流 InputStream inputStream = conn.getInputStream(); //獲取自己陣列 byte[] getData = readInputStream(inputStream); //檔案儲存位置 File saveDir = new File(savePath); if (!saveDir.exists()) { saveDir.mkdir(); } File file = new File(saveDir + File.separator + fileName); FileOutputStream fos = new FileOutputStream(file); fos.write(getData); if (fos != null) { fos.close(); } if (inputStream != null) { inputStream.close(); } return file; } /** * 從輸入流中獲取位元組陣列 * * @param inputStream 輸入流 * @return 位元組陣列 * @throws IOException */ public static byte[] readInputStream(InputStream inputStream) throws IOException { byte[] buffer = new byte[1024]; int len = 0; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while ((len = inputStream.read(buffer)) != -1) { bos.write(buffer, 0, len); } bos.close(); return bos.toByteArray(); } }
接下來是生成二維碼,用的一個開源工具類,超級好用,還得到開源大佬的指點,特別鳴謝 http://hutool.mydoc.io/#text_319501
package com.gcyh.common.utils; import cn.hutool.core.io.FileUtil; import cn.hutool.extra.qrcode.QrCodeUtil; import cn.hutool.extra.qrcode.QrConfig; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import javax.imageio.stream.ImageOutputStream; import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; /** *二維碼生成工具類 */ public class QrCodeUtils { /** * 生成檔案型別的帶頭像二維碼 * @param urlPath 頭像連結路徑 * @return 檔案型別 */ public static MultipartFile generate(String urlPath) { try { URL url = new URL(urlPath); URLConnection urlConnection = url.openConnection(); HttpURLConnection connection; if (urlConnection instanceof HttpURLConnection) { connection = (HttpURLConnection) urlConnection; } else { System.out.println("請輸入 URL 地址"); return null; } InputStream inputStream = connection.getInputStream(); Image read = ImageIO.read(inputStream); Image im = read; System.out.println(im); QrConfig config = new QrConfig(300, 300); config.setImg(im); config.setErrorCorrection(ErrorCorrectionLevel.M); BufferedImage generate = QrCodeUtil.generate("http://www.baidu.com/", config); ByteArrayOutputStream bs = new ByteArrayOutputStream(); ImageOutputStream imOut = ImageIO.createImageOutputStream(bs); ImageIO.write(generate, "jpg", imOut); InputStream is = new ByteArrayInputStream(bs.toByteArray()); MockMultipartFile file = new MockMultipartFile("123", is); return file; } catch (IOException e) { e.printStackTrace(); return null; } } /** * 測試 * 生成檔案型別後,再反向生成圖片,看有沒有問題 * @param args */ public static void main(String[] args) { try { URL url = new URL("http://file2.youboy.com/e/2014/8/29/81/252464s.jpg"); URLConnection urlConnection = url.openConnection(); HttpURLConnection connection; if (urlConnection instanceof HttpURLConnection) { connection = (HttpURLConnection) urlConnection; } else { System.out.println("請輸入 URL 地址"); return; } InputStream inputStream = connection.getInputStream(); Image read = ImageIO.read(inputStream); Image im = read; System.out.println(im); QrConfig config = new QrConfig(300, 300); config.setImg(im); config.setErrorCorrection(ErrorCorrectionLevel.M); BufferedImage generate = QrCodeUtil.generate("http://www.baidu.com/", config); ByteArrayOutputStream bs = new ByteArrayOutputStream(); ImageOutputStream imOut = ImageIO.createImageOutputStream(bs); ImageIO.write(generate, "jpg", imOut); InputStream is = new ByteArrayInputStream(bs.toByteArray()); MockMultipartFile file = new MockMultipartFile("123", is); InputStream fileInputStream = file.getInputStream(); FileUtil.writeFromStream(fileInputStream,FileUtil.file("d:/qrco33de.jpg")); } catch (IOException e) { e.printStackTrace(); } } }