java 合成图片微信二维码_javaÉú³É´øͼƬµÄ΢ÐŶþάÂë

¡¡¡¡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");

¡¡¡¡}

¡¡¡¡}

2016122639537592.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值