Java绘制图片并进行合成

Posted 多读书,少说话

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
    }

  

}

 

以上是关于Java绘制图片并进行合成的主要内容,如果未能解决你的问题,请参考以下文章

一次用ffmpeg实现图片+音频合成视频的开发

vue将地址转成二维码,与图片合成海报

有没有办法将2个非常相似的代码片段组合成一个函数并重复?

java合成图片并添加文字

ImageCombinerx-easypdf与EasyExcel

iOS效果集自绘制酷炫粒子效果合成图片