java|java 实现图片合成,并添加文字
最近公司一个需要,需要把商品的优惠卷分享链接,生成一个二维码然后和商品主图合成一张,并且在新合成的主图增加商品信息的描述,好了直接看合成后图片的样式
文章图片
下面我就直接贴代码,首先是Contorller层
/*** 淘宝二维码,商品主图,合成一张图* * @param pictUrl* @param request* @param response* @throws IOException*/@RequestMapping("/getTaoBaoqQRCode")public void getTaoBaoqQRCode(TaoBaoQRCode taoBaoQRCode, HttpServletRequest request,HttpServletResponse response) throws IOException {ServletOutputStream os = null; InputStream buffin = null; try {// 二维码String couponUlr = "https:" + taoBaoQRCode.getCouponShareUrl(); // 高额卷分享链接byte[] imgByte = QrCodeUtil.createQrCode2Bytes(250, 250, couponUlr); buffin = new ByteArrayInputStream(imgByte); BufferedImage couponImage = ImageIO.read(buffin); // 商品主图String imageUrl = "https:" + taoBaoQRCode.getPictUrl(); URL url = new URL(imageUrl); BufferedImage picImage = ImageIO.read(url); BufferedImage modifyImage =imageHandleUtil.mergeImage(picImage, couponImage, taoBaoQRCode.getTitle(),taoBaoQRCode.getReservePrice(), taoBaoQRCode.getZkFinalPrice()); response.setContentType("image/jpg"); os = response.getOutputStream(); ImageIO.write(modifyImage, "jpg", os); os.flush(); } catch (Exception e) {LOGGER.error("getTaoBaoqQRCode error"); e.printStackTrace(); } finally {buffin.close(); os.close(); }}
二维码QrCodeUtil 生成帮助类
public class QrCodeUtil {private static final int DAFAULT_WIDTH = 360; private static final int DAFAULT_HEIGHT = 360; private static final Logger LOGGER = LoggerFactory.getLogger(QrCodeUtil.class); public static String createQrCode(String text) {return createQrCode(DAFAULT_WIDTH, DAFAULT_HEIGHT, text); }public static String createQrCode(int widht, int height, String text) {HashMaphints = new HashMap (); hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); try {byte[] bytes = createQrCode2Bytes(widht, height, text); String fileName = UUID.randomUUID().toString().replaceAll("-", "") + ".png"; return UpYunClient.upload(fileName, bytes); } catch (Exception e) {LOGGER.error("create qrcode error", e); }return null; }public static byte[] createQrCode2Bytes(String text) {return createQrCode2Bytes(DAFAULT_WIDTH, DAFAULT_HEIGHT, text); }public static byte[] createQrCode2Bytes(int widht, int height, String text) {HashMap hints = new HashMap (); hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); try {BitMatrix bitMatrix =new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, widht, height,hints); ByteArrayOutputStream out = new ByteArrayOutputStream(); BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix); ImageIO.write(image, "png", out); return out.toByteArray(); } catch (Exception e) {LOGGER.error("create qrcode error", e); }return null; }/*** 生成条形码并已字节码形式返回,生成的图片格式为png* * @param contents* @param width* @param height* @return*/public static byte[] createBarcode2Byte(String contents, int width, int height) {int codeWidth = 3 + // start guard(7 * 6) + // left bars5 + // middle guard(7 * 6) + // right bars3; // end guardcodeWidth = Math.max(codeWidth, width); try {BitMatrix bitMatrix =new MultiFormatWriter().encode(contents, BarcodeFormat.CODE_128, codeWidth,height, null); BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix); ByteArrayOutputStream out = new ByteArrayOutputStream(); ImageIO.write(image, "png", out); return out.toByteArray(); } catch (Exception e) {e.printStackTrace(); }return null; }}
二维码生成我这里用的是谷歌的看下面maven pom.xml 文件
com.google.zxing core2.2 com.google.zxing javase2.2
合成图片方法如何
package com.qft.campuscircle.common.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.URL; import javax.imageio.ImageIO; import org.springframework.stereotype.Component; @Componentpublic class ImageHandleUtil {private Font font = null; private Graphics2D g = null; /*** 导入本地图片到缓冲区* * @param imgName* @return*/public BufferedImage loadImageLocal(String imgName) {try {return ImageIO.read(new File(imgName)); } catch (IOException e) {e.printStackTrace(); }return null; }/*** 导入网络图片到缓冲区* * @param imgName* @return*/public BufferedImage loadImageUrl(String imgName) {try {URL url = new URL(imgName); return ImageIO.read(url); } catch (IOException e) {e.printStackTrace(); }return null; }/*** 生成新图片到本地* * @param newImage* @param img*/public void writeImageLocal(String newImage, BufferedImage img) {if (newImage != null && img != null) {try {// 目录不存在则创建String dirUrl = newImage.substring(0, newImage.lastIndexOf(File.separator)); File dir = new File(dirUrl); if (!dir.exists()) {dir.mkdirs(); }File outputfile = new File(newImage); ImageIO.write(img, "png", outputfile); } catch (IOException e) {e.printStackTrace(); }}}/*** 设定文字的字体等* * @param fontStyle* @param fontSize*/public void setFont(String name, int style, int fontSize) {this.font = new Font(name, style, fontSize); }/*** 修改图片,返回修改后的图片缓冲区(只输出一行文本),图片居中显示* * @param img* @param content* @param y* @param color* @return*/public BufferedImage modifyImage(BufferedImage img, Object content, int y, Color color) {try {g = img.createGraphics(); g.setBackground(Color.WHITE); g.setColor(color); // 设置字体颜色g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 抗锯齿if (this.font != null)g.setFont(this.font); int width = img.getWidth(); // 图片宽度if (content != null) {String str = content.toString(); int strWidth = g.getFontMetrics().stringWidth(str); // 字体宽度g.drawString(str, (width - strWidth) / 2, y); }g.dispose(); } catch (Exception e) {e.printStackTrace(); }return img; }public BufferedImage modifyImage(BufferedImage img, Object content, int x, int y, Color color) {try {g = img.createGraphics(); g.setBackground(Color.WHITE); g.setColor(color); // 设置字体颜色g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 抗锯齿if (this.font != null)g.setFont(this.font); if (content != null) {String str = content.toString(); g.drawString(str, x, y); }g.dispose(); } catch (Exception e) {e.printStackTrace(); }return img; }/*** 将一张图片画在另一张图片上* * @param addImage 被添加的图片* @param sourceImg 源图* @param x* @param y* @param width* @param height* @return*/public BufferedImage modifyImagetogeter(BufferedImage addImage, BufferedImage sourceImg, int x,int y) {int width = addImage.getWidth(); int height = addImage.getHeight(); try {g = sourceImg.createGraphics(); g.drawImage(addImage, x, y, width, height, null); g.dispose(); } catch (Exception e) {e.printStackTrace(); }return sourceImg; }/*** * @param img1 * @param img2* @param title 标题* @param reservePrice 现价* @param zkFinalPrice 折扣价* @return BufferedImage* @throws IOException*/public BufferedImage mergeImage(BufferedImage img1, BufferedImage img2,String title,String reservePrice,String zkFinalPrice)throws IOException {Font font = new Font("微软雅黑", Font.BOLD, 20); int w1 = img1.getWidth(); int h1 = img1.getHeight(); int w2 = img2.getWidth(); int h2 = img2.getHeight(); BufferedImage newImage = new BufferedImage(w1, h2 + h1 + h2/2, BufferedImage.TYPE_INT_RGB); // 新的图Graphics2D graphics = (Graphics2D) newImage.getGraphics(); graphics.setBackground(Color.WHITE); graphics.fillRect(0, 0, newImage.getWidth(), newImage.getHeight()); graphics.drawImage(img1, 0, 0, null); graphics.drawImage(img2, (newImage.getWidth()) / 2 - (w2 / 2), newImage.getHeight() - h2,null); graphics.setFont(font); graphics.setColor(Color.BLACK); int width = graphics.getFontMetrics(font).stringWidth(title); int startY = h1 + 30; if (width > newImage.getWidth()) {char[] array = title.toCharArray(); StringBuilder sb = new StringBuilder(array[0]); for (char c : array) {sb.append(c); int newWidth = graphics.getFontMetrics(font).stringWidth(sb.toString()); if ((newWidth + 19) >= newImage.getWidth()) {// 准备换行graphics.drawString(sb.toString(), 0, startY); startY += 30; sb.delete(0, sb.length()); }}graphics.drawString(sb.toString(), 0, startY); } else {graphics.drawString(title, 0, startY); }graphics.drawString("现价¥"+reservePrice, 0, startY + 30); startY += 30; graphics.drawString("卷后价¥"+zkFinalPrice, 0, startY + 30); return newImage; }}
两个帮助类里面有很多方法没用到,大家只要看几个关键的方法就可以了,TaoBaoQRCode 对象里面的属性我就没列出来了,大家自己根据自己的需求而定
【java|java 实现图片合成,并添加文字】以上就是java 实现图片合成,并添加文字的详细内容,更多关于Java 图片合成的资料请关注脚本之家其它相关文章!
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 宽容谁
- 一个人的旅行,三亚
- 第6.2章(设置属性)
- 布丽吉特,人生绝对的赢家
- 家乡的那条小河
- 讲述,美丽聪明的海欧!
- 夜游宫|夜游宫 心语
- 增长黑客的海盗法则
- 画画吗()