zoukankan      html  css  js  c++  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) {
            HashMap<EncodeHintType, String> hints = new HashMap<EncodeHintType, String>();
            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<EncodeHintType, String> hints = new HashMap<EncodeHintType, String>();
            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 bars
                    5 + // middle guard
                    (7 * 6) + // right bars
                    3; // end guard
            codeWidth = 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 文件

            <!-- 条形码、二维码生成 -->
            <dependency>
                <groupId>com.google.zxing</groupId>
                <artifactId>core</artifactId>
                <version>2.2</version>
            </dependency>
            <dependency>
                <groupId>com.google.zxing</groupId>
                <artifactId>javase</artifactId>
                <version>2.2</version>
            </dependency>

    合成图片方法如何

    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;
    
    @Component
    public 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 对象里面的属性我就没列出来了,大家自己根据自己的需求而定

  • 相关阅读:
    MapXtreme实用技巧与源码10例
    在MapXTreme2004中创建自定义工具
    Mapinfo的几个文件的具体含义及内容是什么?
    MapXtreme打包成功的经验
    OCP最新题库收集,新版052考题及答案整理19
    【OCP|052】052考试题库又变了,最新052题库收集整理第15题
    OCP 052新加的考试题收集整理第20道
    【ocp 052又加新题了】052新加的考试题及答案整理第13题
    【OCP052】新版052最新题库及答案整理第14题
    OCP换考题了,052新考题及答案整理第17题
  • 原文地址:https://www.cnblogs.com/SHMILYHP/p/10881472.html
Copyright © 2011-2022 走看看