public class ImageUtil {
/**
* 颜色转换
* */
private static Color fromStrToARGB(String str) {
String str1 = str.substring(1, 3);
String str2 = str.substring(3, 5);
String str3 = str.substring(5, 7);
int red = Integer.parseInt(str1, 16);
int green = Integer.parseInt(str2, 16);
int blue = Integer.parseInt(str3, 16);
if (str.length()==9){
String str4 = str.substring(7, 9);
int alpha = Integer.parseInt(str4, 16);
return new Color(red, green, blue, alpha);
}else {
return new Color(red, green, blue);
}
}
/**
* 创建Graphics2D
*
* @param bgBufImage
* 底图
* @return Graphics2D
*/
private static Graphics2D createG2D(BufferedImage bgBufImage){
Graphics2D bgBufImageGraphics = bgBufImage.createGraphics();
bgBufImageGraphics.setRenderingHint(SunHints.KEY_ANTIALIASING, SunHints.VALUE_ANTIALIAS_OFF);
bgBufImageGraphics.setRenderingHint(SunHints.KEY_TEXT_ANTIALIASING, SunHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
bgBufImageGraphics.setRenderingHint(SunHints.KEY_STROKE_CONTROL, SunHints.VALUE_STROKE_DEFAULT);
bgBufImageGraphics.setRenderingHint(SunHints.KEY_TEXT_ANTIALIAS_LCD_CONTRAST, 140);
bgBufImageGraphics.setRenderingHint(SunHints.KEY_FRACTIONALMETRICS, SunHints.VALUE_FRACTIONALMETRICS_OFF);
bgBufImageGraphics.setRenderingHint(SunHints.KEY_RENDERING, SunHints.VALUE_RENDER_DEFAULT);
return bgBufImageGraphics;
}
/**
* 绘制海报底色(默认微软雅黑/PLAIN/32)
*
* @param bgBufImage
* 底图
* @param color
* 颜色
*/
private static void setBackGroup(BufferedImage bgBufImage,String color){
Graphics2D bgBufImageGraphics = createG2D(bgBufImage);
bgBufImageGraphics.setBackground(fromStrToARGB(color));//填充整个屏幕
bgBufImageGraphics.clearRect(0,0,bgBufImage.getWidth(),bgBufImage.getHeight());
bgBufImageGraphics.dispose();
}
/**
* 绘制海报文字(默认微软雅黑/PLAIN/32)
*
* @param basebBI
* 底图
* @param text
* 文本
* @param x
* 坐标 x
* @param y
* 坐标 y
* @param color
* 颜色
* @param font
* 字体
*/
private static void drawText(BufferedImage basebBI, String text, int x, int y, String color, Font font) {
// 抗锯齿
if (font == null) {
font = new Font("微软雅黑", Font.PLAIN, 32);
}
Graphics2D g2D = createG2D(basebBI);
g2D.setFont(font);
g2D.setPaint(new Color(0, 0, 0, 64));
// 先绘制一遍底色
g2D.drawString(text, x, y);
g2D.setPaint(fromStrToARGB(color));
// 再绘制一遍文字
// 由于部分情况会出现文字模糊的情况,保险起见才出此对策。
g2D.drawString(text, x, y);
g2D.dispose();
}
/**
* 绘制海报文字(换行)
*
* @param basebBI
* 底图
* @param text
* 文本
* @param x
* 位置:x
* @param y
* 位置:y
* @param lineHeight
* 单行行高
* @param lineWidth
* 单行行宽
* @param color
* 文本颜色
* @param font
* 文本字体
* @param limitLineNum
* 限制行数
* @param backgroundWidth
* 底背位置(多行文字绘制时,出现为单行时居中的区域宽度。)
*/
private static void drawTextNewLine(BufferedImage basebBI, String text, int x, int y, int lineHeight,
int lineWidth, String color, Font font, int limitLineNum, int backgroundWidth) {
Graphics2D graphics = createG2D(basebBI);
if (font == null){
font = new Font("微软雅黑", Font.PLAIN, 32);
}
graphics.setFont(font);
graphics.setPaint(fromStrToARGB(color));
//计算字符串所占屏幕长度
FontRenderContext frc = graphics.getFontRenderContext();
graphics.getFontRenderContext();
//记录行数
List lineList = new ArrayList<>();
if (backgroundWidth > 0) {
x = (backgroundWidth - lineWidth) / 2;
}
int stringIndex =0;
StringBuilder tmpLineString = new StringBuilder("");
while (stringIndex < text.length()) {
String tmp_char =text.substring(stringIndex,stringIndex+1);
Rectangle2D tempStringBounds = font.getStringBounds(tmpLineString+tmp_char, frc);
double width = tempStringBounds.getWidth();
if (width>lineWidth){
lineList.add(tmpLineString.toString());
tmpLineString = new StringBuilder("");
}
tmpLineString = tmpLineString.append(tmp_char);
stringIndex++;
}
// Color.BLACK 。字体颜色
graphics.setPaint(fromStrToARGB(color));
if (lineHeight == 0) {
lineHeight = 35;
}
for (int i = 0; i < lineList.size(); i++) {
String lineStr = lineList.get(i);
double width = font.getStringBounds(lineStr, frc).getWidth();
double diffWidth = font.getStringBounds("...", frc).getWidth();
if (i > limitLineNum -1) {
break;
}else if (i == limitLineNum -1 && lineWidth -width iterator = ImageIO.getImageWritersByFormatName("jpeg");
ImageWriter imageWriter = iterator.next();
ImageWriteParam imageWriteParam = imageWriter.getDefaultWriteParam();
imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
imageWriteParam.setCompressionQuality(1);
imageWriter.setOutput( ImageIO.createImageOutputStream(new FileOutputStream(new File(path))));
IIOImage iio_image = new IIOImage(bgBufImage, null, null);
imageWriter.write(null, iio_image, imageWriteParam);
imageWriter.dispose();
}
public static void drawImage() throws Exception {
//二维码
String qrCodeImageUrl = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1553504957130&di=02fae20a5c0f885d52299b2b1d682c86&imgtype=0&src=http%3A%2F%2Fimg.atobo.com%2FProductImg%2FEWM%2FUWeb%2F3%2F2%2F1%2F3%2F061%2F3213061%2F1.gif";
//头像
String headUrl = "http://pic.51yuansu.com/pic3/cover/00/63/25/589bdedf5475d_610.jpg";
BufferedImage bgBufImage = new BufferedImage(750, 1334,
BufferedImage.TYPE_INT_RGB);
setBackGroup(bgBufImage, "#FF0000");
drawImage(bgBufImage,qrCodeImageUrl,bgBufImage.getWidth()-200,10,-1,-1);
drawImage(bgBufImage,getRoundImage(headUrl,-1,-1),100,100,200,200);
drawText(bgBufImage,"测试",0,100,"#000000",null);
drawTextNewLine(bgBufImage,
"测试圣诞快乐数据库里搭街坊卡拉手机打开拉萨奥斯陆冬季开发了喀什假大空立法解释考虑",
0,100,35,200,"#000000",null,3,750);
saveImage(bgBufImage,"E:\\demo1.jpeg");
}
public static void main(String[] args) {
try {
drawImage();
} catch (Exception e) {
e.printStackTrace();
}
}
}