源码如下:
private static final int IMG_WIDTH = 160; private static final int IMG_HEIGHT = 160; private static final String IMG_FORMAT = "JPEG"; /** * 生成二维码 * @param filepath 图标输出路径 * @param logoPath logo图片全路径 * @param content 二维码内容 * @return 文件名 */ public static String genQrCode(String filepath, String logoPath, String content, int cutWidth) throws Exception { File file = new File(filepath); if (!file.exists()) { file.mkdirs(); } if (!filepath.endsWith("/") && !filepath.endsWith("\\")) { filepath += File.separator; } String filename = "qrcode_tmp.jpeg"; String tmpFilePath = filepath + filename; //生成二维码图片 Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>(); hints.put(EncodeHintType.CHARACTER_SET, "GBK"); hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); MultiFormatWriter writer = new MultiFormatWriter(); BitMatrix matrix = writer.encode(content, BarcodeFormat.QR_CODE, IMG_WIDTH, IMG_HEIGHT, hints); FileOutputStream fos = null; try{ fos = new FileOutputStream(new File(tmpFilePath)); MatrixToImageWriter.writeToStream(matrix, IMG_FORMAT, fos); fos.flush(); }finally{ if(fos != null){ fos.close(); } } //裁剪二维码图片 String destFileName = "qrcode.jpeg"; String destFilepath = filepath + destFileName; cut(tmpFilePath, destFilepath, logoPath, cutWidth, cutWidth, IMG_WIDTH-cutWidth*2, IMG_HEIGHT-cutWidth*2); return destFileName; } /** * 切割图片 * @param sourPath 原图片全路径 * @param destPath 目标图片全路径 * @param logoPath logo图片全路径 * @param x x坐标 * @param y y坐标 * @param width 宽度 * @param height 高度 */ private static void cut(String sourPath, String destPath, String logoPath, int x, int y, int width, int height) throws IOException { FileInputStream is = null; ImageInputStream iis = null; try { is = new FileInputStream(sourPath); iis = ImageIO.createImageInputStream(is); Iterator<ImageReader> it = ImageIO.getImageReadersByFormatName(IMG_FORMAT); ImageReader reader = it.next(); reader.setInput(iis, true); ImageReadParam param = reader.getDefaultReadParam(); param.setSourceRegion(new Rectangle(x, y, width, height)); BufferedImage bi = reader.read(0, param); if(StringUtils.isNotEmpty(logoPath)){ BufferedImage logoImg = ImageIO.read(new File(logoPath)); createQRCodeBitmap(bi, logoImg, destPath); }else{ ImageIO.write(bi, IMG_FORMAT, new File(destPath)); } } finally { if (is != null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } if (iis != null){ try { iis.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * 为二维码图片添加logo图片 * @param qrcodeImg 二维码图片 * @param logoImg logo图片 * @param destFilePath 目标图片路径 */ private static void createQRCodeBitmap(BufferedImage qrcodeImg, BufferedImage logoImg, String destFilePath) throws IOException { BufferedImage image = new BufferedImage(qrcodeImg.getWidth(), qrcodeImg.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D g = (Graphics2D)image.getGraphics(); //画二维码图片 g.drawImage(qrcodeImg, 0, 0, null); int x = (qrcodeImg.getWidth() - logoImg.getWidth()) / 2; int y = (qrcodeImg.getHeight() - logoImg.getHeight()) / 2; //在中间画logo图片 g.drawImage(logoImg, x, y, null); //生成目标图片 ImageIO.write(image, IMG_FORMAT, new File(destFilePath)); } public static void main(String[] args) { try { String content = "http://www.163.com"; String filename = genQrCode("D:\\", "D:\\logo.jpg", content, 25); System.out.println(filename); } catch (Exception e) { e.printStackTrace(); } }