| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- package jnpf.util;
- import com.google.zxing.BarcodeFormat;
- import com.google.zxing.EncodeHintType;
- import com.google.zxing.MultiFormatWriter;
- import com.google.zxing.common.BitMatrix;
- import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
- import javax.imageio.ImageIO;
- import java.awt.*;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.util.HashMap;
- import java.util.Hashtable;
- import java.util.Map;
- /**
- *
- * @author JNPF开发平台组
- * @version V3.1.0
- * @copyright 引迈信息技术有限公司
- * @date 2021/3/16 10:58
- */
- public class ZxingCodeUtil {
- //-----------------------------------条形码-----------------------------------
- /**
- * 条形码的颜色
- */
- private static final int BLACK = 0xff000000;
- /**
- * 背景色
- */
- private static final int WHITE = 0xFFFFFFFF;
- /**
- * 生成一维码(128)
- *
- * @param message 内容
- * @param width 宽度
- * @param height 高度
- * @return
- */
- public static BufferedImage getBarcode(String message, int width, int height) {
- try {
- Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
- hints.put(EncodeHintType.CHARACTER_SET, "code");
- BitMatrix bitMatrix = new MultiFormatWriter().encode(message,BarcodeFormat.CODE_128, width, height, hints);
- return toBufferedImage(bitMatrix);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- /**
- * 转换成图片
- *
- * @param matrix
- * @return
- */
- private static BufferedImage toBufferedImage(BitMatrix matrix) {
- int width = matrix.getWidth();
- int height = matrix.getHeight();
- BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
- for (int x = 0; x < width; x++) {
- for (int y = 0; y < height; y++) {
- image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
- }
- }
- return image;
- }
- //--------------------------二维码-----------------------------------
- /**
- * 二维码颜色
- */
- private static final int QRCOLOR = 0xFF000000;
- /**
- * 背景色
- */
- private static final int BGCOLOR = 0xFFFFFFFF;
- /**
- * 生成普通的二维码
- * @param message 二维码内容
- * @param width 宽度
- * @param height 高度
- * @return
- */
- public static BufferedImage createCode(String message, int width, int height) {
- MultiFormatWriter multiFormatWriter = null;
- BitMatrix bm = null;
- BufferedImage image = null;
- Map<EncodeHintType, Object> hints = getDecodeHintType();
- try {
- multiFormatWriter = new MultiFormatWriter();
- // 参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度,设置参数
- bm = multiFormatWriter.encode(message, BarcodeFormat.QR_CODE, width, height, hints);
- int w = bm.getWidth();
- int h = bm.getHeight();
- image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
- // 开始利用二维码数据创建Bitmap图片,分别设为黑(0xFFFFFFFF)白(0xFF000000)两色
- for (int x = 0; x < w; x++) {
- for (int y = 0; y < h; y++) {
- image.setRGB(x, y, bm.get(x, y) ? QRCOLOR : BGCOLOR);
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- return image;
- }
- /**
- * 生成带logo的二维码
- * @param message 二维码内容
- * @param logoPath log路径
- * @param width 宽度
- * @param height 高度
- * @return
- */
- public static BufferedImage createCodeWithLogo(String message, String logoPath, int width, int height) {
- BufferedImage bim = createCode(message,width,height);
- try {
- // 读取二维码图片,并构建绘图对象
- BufferedImage image = bim;
- Graphics2D g = image.createGraphics();
- // 读取Logo图片
- BufferedImage logo = ImageIO.read(new File(XSSEscape.escapePath(logoPath)));
- //设置logo的大小,这里设置为二维码图片的20%,过大会盖掉二维码
- int widthLogo = logo.getWidth(null) > image.getWidth() * 3 / 10 ? (image.getWidth() * 3 / 10) : logo.getWidth(null),
- heightLogo = logo.getHeight(null) > image.getHeight() * 3 / 10 ? (image.getHeight() * 3 / 10) : logo.getWidth(null);
- // logo放在中心
- int x = (image.getWidth() - widthLogo) / 2;
- int y = (image.getHeight() - heightLogo) / 2;
- //开始绘制图片
- g.drawImage(logo, x, y, widthLogo, heightLogo, null);
- g.dispose();
- logo.flush();
- image.flush();
- return image;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- /**
- * 生成带logo和文字的二维码
- * @param message 二维码内容
- * @param logoPath log路径
- * @param text 文字
- * @param width 宽度
- * @param height 高度
- * @return
- */
- public static BufferedImage createCodeWithLogoAndText(String message, String logoPath, String text, int width, int height) {
- BufferedImage image = createCodeWithLogo(message, logoPath,width,height);
- try {
- if (text != null && !"".equals(text)) {
- //新的图片,把带logo的二维码下面加上文字
- BufferedImage outImage = new BufferedImage(400, 445, BufferedImage.TYPE_4BYTE_ABGR);
- Graphics2D outg = outImage.createGraphics();
- //画二维码到新的面板
- outg.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
- //画文字到新的面板
- outg.setColor(Color.BLACK);
- //字体、字型、字号
- outg.setFont(new Font("宋体", Font.BOLD, 30));
- int strWidth = outg.getFontMetrics().stringWidth(text);
- if (strWidth > 399) {
- String productName1 = text.substring(0, text.length() / 2);
- String productName2 = text.substring(text.length() / 2, text.length());
- int strWidth1 = outg.getFontMetrics().stringWidth(productName1);
- int strWidth2 = outg.getFontMetrics().stringWidth(productName2);
- outg.drawString(productName1, 200 - strWidth1 / 2, image.getHeight() + (outImage.getHeight() - image.getHeight()) / 2 + 12);
- BufferedImage outImage2 = new BufferedImage(400, 485, BufferedImage.TYPE_4BYTE_ABGR);
- Graphics2D outg2 = outImage2.createGraphics();
- outg2.drawImage(outImage, 0, 0, outImage.getWidth(), outImage.getHeight(), null);
- outg2.setColor(Color.BLACK);
- //字体、字型、字号
- outg2.setFont(new Font("宋体", Font.BOLD, 30));
- outg2.drawString(productName2, 200 - strWidth2 / 2, outImage.getHeight() + (outImage2.getHeight() - outImage.getHeight()) / 2 + 5);
- outg2.dispose();
- outImage2.flush();
- outImage = outImage2;
- } else {
- //画文字
- outg.drawString(text, 200 - strWidth / 2, image.getHeight() + (outImage.getHeight() - image.getHeight()) / 2 + 12);
- }
- outg.dispose();
- outImage.flush();
- image = outImage;
- image.flush();
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- return image;
- }
- /**
- * 设置二维码的格式参数
- * @return
- */
- private static Map<EncodeHintType, Object> getDecodeHintType() {
- Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>(16);
- hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
- hints.put(EncodeHintType.CHARACTER_SET, Constants.UTF8);
- hints.put(EncodeHintType.MARGIN, 0);
- hints.put(EncodeHintType.MAX_SIZE, 350);
- hints.put(EncodeHintType.MIN_SIZE, 100);
- return hints;
- }
- }
|