????import java.awt.Color; 
????import java.awt.Graphics2D; 
????import java.awt.Image; 
????import java.awt.geom.AffineTransform; 
????import java.awt.image.AffineTransformOp; 
????import java.awt.image.BufferedImage; 
????import java.io.File; 
????import java.io.IOException; 
????import java.util.HashMap; 
????import java.util.Map; 
????import javax.imageio.ImageIO; 
????import com.google.zxing.BarcodeFormat; 
????import com.google.zxing.EncodeHintType; 
????import com.google.zxing.MultiFormatWriter; 
????import com.google.zxing.WriterException; 
????import com.google.zxing.common.BitMatrix; 
????import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; 
????public class QREncodeWithPic { 
????// ????????? 
????private static final int IMAGE_WIDTH = 80; 
????private static final int IMAGE_HEIGHT = 80; 
????private static final int IMAGE_HALF_WIDTH = IMAGE_WIDTH / 2; 
????private static final int FRAME_WIDTH = 2; 
????// ?????д???? 
????private static MultiFormatWriter mutiWriter = new MultiFormatWriter(); 
????public static void encode(String content?? int width?? int height?? 
????String srcImagePath?? String destImagePath) { 
????try { 
????ImageIO.write(genBarcode(content?? width?? height?? srcImagePath)?? 
????"jpg"?? new File(destImagePath)); 
????} catch (IOException e) { 
????e.printStackTrace(); 
????} catch (WriterException e) { 
????e.printStackTrace(); 
????} 
????} 
????private static BufferedImage genBarcode(String content?? int width?? 
????int height?? String srcImagePath) throws WriterException?? 
????IOException { 
????// ??????? 
????BufferedImage scaleImage = scale(srcImagePath?? IMAGE_WIDTH?? 
????IMAGE_HEIGHT?? true); 
????int[][] srcPixels = new int[IMAGE_WIDTH][IMAGE_HEIGHT]; 
????for (int i = 0; i < scaleImage.getWidth(); i++) { 
????for (int j = 0; j < scaleImage.getHeight(); j++) { 
????srcPixels[i][j] = scaleImage.getRGB(i?? j); 
????} 
????} 
????Map<EncodeHintType?? Object> hint = new HashMap<EncodeHintType?? Object>(); 
????hint.put(EncodeHintType.CHARACTER_SET?? "utf-8"); 
????hint.put(EncodeHintType.ERROR_CORRECTION?? ErrorCorrectionLevel.H); 
????// ???????? 
????BitMatrix matrix = mutiWriter.encode(content?? BarcodeFormat.QR_CODE?? 
????width?? height?? hint); 
????// ??????????????????? 
????int halfW = matrix.getWidth() / 2; 
????int halfH = matrix.getHeight() / 2; 
????int[] pixels = new int[width * height]; 
????for (int y = 0; y < matrix.getHeight(); y++) { 
????for (int x = 0; x < matrix.getWidth(); x++) { 
????// ????? 
????if (x > halfW - IMAGE_HALF_WIDTH 
????&& x < halfW + IMAGE_HALF_WIDTH 
????&& y > halfH - IMAGE_HALF_WIDTH 
????&& y < halfH + IMAGE_HALF_WIDTH) { 
????pixels[y * width + x] = srcPixels[x - halfW 
????+ IMAGE_HALF_WIDTH][y - halfH + IMAGE_HALF_WIDTH]; 
????}  
????// ?????????γ??? 
????else if ((x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH 
????&& x < halfW - IMAGE_HALF_WIDTH + FRAME_WIDTH 
????&& y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH 
????+ IMAGE_HALF_WIDTH + FRAME_WIDTH) 
????|| (x > halfW + IMAGE_HALF_WIDTH - FRAME_WIDTH 
????&& x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH 
????&& y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH 
????+ IMAGE_HALF_WIDTH + FRAME_WIDTH) 
????|| (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH 
????&& x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH 
????&& y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH 
????- IMAGE_HALF_WIDTH + FRAME_WIDTH) 
????|| (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH 
????&& x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH 
????&& y > halfH + IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH 
????+ IMAGE_HALF_WIDTH + FRAME_WIDTH)) { 
????pixels[y * width + x] = 0xfffffff; 
????} else { 
????// ????????????????????????????????????????????? 
????pixels[y * width + x] = matrix.get(x?? y) ? 0xff000000 
????: 0xfffffff; 
????} 
????} 
????} 
????BufferedImage image = new BufferedImage(width?? height?? 
????BufferedImage.TYPE_INT_RGB); 
????image.getRaster().setDataElements(0?? 0?? width?? height?? pixels); 
????return image; 
????} 
????/**
????* ???????????????????????????????????????
????* 
????* @param srcImageFile
????*            ???????
????* @param height
????*            ?????
????* @param width
????*            ?????
????* @param hasFiller
????*            ????????????????????true?????; false???????;
????* @throws IOException
????*/ 
????private static BufferedImage scale(String srcImageFile?? int height?? 
????int width?? boolean hasFiller) throws IOException { 
????double ratio = 0.0; // ??????? 
????File file = new File(srcImageFile); 
????BufferedImage srcImage = ImageIO.read(file); 
????Image destImage = srcImage.getScaledInstance(width?? height?? 
????BufferedImage.SCALE_SMOOTH); 
????// ??????? 
????if ((srcImage.getHeight() > height) || (srcImage.getWidth() > width)) { 
????if (srcImage.getHeight() > srcImage.getWidth()) { 
????ratio = (new Integer(height)).doubleValue() 
????/ srcImage.getHeight(); 
????} else { 
????ratio = (new Integer(width)).doubleValue() 
????/ srcImage.getWidth(); 
????} 
????AffineTransformOp op = new AffineTransformOp( 
????AffineTransform.getScaleInstance(ratio?? ratio)?? null); 
????destImage = op.filter(srcImage?? null); 
????} 
????if (hasFiller) {// ???? 
????BufferedImage image = new BufferedImage(width?? height?? 
????BufferedImage.TYPE_INT_RGB); 
????Graphics2D graphic = image.createGraphics(); 
????graphic.setColor(Color.white); 
????graphic.fillRect(0?? 0?? width?? height); 
????if (width == destImage.getWidth(null)) 
????graphic.drawImage(destImage?? 0?? 
????(height - destImage.getHeight(null)) / 2?? 
????destImage.getWidth(null)?? destImage.getHeight(null)?? 
????Color.white?? null); 
????else 
????graphic.drawImage(destImage?? 
????(width - destImage.getWidth(null)) / 2?? 0?? 
????destImage.getWidth(null)?? destImage.getHeight(null)?? 
????Color.white?? null); 
????graphic.dispose(); 
????destImage = image; 
????} 
????return (BufferedImage) destImage; 
????} 
????public static void main(String[] args) { 
????QREncodeWithPic 
????.encode("http://weixin.qq.com/r/h685IaDEkf3ureRC9-qV"?? 
????600?? 600?? "D:\lux.png"?? "D:\qr.png"); 
????} 
????}