From 47e3087067abd35e6337c011f96d2338c0bb1aae Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期四, 25 七月 2024 13:39:31 +0800 Subject: [PATCH] 优化自动化代码 --- src/main/java/org/yeshi/utils/QRCodeUtil.java | 564 +++++++++++++++++++++++++++----------------------------- 1 files changed, 273 insertions(+), 291 deletions(-) diff --git a/src/main/java/org/yeshi/utils/QRCodeUtil.java b/src/main/java/org/yeshi/utils/QRCodeUtil.java index 8d5ecbc..2a41b2c 100644 --- a/src/main/java/org/yeshi/utils/QRCodeUtil.java +++ b/src/main/java/org/yeshi/utils/QRCodeUtil.java @@ -26,327 +26,309 @@ import com.google.zxing.Result; import com.google.zxing.WriterException; import com.google.zxing.client.j2se.BufferedImageLuminanceSource; +import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.common.HybridBinarizer; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; /** * 浜岀淮鐮佺敓鎴� - * - * @author Administrator * + * @author Administrator */ public class QRCodeUtil { - private static final String CHARSET = "UTF-8"; - private static final String FORMAT_NAME = "JPG"; - // 浜岀淮鐮佸昂瀵� - int QRCODE_SIZE = 200; - // LOGO瀹藉害 - int WIDTH = 60; - // LOGO楂樺害 - int HEIGHT = 60; + private static final String CHARSET = "UTF-8"; + private static final String FORMAT_NAME = "JPG"; - static QRCodeUtil qrCodeUtil; + // 浜岀淮鐮佸昂瀵� + int QRCODE_SIZE = 200; + // LOGO瀹藉害 + int WIDTH = 60; + // LOGO楂樺害 + int HEIGHT = 60; - public static QRCodeUtil getInstance(int size) { - if (qrCodeUtil == null) { - qrCodeUtil = new QRCodeUtil(); - } - qrCodeUtil.QRCODE_SIZE = size; - return qrCodeUtil; - } + static QRCodeUtil qrCodeUtil; - public static QRCodeUtil getInstance(int size, int imgSize) { - if (qrCodeUtil == null) { - qrCodeUtil = new QRCodeUtil(); - } - qrCodeUtil.QRCODE_SIZE = size; - qrCodeUtil.HEIGHT = imgSize; - qrCodeUtil.WIDTH = imgSize; - return qrCodeUtil; - } + public static QRCodeUtil getInstance(int size) { + if (qrCodeUtil == null) { + qrCodeUtil = new QRCodeUtil(); + } + qrCodeUtil.QRCODE_SIZE = size; + return qrCodeUtil; + } - /** - * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:31:29 - * - * @param content - * 浜岀淮鐮佸唴瀹� - * @param logoImgPath - * Logo - * @param needCompress - * 鏄惁鍘嬬缉Logo - * @return 杩斿洖浜岀淮鐮佸浘鐗� - * @throws WriterException - * @throws IOException - * BufferedImage TODO 鍒涘缓浜岀淮鐮佸浘鐗� - */ - private BufferedImage createImage(String content, InputStream logoImg, boolean needCompress) - throws WriterException, IOException { - Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>(); - hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); - hints.put(EncodeHintType.CHARACTER_SET, CHARSET); - hints.put(EncodeHintType.MARGIN, 1); - BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, - hints); - - int width = bitMatrix.getWidth(); - int height = bitMatrix.getHeight(); - BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); - for (int x = 0; x < width; x++) { - for (int y = 0; y < height; y++) { - image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF); - } - } - if (logoImg == null) { - return image; - } - - // 鎻掑叆鍥剧墖 - insertImage(image, logoImg, needCompress); - return image; - } + public static QRCodeUtil getInstance(int size, int imgSize) { + if (qrCodeUtil == null) { + qrCodeUtil = new QRCodeUtil(); + } + qrCodeUtil.QRCODE_SIZE = size; + qrCodeUtil.HEIGHT = imgSize; + qrCodeUtil.WIDTH = imgSize; + return qrCodeUtil; + } - /** - * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:31:29 - * - * @param content - * 浜岀淮鐮佸唴瀹� - * @param logoImgPath - * Logo - * @param needCompress - * 鏄惁鍘嬬缉Logo - * @return 杩斿洖浜岀淮鐮佸浘鐗� - * @throws WriterException - * @throws IOException - * BufferedImage TODO 鍒涘缓浜岀淮鐮佸浘鐗� - */ - private BufferedImage createImageDeleteWhite(String content, InputStream logoImg, boolean needCompress) - throws WriterException, IOException { - Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>(); - hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); - hints.put(EncodeHintType.CHARACTER_SET, CHARSET); - hints.put(EncodeHintType.MARGIN, 1); - BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, - hints); - - //璋冪敤鍘婚櫎鐧借竟鏂规硶 + /** + * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:31:29 + * + * @param content 浜岀淮鐮佸唴瀹� + * @param logoImgPath Logo + * @param needCompress 鏄惁鍘嬬缉Logo + * @return 杩斿洖浜岀淮鐮佸浘鐗� + * @throws WriterException + * @throws IOException + */ + private BufferedImage createImage(String content, InputStream logoImg, boolean needCompress) + throws WriterException, IOException { + return this.createImage(content, logoImg, 0xFF000000, 0xFFFFFFFF, needCompress); + } + + + public BufferedImage createImage(String content, InputStream logoImg, int color, int bgColor, boolean needCompress) + throws WriterException, IOException { + Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>(); + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + hints.put(EncodeHintType.CHARACTER_SET, CHARSET); + hints.put(EncodeHintType.MARGIN, 1); + BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, + hints); + + int width = bitMatrix.getWidth(); + int height = bitMatrix.getHeight(); + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + image.setRGB(x, y, bitMatrix.get(x, y) ? color : bgColor); + } + } + if (logoImg == null) { + return image; + } + + if (logoImg != null) { + // 鎻掑叆鍥剧墖 + insertImage(image, logoImg, needCompress); + } + + return image; + } + + /** + * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:31:29 + * + * @param content 浜岀淮鐮佸唴瀹� + * @param logoImgPath Logo + * @param needCompress 鏄惁鍘嬬缉Logo + * @return 杩斿洖浜岀淮鐮佸浘鐗� + * @throws WriterException + * @throws IOException + */ + private BufferedImage createImageDeleteWhite(String content, InputStream logoImg, boolean needCompress) + throws WriterException, IOException { + return createImageDeleteWhite(content, logoImg, 0xFF000000, 0xFFFFFFFF, needCompress); + } + + + public BufferedImage createImageDeleteWhite(String content, InputStream logoImg, int color, int bgColor, boolean needCompress) + throws WriterException, IOException { + Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>(); + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + hints.put(EncodeHintType.CHARACTER_SET, CHARSET); + hints.put(EncodeHintType.MARGIN, 1); + BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, + hints); + + //璋冪敤鍘婚櫎鐧借竟鏂规硶 bitMatrix = deleteWhite(bitMatrix); - - int width = bitMatrix.getWidth(); - int height = bitMatrix.getHeight(); - BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); - for (int x = 0; x < width; x++) { - for (int y = 0; y < height; y++) { - image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF); - } - } - if (logoImg == null) { - return image; - } - - // 鎻掑叆鍥剧墖 - insertImage(image, logoImg, needCompress); - return image; - } - - /** - * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:30:09 - * - * @param source - * 浜岀淮鐮佸浘鐗� - * @param logoImgPath - * Logo - * @param needCompress - * 鏄惁鍘嬬缉Logo - * @throws IOException - * void TODO 娣诲姞Logo - */ - private void insertImage(BufferedImage source, InputStream logoImg, boolean needCompress) throws IOException { - Image src = ImageIO.read(logoImg); - int width = src.getWidth(null); - int height = src.getHeight(null); - if (needCompress) { // 鍘嬬缉LOGO - if (width > WIDTH) { - width = WIDTH; - } - if (height > HEIGHT) { - height = HEIGHT; - } + int width = bitMatrix.getWidth(); + int height = bitMatrix.getHeight(); + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + image.setRGB(x, y, bitMatrix.get(x, y) ? color : bgColor); + } + } + if (logoImg == null) { + return image; + } - Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH); - BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); - Graphics g = tag.getGraphics(); - g.drawImage(image, 0, 0, null); // 缁樺埗缂╁皬鍚庣殑鍥� - g.dispose(); - src = image; - } + // 鎻掑叆鍥剧墖 + if (logoImg != null) { + insertImage(image, logoImg, needCompress); + } + return image; + } - // 鎻掑叆LOGO - Graphics2D graph = source.createGraphics(); - int x = (QRCODE_SIZE - width) / 2; - int y = (QRCODE_SIZE - height) / 2; - graph.drawImage(src, x, y, width, height, null); - Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6); - graph.setStroke(new BasicStroke(3f)); - graph.draw(shape); - graph.dispose(); - } + /** + * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:30:09 + * + * @param source 浜岀淮鐮佸浘鐗� + * @param logoImgPath Logo + * @param needCompress 鏄惁鍘嬬缉Logo + * @throws IOException void TODO 娣诲姞Logo + */ + private void insertImage(BufferedImage source, InputStream logoImg, boolean needCompress) throws IOException { + Image src = ImageIO.read(logoImg); + int width = src.getWidth(null); + int height = src.getHeight(null); + if (needCompress) { // 鍘嬬缉LOGO + if (width > WIDTH) { + width = WIDTH; + } - /** - * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:32:32 - * - * @param content - * 浜岀淮鐮佸唴瀹� - * @param logoImgPath - * Logo - * @param destPath - * 浜岀淮鐮佽緭鍑鸿矾寰� - * @param needCompress - * 鏄惁鍘嬬缉Logo - * @throws Exception - * void TODO 鐢熸垚甯ogo鐨勪簩缁寸爜 - */ - public void encode(String content, InputStream logoImg, String destPath, boolean needCompress) throws Exception { - BufferedImage image = createImage(content, logoImg, needCompress); - ImageIO.write(image, FORMAT_NAME, new File(destPath)); - } + if (height > HEIGHT) { + height = HEIGHT; + } - /** - * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:35:44 - * - * @param content - * 浜岀淮鐮佸唴瀹� - * @param destPath - * 浜岀淮鐮佽緭鍑鸿矾寰� - * @throws Exception - * void TODO 鐢熸垚涓嶅甫Logo鐨勪簩缁寸爜 - */ - public void encode(String content, String destPath) throws Exception { - encode(content, null, destPath, false); - } + Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH); + BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + Graphics g = tag.getGraphics(); + g.drawImage(image, 0, 0, null); // 缁樺埗缂╁皬鍚庣殑鍥� + g.dispose(); + src = image; + } - public InputStream encode(String content) throws Exception { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - encode(content, null, out, false); - return new ByteArrayInputStream(out.toByteArray()); - } + // 鎻掑叆LOGO + Graphics2D graph = source.createGraphics(); + int x = (QRCODE_SIZE - width) / 2; + int y = (QRCODE_SIZE - height) / 2; + graph.drawImage(src, x, y, width, height, null); + Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6); + graph.setStroke(new BasicStroke(3f)); + graph.draw(shape); + graph.dispose(); + } - - public InputStream encodeDeleteWhite(String content) throws Exception { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - encodeDeleteWhite(content, null, out, false); - return new ByteArrayInputStream(out.toByteArray()); - } - - - /** - * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:36:58 - * - * @param content - * 浜岀淮鐮佸唴瀹� - * @param logoImgPath - * Logo - * @param output - * 杈撳嚭娴� - * @param needCompress - * 鏄惁鍘嬬缉Logo - * @throws Exception - * void TODO 鐢熸垚甯ogo鐨勪簩缁寸爜锛屽苟杈撳嚭鍒版寚瀹氱殑杈撳嚭娴� - */ - public void encode(String content, InputStream logoImg, OutputStream output, boolean needCompress) - throws Exception { - BufferedImage image = createImage(content, logoImg, needCompress); - ImageIO.write(image, FORMAT_NAME, output); - } + /** + * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:32:32 + * + * @param content 浜岀淮鐮佸唴瀹� + * @param logoImgPath Logo + * @param destPath 浜岀淮鐮佽緭鍑鸿矾寰� + * @param needCompress 鏄惁鍘嬬缉Logo + * @throws Exception void TODO 鐢熸垚甯ogo鐨勪簩缁寸爜 + */ + public void encode(String content, InputStream logoImg, String destPath, boolean needCompress) throws Exception { + BufferedImage image = createImage(content, logoImg, needCompress); + ImageIO.write(image, FORMAT_NAME, new File(destPath)); + } - /** - * - * @param content - * @param logoImg - * @param output - * 浜岃繘鍒惰緭鍑烘祦 - * @param needCompress - * @throws Exception - */ - public void encode(String content, InputStream logoImg, ByteArrayOutputStream output, boolean needCompress) - throws Exception { - BufferedImage image = createImage(content, logoImg, needCompress); - ImageIO.write(image, FORMAT_NAME, output); - } - - /** - * - * @param content - * @param logoImg - * @param output - * 浜岃繘鍒惰緭鍑烘祦 - * @param needCompress - * @throws Exception - */ - public void encodeDeleteWhite(String content, InputStream logoImg, ByteArrayOutputStream output, boolean needCompress) - throws Exception { - BufferedImage image = createImageDeleteWhite(content, logoImg, needCompress); - ImageIO.write(image, FORMAT_NAME, output); - } + /** + * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:35:44 + * + * @param content 浜岀淮鐮佸唴瀹� + * @param destPath 浜岀淮鐮佽緭鍑鸿矾寰� + * @throws Exception void TODO 鐢熸垚涓嶅甫Logo鐨勪簩缁寸爜 + */ + public void encode(String content, String destPath) throws Exception { + encode(content, null, destPath, false); + } - /** - * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:38:02 - * - * @param content - * 浜岀淮鐮佸唴瀹� - * @param output - * 杈撳嚭娴� - * @throws Exception - * void TODO 鐢熸垚涓嶅甫Logo鐨勪簩缁寸爜锛屽苟杈撳嚭鍒版寚瀹氱殑杈撳嚭娴� - */ - public void encode(String content, OutputStream output) throws Exception { - encode(content, null, output, false); - } + public InputStream encode(String content) throws Exception { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + encode(content, null, out, false); + return new ByteArrayInputStream(out.toByteArray()); + } - /** - * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:39:10 - * - * @param file - * 浜岀淮鐮� - * @return 杩斿洖瑙f瀽寰楀埌鐨勪簩缁寸爜鍐呭 - * @throws Exception - * String TODO 浜岀淮鐮佽В鏋� - */ - public String decode(File file) throws Exception { - BufferedImage image; - image = ImageIO.read(file); - if (image == null) { - return null; - } - BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image); - BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); - Result result; - Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>(); - hints.put(DecodeHintType.CHARACTER_SET, CHARSET); - result = new MultiFormatReader().decode(bitmap, hints); - String resultStr = result.getText(); - return resultStr; - } - /** - * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:39:48 - * - * @param path - * 浜岀淮鐮佸瓨鍌ㄤ綅缃� - * @return 杩斿洖瑙f瀽寰楀埌鐨勪簩缁寸爜鍐呭 - * @throws Exception - * String TODO 浜岀淮鐮佽В鏋� - */ - public String decode(String path) throws Exception { - return decode(new File(path)); - } + public InputStream encodeDeleteWhite(String content) throws Exception { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + encodeDeleteWhite(content, null, out, false); + return new ByteArrayInputStream(out.toByteArray()); + } - private static BitMatrix deleteWhite(BitMatrix matrix) { + + /** + * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:36:58 + * + * @param content 浜岀淮鐮佸唴瀹� + * @param logoImgPath Logo + * @param output 杈撳嚭娴� + * @param needCompress 鏄惁鍘嬬缉Logo + * @throws Exception void TODO 鐢熸垚甯ogo鐨勪簩缁寸爜锛屽苟杈撳嚭鍒版寚瀹氱殑杈撳嚭娴� + */ + public void encode(String content, InputStream logoImg, OutputStream output, boolean needCompress) + throws Exception { + BufferedImage image = createImage(content, logoImg, needCompress); + ImageIO.write(image, FORMAT_NAME, output); + } + + /** + * @param content + * @param logoImg + * @param output 浜岃繘鍒惰緭鍑烘祦 + * @param needCompress + * @throws Exception + */ + public void encode(String content, InputStream logoImg, ByteArrayOutputStream output, boolean needCompress) + throws Exception { + BufferedImage image = createImage(content, logoImg, needCompress); + ImageIO.write(image, FORMAT_NAME, output); + } + + /** + * @param content + * @param logoImg + * @param output 浜岃繘鍒惰緭鍑烘祦 + * @param needCompress + * @throws Exception + */ + public void encodeDeleteWhite(String content, InputStream logoImg, ByteArrayOutputStream output, boolean needCompress) + throws Exception { + BufferedImage image = createImageDeleteWhite(content, logoImg, needCompress); + ImageIO.write(image, FORMAT_NAME, output); + } + + /** + * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:38:02 + * + * @param content 浜岀淮鐮佸唴瀹� + * @param output 杈撳嚭娴� + * @throws Exception void TODO 鐢熸垚涓嶅甫Logo鐨勪簩缁寸爜锛屽苟杈撳嚭鍒版寚瀹氱殑杈撳嚭娴� + */ + public void encode(String content, OutputStream output) throws Exception { + encode(content, null, output, false); + } + + /** + * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:39:10 + * + * @param file 浜岀淮鐮� + * @return 杩斿洖瑙f瀽寰楀埌鐨勪簩缁寸爜鍐呭 + * @throws Exception String TODO 浜岀淮鐮佽В鏋� + */ + public String decode(File file) throws Exception { + BufferedImage image; + image = ImageIO.read(file); + if (image == null) { + return null; + } + BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image); + BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); + Result result; + Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>(); + hints.put(DecodeHintType.CHARACTER_SET, CHARSET); + result = new MultiFormatReader().decode(bitmap, hints); + String resultStr = result.getText(); + return resultStr; + } + + /** + * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:39:48 + * + * @param path 浜岀淮鐮佸瓨鍌ㄤ綅缃� + * @return 杩斿洖瑙f瀽寰楀埌鐨勪簩缁寸爜鍐呭 + * @throws Exception String TODO 浜岀淮鐮佽В鏋� + */ + public String decode(String path) throws Exception { + return decode(new File(path)); + } + + private static BitMatrix deleteWhite(BitMatrix matrix) { int[] rec = matrix.getEnclosingRectangle(); int resWidth = rec[2] + 1; int resHeight = rec[3] + 1; - + BitMatrix resMatrix = new BitMatrix(resWidth, resHeight); resMatrix.clear(); for (int i = 0; i < resWidth; i++) { -- Gitblit v1.8.0