• 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);
        }
    
      
    
    }
  • 相关阅读:
    C++学习9 this指针详解
    福建省第八届 Triangles
    UVA 11584 Partitioning by Palindromes
    POJ 2752 Seek the Name, Seek the Fame
    UVA 11437 Triangle Fun
    UVA 11488 Hyper Prefix Sets (字典树)
    HDU 2988 Dark roads(kruskal模板题)
    HDU 1385 Minimum Transport Cost
    HDU 2112 HDU Today
    HDU 1548 A strange lift(最短路&&bfs)
  • 原文地址:https://www.cnblogs.com/Java-Starter/p/9283553.html
Copyright © 2020-2023  润新知