¡¡¡¡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 hint = new HashMap();
¡¡¡¡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");
¡¡¡¡}
¡¡¡¡}