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绘制图片并进行合成的主要内容,如果未能解决你的问题,请参考以下文章