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", , , , Color.white, Color.black,
new Font(null, Font.BOLD, ), "D:/right.jpg");
createJpgByFontAndAlign("生成图片", "center", , , , Color.white, Color.black,
new Font(null, Font.BOLD, ), "D:/center.jpg");
createJpgByFontAndAlign("生成图片", "left", , , , Color.white, Color.black,
new Font(null, Font.BOLD, ), "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(, , width, height); // 画一个矩形
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON); // 去除锯齿(当设置的字体过大的时候,会出现锯齿)
g.setColor(fontcolor); // 字的颜色
g.setFont(font); // 字体字形字号 int size = font.getSize(); //文字大小
int x = ;
if(align.equals("left")){
x = ;
} else if(align.equals("right")){
x = width - size * s.length() - ;
} else if(align.equals("center")){
x = (width - size * s.length())/;
}
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绘制图片并进行合成的更多相关文章
- Java中图片压缩处理
原文http://cuisuqiang.iteye.com/blog/2045855 整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享. 首先,要压缩的图片格式不能说动态图片,你 ...
- java Swing 图片缓冲机制
java Swing 图片缓冲机制: 参考:http://jorneyr.iteye.com/blog/868858#comments package util; import java.awt.ge ...
- java实现图片压缩
java实现图片压缩 package Test; import java.awt.Image; import java.awt.image.BufferedImage; import java.io. ...
- UWP&WP8.1 重新绘制图片 WriteableBitmap用法 图片转byte[]数组,byte[]数组转图片
---恢复内容开始--- WriteableBitmap 是UWP和WP8.1绘制图片的,重组图片的最重要方法.方法较为简单,方法多样性. 通过查看文档,WriteableBitmap的继承性是 ...
- java获取图片原始尺寸
java获取图片原始尺寸 URL url = null; InputStream is = null; BufferedImage img = null; try { url = new URL(pi ...
- html5 绘制图片 drawImage
要在绘图上下文中绘制图片,可以使用 drawImage 方法.该方法有三种不同的参数: drawImage(image,dx,dy) drawImage(image,dx,dy,dw,dh) d ...
- 使用html5 canvas绘制图片
注意:本文属于<html5 Canvas绘制图形入门详解>系列文章中的一部分.如果你是html5初学者,仅仅阅读本文,可能无法较深入的理解canvas,甚至无法顺畅地通读本文.请点击上述链 ...
- Android Canvas使用drawBitmap绘制图片
1.基本的绘制图片方法 //Bitmap:图片对象,left:偏移左边的位置,top: 偏移顶部的位置 drawBitmap(Bitmap bitmap, float left, float top, ...
- android中Canvas使用drawBitmap绘制图片
1.主要的绘制图片方法 //Bitmap:图片对象,left:偏移左边的位置,top: 偏移顶部的位置 drawBitmap(Bitmap bitmap, float left, float ...
随机推荐
- day 21 01 序列化模块和模块的导入的复习以及包的初识
day 21 01 序列化和模块的导入的复习以及包的初识 1.序列化模块 什么是序列化模块:数据类型转化成字符串的过程就是序列卷 为什么要使用序列化模块:为了方便存储和网络传输 三种序列化模块: (1 ...
- 接口文档神器Swagger(上篇)
本文来自网易云社区 作者:李哲 接口文档管理一直是一个让人头疼的问题,伴随着各种接口文档管理平台涌现,如阿里开源的rap,ShowDoc,sosoapi,等等(网上能找到很多这种管理平台,包括我们自己 ...
- [国家集训队] tree Ⅱ
bzoj2631(权限题...):链接 落咕:链接 考察的是LCT维护链上信息. 但是这个题不一样的是又有加法又有乘法...(有木有想到落咕的模板--线段树2qwq) 因为乘法的运算优先度比加法高,所 ...
- 深入了解java虚拟机(JVM) 第五章 如何判断对象为垃圾对象
本章开始学习垃圾回收的过程,垃圾回收的过程首先就是要确定对象是否是垃圾对象,如果是垃圾对象,垃圾回收器才会进行回收.垃圾回收主要又两种算法:引用计数算法和可达性分析算法. 一.引用计数算法 引用计数算 ...
- codeforces785E
http://codeforces.com/contest/785/problem/E 一道经典的求逆序对的题目,可以用树状数组套平衡树解决 平衡树需要支持插入一个数,删除一个数,找比 x 小的数的个 ...
- 洛谷P3783 [SDOI2017]天才黑客(前后缀优化建图+虚树+最短路)
题面 传送门 题解 去看\(shadowice\)巨巨写得前后缀优化建图吧 话说我似乎连线段树优化建图的做法都不会 //minamoto #include<bits/stdc++.h> # ...
- P4098 [HEOI2013]ALO 可持久化01Trie
$ \color{#0066ff}{ 题目描述 }$ Welcome to ALO ( Arithmetic and Logistic Online).这是一个 VR MMORPG, 如名字所见,到处 ...
- 【UVA11324】 The Largest Clique (Tarjan+topsort/记忆化搜索)
UVA11324 The Largest Clique 题目描述 给你一张有向图 \(G\),求一个结点数最大的结点集,使得该结点集中的任意两个结点 \(u\) 和 \(v\) 满足:要么 \(u\) ...
- 【BZOJ1296】[SCOI2009]粉刷匠 (DP+背包)
[SCOI2009]粉刷匠 题目描述 \(windy\)有 \(N\) 条木板需要被粉刷. 每条木板被分为 \(M\) 个格子. 每个格子要被刷成红色或蓝色. \(windy\)每次粉刷,只能选择一条 ...
- 进阶篇:2)DFMA方法的运用
本章目的:DFMA方法运用,引导后面的章节.(运用比只理解重要!) 1.DFMA概述 1.1 DFMA的由来 工艺粗略可分为装配工艺和制造工艺.在这里,我们所讲的“制造”是指产品或部件的某个零件的制造 ...