JAVA工具类之多图片合成与图片添加文字
package ;
import ;
import ;
import .Graphics2D;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import .;
/**
* <p>Title: PictureMerge</p>
* <p>Description: 图片合并</p>
* <p>Company: DINGGE</p>
* @author FANQIBU
* @date 2017年12月1日
*/
public class PictureMerge {
/**
* @param fileUrl
* 文件绝对路径或相对路径
* @return 读取到的缓存图像
* @throws IOException
* 路径错误或者不存在该文件时抛出IO异常
*/
public static BufferedImage getBufferedImage(String fileUrl)throws IOException {
File f = new File(fileUrl);
return (f);
}
/**
* @param savedImg
* 待保存的图像
* @param saveDir
* 保存的目录
* @param fileName
* 保存的文件名,必须带后缀,比如 ""
* @param format
* 文件格式:jpg、png或者bmp
* @return
*/
public static boolean saveImage(BufferedImage savedImg, String saveDir,String fileName, String format) {
boolean flag = false;
// 先检查保存的图片格式是否正确
String[] legalFormats = { "jpg", "JPG", "png", "PNG", "bmp", "BMP" };
int i = 0;
for (i = 0; i < ; i++) {
if ((legalFormats[i])) {
break;
}
}
if (i == ) { // 图片格式不支持
("不是保存所支持的图片格式!");
return false;
}
// 再检查文件后缀和保存的格式是否一致
String postfix = (('.') + 1);
if (!(format)) {
("待保存文件后缀和保存的格式不一致!");
return false;
}
String fileUrl = saveDir + fileName;
File file = new File(fileUrl);
try {
flag = (savedImg, format, file);
} catch (IOException e) {
();
}
return flag;
}
/**
* 待合并的两张图必须满足这样的前提,如果水平方向合并,则高度必须相等;如果是垂直方向合并,宽度必须相等。
* mergeImage方法不做判断,自己判断。
*
* @param img1
* 待合并的第一张图
* @param img2
* 带合并的第二张图
* @param isHorizontal
* 为true时表示水平方向合并,为false时表示垂直方向合并
* @return 返回合并后的BufferedImage对象
* @throws IOException
*/
public static BufferedImage mergeImage(BufferedImage img1, BufferedImage img2, boolean isHorizontal,int startX, int startY)throws IOException {
int w1 = ();
int h1 = ();
int w2 = ();
int h2 = ();
// 从图片中读取RGB
int[] ImageArrayOne = new int[w1 * h1];
ImageArrayOne = (0, 0, w1, h1, ImageArrayOne, 0, w1); // 逐行扫描图像中各个像素的RGB到数组中
int[] ImageArrayTwo = new int[w2 * h2];
ImageArrayTwo = (0, 0, w2, h2, ImageArrayTwo, 0, w2);
// 生成新图片
BufferedImage DestImage = null;
if (isHorizontal) { // 水平方向合并
DestImage = new BufferedImage(w1, h1, BufferedImage.TYPE_INT_RGB);
(0, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
(startX,startY, w2, h2, ImageArrayTwo, 0, w2); // 设置下半部分的RGB
} else { // 垂直方向合并
DestImage = new BufferedImage(w1, h1 + h2,BufferedImage.TYPE_INT_RGB);
(0, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
(0, h1, w2, h2, ImageArrayTwo, 0, w2); // 设置下半部分的RGB
}
return DestImage;
}
/**
* <p>Title: getImageStream</p>
* <p>Description: 获取图片InputStream</p>
* @param destImg
* @return
*/
public static InputStream getImageStream( BufferedImage destImg){
InputStream is = null;
BufferedImage bi = destImg;
ByteArrayOutputStream bs = new ByteArrayOutputStream();
ImageOutputStream imOut;
try {
imOut = (bs);
(bi, "png",imOut);
is= new ByteArrayInputStream(());
} catch (IOException e) {
();
}
return is;
}
/**
* <p>Title: drawTextInImg</p>
* <p>Description: 图片上添加文字业务需求要在图片上添加水</p>
* @param filePath
* @param outPath
* @param text
*/
public static BufferedImage drawTextInImg(BufferedImage bimage,FontText text,int left,int top) {
Graphics2D g = ();
(getColor(text.getWm_text_color()));
();
Font font = new Font(text.getWm_text_font(), ,
text.getWm_text_size());
(font);
//(().getBytes(), 0,().getBytes().length, left-50, top-50);
((), left, top);
();
return bimage;
}
// color #2395439
public static Color getColor(String color) {
if ((0) == '#') {
color = (1);
}
if (() != 6) {
return null;
}
try {
int r = ((0, 2), 16);
int g = ((2, 4), 16);
int b = ((4), 16);
return new Color(r, g, b);
} catch (NumberFormatException nfe) {
return null;
}
}
/**
* <p>Title: myQr</p>
* <p>Description: 生成我的二维码</p>
* @param headurl
* @param wxqr
* @return
*/
/**
* <p>Title: myQr</p>
* <p>Description: </p>
* @param openid
* @param headurl
* @param wxqr
* @return
*/
public static BufferedImage myQr(String nickname,String openid,String headurl,String wxqr) {
Properties pro = new Properties();
try {
(("/"));
} catch (IOException e) {
();
}
// 读取待合并的文件
BufferedImage bi1 = null;
BufferedImage bi2 = null;
BufferedImage bi3 = null;
// 调用mergeImage方法获得合并后的图像
BufferedImage destImg = null;
String baseurl=("/").toString().replace("file:/", "");
if("0".equals((""))){
baseurl="/"+baseurl;
//baseurl="/src";
}
/*("用户Openid:"+openid);
("用户头像:"+headurl);
("用户带参二维码:"+wxqr);
("推广二维码模板:"+baseurl+"qrimg/");*/
try {
File fTemp = new File(baseurl+"qrimg/");
//File uTemp = new File(baseurl+"qrimg/"+openid+".png");
File uTemp = new File(baseurl+"qrimg/"+new Date().getTime()+".png");
("OLD模板:"+()+"NEW模板:"+());
(fTemp, uTemp);
bi1 = (uTemp);
();
/**缓存推广二维码*/
InputStream qrInputStream = FileUtils
.getInputStreamByGet(wxqr);
bi2 =( (qrInputStream),1,120,120);
/**缓存头像*/
if((headurl)){
headurl=baseurl+"qrimg/";
}
InputStream headInputStream = FileUtils
.getInputStreamByGet(headurl);
BufferedImage headImage=(headInputStream);
bi3 =( headImage,-1,113,113);
} catch (IOException e) {
();
}
// 调用mergeImage方法获得合并后的图像
try {
int w1 = ();
int fw1=w1;
int h1 = ();
int fh1=h1;
int w2 = ();
int fw2=w2;
int h2 = ();
int fh2=h2;
destImg = mergeImage(bi1, bi2, true,(w1/2-w2/2),(h1/2-h2/2-60));
w1 = ();
h1 = ();
w2 = ();
h2 = ();
(w2+"==="+h2);
int startX=w1/4-w2/4+w2*3-40;
int startY=h1/2-h2/2-h2*4-20;
destImg = mergeImage(destImg, bi3, true,startX,startY);
/**为图片添加昵称*/
destImg=drawTextInImg(destImg, new FontText((nickname),3, "#FFFFF", 25, "宋体"),(fw1/2-fw2/2)*3-80,(fh1/2-fh2-150));
} catch (IOException e) {
();
}
return destImg;
// 保存图像
//saveImage(destImg, baseurl, "qrimg/", "png");
//("水平合并完毕!");
}
public static void main(String[] args) {
String baseurl=new PictureMerge().getClass().getResource("/").toString().replace("file:/", "");
BufferedImage destImg = myQr("LC[0xf0][0x9f][0x98][0x8a]","oIhOc0hzx-ljAH_QQOTD2ImoylvQ","/mmopen/PiajxSqBRaELjvm6Ld5SUYzfRE0vjlDYa81AnkAjAS5Ifo4vdAZpoJicHGsYDEDTP8icecibDtkX92icbRNic7IsumSA/0",
"/cgi-bin/showqrcode?ticket=gQGM8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyeElmZTlYUDE4cV8xMDAwME0wN0QAAgR5GSJaAwQAAAAA");
saveImage(destImg, baseurl, "qrimg/", "png");
}
}