• Java绘制图片并进行合成


    以下代码可以生成六行两列的图片,代码改成了可以接受参数可循环的。

    package com.xgt.util;
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileOutputStream;
    
    
    public class ImgUtil {
        private static final Logger logger = LoggerFactory.getLogger(ImgUtil.class);
        public static Integer width = 500;
    
        public static Integer height = 500;
    
        public static void main(String[] args) {
            try {
                ImgUtil test = new ImgUtil();
               // test.ImageTset();
            } catch (Exception e) {
                System.out.print(e);
            }
        }
    
        /**
         * 注释勿删,测试有用
         * 生成图片,合成图片
         * @param fileDirectory
         * @param realnames
         * @throws Exception
         */
        public static void ImageTset(String fileDirectory,String[] realnames) throws Exception {
    
            /*File _file1 = new File("D:\QRCodePng\奥特曼.png");
            File _file2 = FontImageUtil.createJpgByFontAndAlign("奥特曼", "center", 32, 150, 50, Color.white, Color.black,
                    new Font(null, Font.BOLD, 32), "D:\QRCodePng\奥特曼.jpg");
            File _file3 = new File("D:\QRCodePng\谷阿莫.png");
            File _file4 = FontImageUtil.createJpgByFontAndAlign("谷阿莫", "center", 32, 150, 50, Color.white, Color.black,
                    new Font(null, Font.BOLD, 32), "D:\QRCodePng\谷阿莫.jpg");
            File _file5 = new File("D:\QRCodePng\怪兽.png");
            File _file6 = FontImageUtil.createJpgByFontAndAlign("怪兽", "center", 32, 150, 50, Color.white, Color.black,
                    new Font(null, Font.BOLD, 32), "D:\QRCodePng\怪兽.jpg");
            File _file7 = new File("D:\QRCodePng\蓝胖.png");
            File _file8 = FontImageUtil.createJpgByFontAndAlign("蓝胖", "center", 32, 150, 50, Color.white, Color.black,
                    new Font(null, Font.BOLD, 32), "D:\QRCodePng\蓝胖.jpg");
            File _file9 = new File("D:\QRCodePng\淑女.png");
            File _file10 = FontImageUtil.createJpgByFontAndAlign("淑女", "center", 32, 150, 50, Color.white, Color.black,
                    new Font(null, Font.BOLD, 32), "D:\QRCodePng\淑女.jpg");
            File _file11 = new File("D:\QRCodePng\小草.png");
            File _file12 = FontImageUtil.createJpgByFontAndAlign("小草", "center", 32, 150, 50, Color.white, Color.black,
                    new Font(null, Font.BOLD, 32), "D:\QRCodePng\小草.jpg");
            Image src1 = javax.imageio.ImageIO.read(_file1);
            Image src2 = javax.imageio.ImageIO.read(_file2);
            Image src3 = javax.imageio.ImageIO.read(_file3);
            Image src4 = javax.imageio.ImageIO.read(_file4);
            Image src5 = javax.imageio.ImageIO.read(_file5);
            Image src6 = javax.imageio.ImageIO.read(_file6);
            Image src7 = javax.imageio.ImageIO.read(_file7);
            Image src8 = javax.imageio.ImageIO.read(_file8);
            Image src9 = javax.imageio.ImageIO.read(_file9);
            Image src10 = javax.imageio.ImageIO.read(_file10);
            Image src11 = javax.imageio.ImageIO.read(_file11);
            Image src12 = javax.imageio.ImageIO.read(_file12);
            //获取图片的宽度
            int width = src1.getWidth(null);
            //获取图片的高度
            int height = src1.getHeight(null);*/
    
            //构造一个类型为预定义图像类型之一的 BufferedImage。 宽度为第一只的宽度,高度为各个图片高度之和
            BufferedImage tag = new BufferedImage(width + width, 4*height, BufferedImage.TYPE_INT_RGB);
            //创建输出流
            FileOutputStream out = new FileOutputStream("D:\QRCodePng\合成图.png");
            //绘制合成图像
            Graphics g = tag.createGraphics();
    
            /**
             * 此方法最多六行两列,6张二维码图和对应的6张文字图
             * 如需扩展,要重新调整尺寸
             * x=0,2,4,6,8...
             * x对4取余为0存在线性关系,y=x/3
             * x对4取余不为0存在线性关系,y=(x-2)/3
             * x=1,3,5,7,9...
             * x对4取余为1存在线性关系,y=(4x+2)/3
             * x对4取余不为1存在线性关系,y=x/3
             */
            for(int i=0;i<realnames.length*2;i++){
                if(i%2==0) {
                    File _file = new File(fileDirectory,realnames[i/2]+".png");
                    Image src = javax.imageio.ImageIO.read(_file);
                    if(i%4==0){
                        g.drawImage(src, 0, i*height/3, width, height, null);
                    }else {
                        g.drawImage(src, width, (i-2)*height/3, width, height, null);
                    }
                }else{
                    File _file = FontImageUtil.createJpgByFontAndAlign(realnames[(i-1)/2], "center", 32, 150, 50, Color.white, Color.black,
                            new Font(null, Font.BOLD, 32), fileDirectory+"\"+realnames[(i-1)/2]+".jpg");
                    Image src = javax.imageio.ImageIO.read(_file);
                    if(i%4==1){
                        g.drawImage(src, 0, (i+2)*height/3, width, height/3, null);
                    }else {
                        g.drawImage(src, width, i*height/3, width, height/3, null);
                    }
                }
            }
    
            /*g.drawImage(src1, 0, 0, width, height, null);
            g.drawImage(src2, 0, height, width, height/3, null);
            g.drawImage(src3, width, 0, width , height, null);
            g.drawImage(src4, width, height, width, height/3, null);
            g.drawImage(src5, 0, 4*height/3, width, height, null);
            g.drawImage(src6, 0, 7*height/3, width, height/3, null);
            g.drawImage(src7, width, 4*height/3, width, height, null);
            g.drawImage(src8, width, 7*height/3, width , height/3, null);
            g.drawImage(src9, 0, 8*height/3, width, height, null);
            g.drawImage(src10, 0, 11*height/3, width, height/3, null);
            g.drawImage(src11, width, 8*height/3, width, height, null);
            g.drawImage(src12, width, 11*height/3, width, height/3, null);*/
            // 释放此图形的上下文以及它使用的所有系统资源。
            g.dispose();
            //将绘制的图像生成至输出流
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            encoder.encode(tag);
            //关闭输出流
            out.close();
            logger.info("合成图出来了");
        }
    
    }

    工具类FontImageUtil.java

    package com.xgt.util;
    import com.google.zxing.EncodeHintType;
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGEncodeParam;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;
    import com.xgt.dto.ImgQrcodeDto;
    import com.xgt.entity.BuildLabourer;
    import com.xgt.service.BuildLabourerService;
    import net.glxn.qrgen.core.image.ImageType;
    import net.glxn.qrgen.javase.QRCode;
    import org.apache.commons.codec.binary.Base64;
    import org.apache.commons.io.IOUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.*;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.imageio.ImageIO;
    
    
    public class FontImageUtil {
    
        private static final Logger logger = LoggerFactory.getLogger(FontImageUtil.class);
        public static void main(String[] args) throws Exception {
            //createImage("谷阿莫", new Font("微软雅黑", Font.PLAIN, 32), new File("d:/a.png"), 150, 50);
    
            createJpgByFontAndAlign("生成图片", "right", 32, 150, 50, Color.white, Color.black,
                    new Font(null, Font.BOLD, 32), "D:/right.jpg");
            createJpgByFontAndAlign("生成图片", "center", 32, 150, 50, Color.white, Color.black,
                    new Font(null, Font.BOLD, 32), "D:/center.jpg");
            createJpgByFontAndAlign("生成图片", "left", 32, 150, 50, Color.white, Color.black,
                    new Font(null, Font.BOLD, 32), "D:/left.jpg");
        }/**
         * 根据提供的文字生成jpg图片
         *
         * @param s
         *            String 文字
         * @param align
         *            文字位置(left,right,center)
         * @param y
         *            y坐标
         * @param width
         *              图片宽度
         * @param height
         *              图片高度
         * @param bgcolor
         *            Color 背景色
         * @param fontcolor
         *            Color 字色
         * @param font
         *            Font 字体字形字号
         * @param jpgname
         *            String jpg图片名
         * @return
         */
        public static File createJpgByFontAndAlign(String s, String align, int y, int width, int height,
                                                       Color bgcolor, Color fontcolor, Font font, String jpgname) {
            try { // 宽度 高度
                BufferedImage bimage = new BufferedImage(width,
                        height, BufferedImage.TYPE_INT_RGB);
                Graphics2D g = bimage.createGraphics();
                g.setColor(bgcolor); // 背景色
                g.fillRect(0, 0, width, height); // 画一个矩形
                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON); // 去除锯齿(当设置的字体过大的时候,会出现锯齿)
                g.setColor(fontcolor); // 字的颜色
                g.setFont(font); // 字体字形字号
    
                int size = font.getSize();  //文字大小
                int x = 5;
                if(align.equals("left")){
                    x = 5;
                } else if(align.equals("right")){
                    x = width - size * s.length() - 5;
                } else if(align.equals("center")){
                    x = (width - size * s.length())/2;
                }
                g.drawString(s, x, y); // 在指定坐标除添加文字
                g.dispose();
                FileOutputStream out = new FileOutputStream(jpgname); // 指定输出文件
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
                JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bimage);
                param.setQuality(50f, true);
                encoder.encode(bimage, param); // 存盘
                out.flush();
                out.close();
            } catch (Exception e) {
                System.out.println("createJpgByFont Failed!");
                e.printStackTrace();
            }
            return new File(jpgname);
        }
    
      
    
    }
  • 相关阅读:
    报错Required String parameter 'customerInfo' is not present的原因及处理办法
    Mybatis 中$与#的区别
    ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql
    Git使用
    前后端分离
    对excel文件的读取
    POI导入和导出Excel总结
    git权限
    @RequestParam与@PathVariable
    lombok学习
  • 原文地址:https://www.cnblogs.com/Java-Starter/p/9283553.html
Copyright © 2020-2023  润新知