图片处理工具类,
包括:读取本地图片、网络图片,图片合成(图片水印),图片上写文字(文字水印),16进制和Color对象的互转
package com.chat;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.PixelGrabber;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
/**
* 图片处理工具类
*
* @author Daven
*
*/
public class ImgUtil {
public static void main(String[] args) {
ImgUtil.composePic("D:/back.png", "http://t3.qlogo.cn/mbloghead/d387538f629cfb53c2b0/100", "D:/output.png", 53, 161);
}
/**
* 合成图片(类似图片水印)
* @param backImage 背景图片对象
* @param headImage 用户头像对象
* @param outPutPath 输出路径(D:/img/out.png)
* @param leftX 距离目标图片左侧的偏移量
* @param leftY 距离目标图片左侧的偏移量
* @throws InterruptedException
* @throws IOException
*/
public static void composePic(Image backImage, Image headImage,
String outPutPath, int leftX, int leftY)
throws InterruptedException, IOException {
// 图片的高/宽度
int bwidth = backImage.getWidth(null);
int bheight = backImage.getHeight(null);
int hwidth = headImage.getWidth(null);
int hheight = headImage.getHeight(null);
int alphaType = BufferedImage.TYPE_INT_RGB;
/*if (hasAlpha(backImage)) {
alphaType = BufferedImage.TYPE_INT_ARGB;
}*/
// 画图
BufferedImage backgroundImage = new BufferedImage(bwidth, bheight, alphaType);
Graphics2D graphics2D = backgroundImage.createGraphics();
graphics2D.drawImage(backImage, 0, 0, null);
graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 1));
graphics2D.drawImage(headImage, leftX, leftY, hwidth, hheight, null);
// 输出
ImageIO.write(backgroundImage, "png", new File(outPutPath));
}
/**
* 合成图片
* @param backPicPath 背景图片本地路径
* @param headPicUrl 用户头像网络url
* @param outPutPath 输出路径(D:/img/out.png)
* @param leftX 距离目标图片左侧的偏移量
* @param leftY 距离目标图片左侧的偏移量
*/
public static void composePic(String backPicPath, String headPicUrl,
String outPutPath, int leftX, int leftY) {
try {
// 读取背景图片
Image backImage = ImgUtil.loadImageLocal(backPicPath);
// 加昵称
int ln = ImgUtil.getLength("深水鱼的马甲") * 24;
backImage = ImgUtil.pressText("深水鱼的马甲", backImage, "微软雅黑", Font.BOLD,
ImgUtil.String2Color("#FFFFFF"), 24, 175+(266-ln)/2, 188, 1);
// 得分
backImage = ImgUtil.pressText("100分", backImage, "华康海报体W12(P)", Font.LAYOUT_NO_LIMIT_CONTEXT,
ImgUtil.String2Color("#FD6E10"), 22, 280, 233, 1);
// 收益
backImage = ImgUtil.pressText("85%", backImage, "迷你简凌波", Font.LAYOUT_NO_LIMIT_CONTEXT,
ImgUtil.String2Color("#E60000"), 24, 368, 264, 1);
// 称号
int lc = ImgUtil.getLength("有股神潜力,万众膜拜!") * 32;
backImage = ImgUtil.pressText("有股神潜力,万众膜拜!", backImage, "华康海报体W12(P)", Font.LAYOUT_NO_LIMIT_CONTEXT,
ImgUtil.String2Color("#880000"), 32, (488-lc)/2, 310, 1);
// 读取头像图片
Image headImage = ImgUtil.loadImageUrl(headPicUrl);
// 图像
ImgUtil.composePic(backImage, headImage, outPutPath, leftX, leftY);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 图片上加文字(文字水印)
* @param pressText 水印文字
* @param targetImg 目标图片
* @param fontName 字体名称
* @param fontStyle 字体样式,如:粗体和斜体(Font.BOLD|Font.ITALIC)
* @param color 字体颜色
* @param fontSize 字体大小
* @param x 水印文字距离目标图片左侧的偏移量
* @param y 水印文字距离目标图片上侧的偏移量
* @param alpha 透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明)
* @throws IOException
*/
public static BufferedImage pressText(String pressText, Image targetImg, String fontName, int fontStyle,
Color color, int fontSize, int x, int y, float alpha) throws IOException {
// 图片宽高
int width = targetImg.getWidth(null);
int height = targetImg.getHeight(null);
//样式
Font font = new Font(fontName, fontStyle, fontSize);
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.drawImage(targetImg, 0, 0, width, height, null);
g.setColor(color);// 颜色
g.setFont(font);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
g.drawString(pressText, x, y);
g.dispose();
return image;
}
/**
* 是否开启alpha通道
*
* @param image
* @return
* @throws InterruptedException
*/
public static boolean hasAlpha(Image image)
throws InterruptedException {
if (image instanceof BufferedImage) {
BufferedImage bimage = (BufferedImage) image;
return bimage.getColorModel().hasAlpha();
}
PixelGrabber pGrabber = new PixelGrabber(image, 0, 0, 1, 1, false);
pGrabber.grabPixels();
ColorModel colorModel = pGrabber.getColorModel();
return colorModel.hasAlpha();
}
/**
* 导入本地图片到缓冲区
* @param imgPath 本地的图片地址
* @return
* @throws IOException
*/
public static BufferedImage loadImageLocal(String imgPath)
throws IOException {
return ImageIO.read(new File(imgPath));
}
/**
* 导入网络图片到缓冲区
* @param imgUrl 网络图片url
* @return
* @throws IOException
*/
public static BufferedImage loadImageUrl(String imgUrl)
throws IOException {
URL url = new URL(imgUrl);
return ImageIO.read(url);
}
/**
* 16进制转Color对象
* @param str
* @return
*/
public static Color String2Color(String str) {
int i = Integer.parseInt(str.substring(1), 16);
return new Color(i);
}
/**
* Color对象转16进制
* @param color
* @return
*/
public static String Color2String(Color color) {
String R = Integer.toHexString(color.getRed());
R = R.length()<2?('0'+R):R;
String B = Integer.toHexString(color.getBlue());
B = B.length()<2?('0'+B):B;
String G = Integer.toHexString(color.getGreen());
G = G.length()<2?('0'+G):G;
return '#'+R+B+G;
}
/**
* 获取字符长度,一个汉字作为 1 个字符, 一个英文字母作为 0.5 个字符
* @param text
* @return 字符长度,如:text="中国",返回 2
* text="test",返回 2
* text="中国ABC",返回 4
*/
public static int getLength(String text) {
int textLength = text.length();
int length = textLength;
for (int i = 0; i < textLength; i++) {
if (String.valueOf(text.charAt(i)).getBytes().length > 1) {
length++;
}
}
return (length % 2 == 0) ? length / 2 : length / 2 + 1;
}
}
原始图片:
效果图片: