java生成二维码图片(有logo),并在图片下方附文字
2017-11-28 18:24
806 查看
logo配置类
MatrixToImage类
给二维码图片添加Logo
给二维码图片下方附说明文字
main测试
下附二维码样式
/** * Created by Amber Wang on 2017/11/27 17:25. */ import java.awt.*; public class LogoConfig { // logo默认边框颜色 public static final Color DEFAULT_BORDERCOLOR = Color.WHITE; // logo默认边框宽度 public static final int DEFAULT_BORDER = 2; // logo大小默认为二维码照片的1/6 public static final int DEFAULT_LOGOPART = 6; private final int border = DEFAULT_BORDER; private final Color borderColor; private final int logoPart; /** * Creates a default config with on color {@link #BLACK} and off color * {@link #WHITE}, generating normal black-on-white barcodes. */ public LogoConfig() { this(DEFAULT_BORDERCOLOR, DEFAULT_LOGOPART); } public LogoConfig(Color borderColor, int logoPart) { this.borderColor = borderColor; this.logoPart = logoPart; } public Color getBorderColor() { return borderColor; } public int getBorder() { return border; } public int getLogoPart() { return logoPart; } }
MatrixToImage类
/** * Created by Amber Wang on 2017/11/27 17:24. */ import com.google.zxing.common.BitMatrix; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.OutputStream; public final class MatrixToImageWriter { private static final int BLACK = 0xFF000000; private static final int WHITE = 0xFFFFFFFF; private MatrixToImageWriter() { } public static BufferedImage toBufferedImage(BitMatrix matrix) { int width = matrix.getWidth(); int height = matrix.getHeight(); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); for (int x = 0; x < width; x++) { for (int y = 0; y < height - 50; y++) { image.setRGB(x, y, matrix.get(x, y + 50) ? BLACK : WHITE); } } return image; } public static BufferedImage writeToFile(BitMatrix matrix, String format) throws IOException { BufferedImage image = toBufferedImage(matrix); return image; } public static void writeToStream(BitMatrix matrix, String format, OutputStream stream) throws IOException { BufferedImage image = toBufferedImage(matrix); if (!ImageIO.write(image, format, stream)) { throw new IOException("Could not write an image of format " + format); } } }
给二维码图片添加Logo
/** * 给二维码图片添加Logo * * @param barCodeImage * @param logoPic */ public static BufferedImage addLogo_QRCode(BufferedImage barCodeImage, File logoPic, LogoConfig logoConfig) { try { if (!logoPic.isFile()) { System.out.print("file not find !"); throw new IOException("file not find !"); } /** * 读取二维码图片,并构建绘图对象 */ Graphics2D g = barCodeImage.createGraphics(); /** * 读取Logo图片 */ BufferedImage logo = ImageIO.read(logoPic); int widthLogo = barCodeImage.getWidth() / logoConfig.getLogoPart(); int heightLogo = barCodeImage.getWidth() / logoConfig.getLogoPart(); //保持二维码是正方形的 // 计算图片放置位置 int x = (barCodeImage.getWidth() - widthLogo) / 2; int y = (barCodeImage.getHeight() - heightLogo) / 2 - 50; //开始绘制图片 g.drawImage(logo, x, y, widthLogo, heightLogo, null); g.drawRoundRect(x, y, widthLogo, heightLogo, 10, 10); g.setStroke(new BasicStroke(logoConfig.getBorder())); g.setColor(logoConfig.getBorderColor()); g.drawRect(x, y, widthLogo, heightLogo); g.dispose(); 4000 return barCodeImage; } catch (Exception e) { e.printStackTrace(); } return null; }
给二维码图片下方附说明文字
/** * @param pressText 文字 * @param newImg 带文字的图片 * @param image 需要添加文字的图片 * @param fontStyle * @param color * @param fontSize * @param width * @param height * @为图片添加文字 */ public static void pressText(String pressText, String newImg, BufferedImage image, int fontStyle, Color color, int fontSize, int width, int height) { //计算文字开始的位置 //x开始的位置:(图片宽度-字体大小*字的个数)/2 int startX = (width - (fontSize * pressText.length())) - 10; //y开始的位置:图片高度-(图片高度-图片宽度)/2 int startY = height - (height - width) / 2 - 30; System.out.println("startX: " + startX); System.out.println("startY: " + startY); System.out.println("height: " + height); System.out.println("width: " + width); System.out.println("fontSize: " + fontSize); System.out.println("pressText.length(): " + pressText.length()); try { // File file = new File(targetImg); // Image src = ImageIO.read(file); int imageW = image.getWidth(); int imageH = image.getHeight(); // BufferedImage image = new BufferedImage(imageW, imageH, BufferedImage.TYPE_INT_RGB); Graphics g = image.createGraphics(); g.drawImage(image, 0, 0, imageW, imageH, null); g.setColor(color); g.setFont(new Font("粗体", Font.BOLD, 30)); g.drawString(pressText, startX, startY); g.drawString("广 告 牌 0 1", startX + 30, startY + 30); g.dispose(); FileOutputStream out = new FileOutputStream(newImg); ImageIO.write(image, "JPEG", out); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(image); out.close(); System.out.println("image press success"); } catch (Exception e) { e.printStackTrace(); System.out.println(e); } }
main测试
//二维码表示的内容 private static String content = "http://www.changxingnanjing.com?qr_code=01900302|773f3c8f872bf34cc3fe97022720330e"; //存放logo的文件夹 private static String path = "E:/QRCodeImage"; public static void main(String args[]) { try { MultiFormatWriter multiFormatWriter = new MultiFormatWriter(); @SuppressWarnings("rawtypes") Map hints = new HashMap(); //设置UTF-8, 防止中文乱码 hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); //设置二维码四周白色区域的大小 hints.put(EncodeHintType.MARGIN, 2); //设置二维码的容错性 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); //width:图片完整的宽;height:图片完整的高 //因为要在二维码下方附上文字,所以把图片设置为长方形(高大于宽) int width = 352;//352 int height = 500;//612 //画二维码,记得调用multiFormatWriter.encode()时最后要带上hints参数,不然上面设置无效 BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, width, height, hints); //qrcFile用来存放生成的二维码图片(无logo,无文字) File logoFile = new File(path, "logo.jpg"); //开始画二维码 BufferedImage barCodeImage = MatrixToImageWriter.writeToFile(bitMatrix, "jpg"); //在二维码中加入图片 LogoConfig logoConfig = new LogoConfig(); //LogoConfig中设置Logo的属性 BufferedImage image = addLogo_QRCode(barCodeImage, logoFile, logoConfig); int font = 18; //字体大小 int fontStyle = 1; //字体风格 //用来存放带有logo+文字的二维码图片 String newImageWithText = path + "/imageWithText.jpg"; //附加在图片上的文字信息 String text = "0 1 1 0 9 0 2 9"; //在二维码下方添加文字(文字居中) pressText(text, newImageWithText, image, fontStyle, Color.black, font, width, height); } catch (Exception e) { e.printStackTrace(); } }
下附二维码样式
相关文章推荐
- java--实现将文字生成二维码图片,并在中间附上logo,下方附上文字
- java生成二维码,在中间附上logo,下方附上文字,img标签嵌入
- java生成二维码,可添加logo和文字
- Java生成二维码可添加logo和文字功能
- java使用zxing生成带logo,文字说明二维码
- java使用zxing生成带logo的二维码图片
- java使用zxing生成带logo的二维码图片
- phpqrcode生成带logo的二维码图片及带文字的二维码图片
- java生成二维码,可添加logo和文字
- [java]生成带logo图片的二维码、以及二维码解码
- 【java】google的zxing架包生成二维码和读取二维码【可带文字和logo】
- java 二维码 生成和解析 (中间:图片、文字;底部:文字)
- JAVA 生成二维码图片 可加Logo
- java生成二维码 并在生成的二维图片加上说明文字
- JAVA给微信公众号二维码添加LOGO时总是生成灰度图片的原因及解决办法
- C# Qrcode生成二维码支持中文,带图片,带文字 2015-01-22 15:11 617人阅读 评论(1) 收藏
- JAVA 自定义文字生成图片
- Qrcode生成二维码支持中文,带图片,带文字
- (转载)java zxing 生成带图片的二维码
- java ,jquery 生成 qrcode 二维码带Logo