zoukankan      html  css  js  c++  java
  • Java使用BufferedImage修改图片内容

    1.修改图片的架包

      

          <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
          </dependency>
    

    1.1   修i该图片工具类

    package com.mz.usps.common.util;
    
    import com.mz.usps.common.domain.LableMessage;
    
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.awt.image.ImageObserver;
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    
    /**
     * @author sjl
     * @date 2019-04-23 17:58
     */
    public class PngAlterUtil {
        /**
         * 添加字体的属性设置
         */
        private Font font = new Font("微软雅黑", Font.BOLD, 18);
        private Graphics2D g = null;
        private int fontsize = 0;
        private int x = 0;
        private int y = 0;
        private static int z = 0;
    
        /**
         * 导入本地图片到缓冲区
         */
        public BufferedImage loadImageLocal(String imgName) {
            BufferedImage read = null;
            try {
                read = ImageIO.read(new File(imgName));
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println(e.getMessage());
            }
            return read;
        }
    
        /**
         * 生成图片到本地
         */
        public void writeImageLocal(String newImage, BufferedImage img) {
            if (newImage != null && img != null) {
                try {
                    File outputfile = new File(newImage);
                    ImageIO.write(img, "jpg", outputfile);
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.println(e.getMessage());
                }
            }
        }
    
        /**
         * 修改图片,返回修改后的图片缓冲区
         */
        public BufferedImage modifyImage(BufferedImage img, BufferedImage imgs1, BufferedImage imgs2, BufferedImage imgs3, Object content, int x, int y, int j) {
            try {
    
                if (j >= z) {
                    font = new Font("微软雅黑", Font.BOLD, 22);
                }
    
    
                int w = img.getWidth();
                int h = img.getHeight();
                g = img.createGraphics();
    
                //遮盖原本模板
                if (imgs1 != null) {
                    ImageObserver observer = new Checkbox();
                    g.drawImage(imgs1, 5, 270, observer);
                }
                if (imgs2 != null) {
                    ImageObserver observer = new Checkbox();
                    g.drawImage(imgs2, 5, 470, observer);
                }
                if (imgs3 != null) {
                    ImageObserver observer = new Checkbox();
                    g.drawImage(imgs3, 205, 1010, observer);
                }
    
                //设置背景颜色
                g.setBackground(Color.WHITE);
                //设置字体颜色
                g.setColor(Color.BLACK);
                if (this.font != null) {
                    g.setFont(this.font);
                }
                //验证输出位置的纵坐标和横坐标
                if (x >= h || y >= w) {
                    this.x = h - this.fontsize + 2;
                    this.y = w;
                } else {
                    this.x = x;
                    this.y = y;
                }
                if (content != null) {
                    g.drawString(content.toString(), this.x, this.y);
                }
                g.dispose();
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println(e.getMessage());
            }
            return img;
        }
    
        /**
         *
         * @param path 原图路径
         * @param message 封装了向原图中插入的信息
         */
        public static void panAlter(String path, LableMessage message) {
            //获取单号条形码
            BufferedImage barCodeImage = BarCodesUtil.generateFile(message.getLabelNo());
    
            //遮盖层存放路径
            String coverPath1 = "/usr/local/tomcatusps/apache-tomcat-8.5.15/Root/overspread/coverLayer1.png";
            String coverPath2 = "/usr/local/tomcatusps/apache-tomcat-8.5.15/Root/overspread/coverLayer2.png";
            PngAlterUtil pngAlterUtil = new PngAlterUtil();
            //导入本地图片到缓冲区
            BufferedImage img1 = pngAlterUtil.loadImageLocal(path);
            BufferedImage img2 = pngAlterUtil.loadImageLocal(coverPath1);
            BufferedImage img3 = pngAlterUtil.loadImageLocal(coverPath2);
            //修改图片,返回修改后的图片缓冲区
            BufferedImage image = pngAlterUtil.modifyImage(img1, img2, img3, barCodeImage, "", 0, 0, 0);
    
    
            ArrayList<String> list = new ArrayList();
            list.add("From:" + message.getSendName());
            //发件地址1判断
            if (message.getSendAddress1().length() > 30) {
                String sb1 = message.getSendAddress1().substring(0, 30);
                int i1 = sb1.lastIndexOf(" ");
                list.add(message.getSendAddress1().substring(0, i1));
                list.add(message.getSendAddress1().substring(i1 + 1));
            } else {
                list.add(message.getReceiveAddress1());
            }
            //发件地址2判断
            if (message.getSendAddress2() != null) {
                if (message.getSendAddress2().length() > 30) {
                    String sb2 = message.getSendAddress2().substring(0, 30);
                    int i2 = sb2.lastIndexOf(" ");
                    list.add(message.getSendAddress2().substring(0, i2));
                    list.add(message.getSendAddress2().substring(i2 + 1));
                } else {
                    list.add(message.getSendAddress2());
                }
            }
            list.add(message.getSendCity() + "  " + message.getSendProvCode() + "  " + message.getSendPostcode());
            list.add(message.getSendMobile());
    
            //添加收货人信息
            list.add("Ship To:" + message.getReceiveName());
            //判断收货人地址1
            if (message.getReceiveAddress1().length() > 30) {
                String sb3 = message.getReceiveAddress1().substring(0, 30);
                int i3 = sb3.lastIndexOf(" ");
                list.add(message.getReceiveAddress1().substring(0, i3));
                list.add(message.getReceiveAddress1().substring(i3 + 1));
            } else {
                list.add(message.getReceiveAddress1());
            }
            //判断收获人地址2
            if (message.getReceiveAddress2() != null) {
                if (message.getReceiveAddress2().length() > 30) {
                    String sb4 = message.getReceiveAddress2().substring(0, 30);
                    int i4 = sb4.lastIndexOf(" ");
                    list.add(message.getReceiveAddress2().substring(0, i4));
                    list.add(message.getReceiveAddress2().substring(i4 + 1));
                } else {
                    list.add(message.getReceiveAddress2());
                }
            }
            list.add(message.getReceiveCity() + "  " + message.getReceivePrvoCode() + "  " + message.getSendPostcode());
            list.add(message.getReceiveMobile());
    
            int y = 340;
    
            for (int j = 0; j < list.size(); j++) {
                if (j == 0) {
                    image = pngAlterUtil.modifyImage(image, null, null, null, list.get(j), 45, y, j);
                } else if (list.get(j).contains("Ship To:")) {
                    z = j;
                    y = y + 40;
                    image = pngAlterUtil.modifyImage(image, null, null, null, list.get(j), 5, y, j);
                } else {
                    image = pngAlterUtil.modifyImage(image, null, null, null, list.get(j), 96, y, j);
                }
                y = y + 20;
            }
            //将生成的新lable保存到本地
            pngAlterUtil.writeImageLocal(path, image);
        }
    }
    

    2.根据单号生成条形码工具类架包

        <!--条形码工具-->
            <dependency>
                <groupId>net.sf.barcode4j</groupId>
                <artifactId>barcode4j-light</artifactId>
                <version>2.0</version>
        </dependency>
    

    2.1   根据单号生成条形码工具类

    package com.mz.usps.common.util;
    
    import org.apache.commons.lang3.StringUtils;
    import org.krysalis.barcode4j.BarcodeDimension;
    import org.krysalis.barcode4j.impl.code128.Code128Bean;
    import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
    import org.krysalis.barcode4j.tools.UnitConv;
    
    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    import java.io.*;
    
    /**
     * 生成条形码工具
     *
     * @author sjl
     * @date 2019-04-25 10:44
     */
    public class BarCodesUtil {
    
        /**
         * 生成文件
         *
         * @param msg
         * @param
         * @return
         */
        public static BufferedImage generateFile(String msg) {
    //        String path = "C:\usr\local\tomcatusps\apache-tomcat-8.5.15\Root\label\barCode.png";
            String path = "/usr/local/tomcatusps/apache-tomcat-8.5.15/Root/overspread/barCode.png";
    
            BufferedImage read = null;
            File file = new File(path);
            try {
                //将条形码存入本地
                generate(msg, new FileOutputStream(file));
                read = ImageIO.read(file);
            } catch (FileNotFoundException e) {
                throw new RuntimeException(e);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return read;
        }
    
        /**
         * 生成字节
         *
         * @param msg
         * @return
         */
        public static byte[] generate(String msg) {
            ByteArrayOutputStream ous = new ByteArrayOutputStream();
            generate(msg, ous);
            return ous.toByteArray();
        }
    
        /**
         * 生成到流
         *
         * @param msg
         * @param ous
         */
        public static void generate(String msg, OutputStream ous) {
            if (StringUtils.isEmpty(msg) || ous == null) {
                return;
            }
    
    //        Code39Bean bean = new Code39Bean();
            Code128Bean bean = new Code128Bean();
    
            // 精细度
            final int dpi = 30;
            // module宽度
            final double moduleWidth = UnitConv.in2mm(0.5f / dpi);
    
            // 配置对象
            bean.setModuleWidth(3);
    //        bean.setWideFactor(5);
            bean.setBarHeight(20);
            bean.setFontSize(20);
            bean.doQuietZone(false);
    
    
            String format = "image/png";
    
    
            BarcodeDimension barcodeDimension = bean.calcDimensions(msg);
    
            try {
    
                // 输出到流
                BitmapCanvasProvider canvas = new BitmapCanvasProvider(ous, format, dpi,
                        BufferedImage.TYPE_BYTE_BINARY, false, 0);
    
                // 生成条形码
                bean.generateBarcode(canvas, msg);
    
                // 结束绘制
                canvas.finish();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
    

      

  • 相关阅读:
    二叉搜索树第k个节点
    序列化二叉树
    atoi()和stoi()函数
    02.规划过程组表格-风险数据表
    02.规划过程组表格-风险概率和影响评估
    02.规划过程组表格-风险登记册
    02.规划过程组表格-风险管理计划
    02.规划过程组表格-沟通管理计划
    02.规划过程组表格-人力资源管理计划
    02.规划过程组表格-责任分配矩阵
  • 原文地址:https://www.cnblogs.com/shijl/p/10773398.html
Copyright © 2011-2022 走看看