前两篇文章都是用 Graphics ,这个是用来绘制图片的
主要思路是:
BufferedImage buffImg = ImageIO.read("new File(E:/123.jpg)");
Graphics g = buffImg.getGraphics();
如果是绘制图片的话
g.drawImage(BufferedImage img,int x,int y);
如果是绘制文字的话
g.drawString(String str, int x,int y)
数据都在buffImg里,你可以对这个操作
ImageIO.write(buffImg,"jpg",new FileOutputStream(new File("E:/456.jpg")));
或者 上传OSS
OssFileUtil.uploadFile(buffImg, “jpg”);
下面我们用谷歌开源的 thumbnailator 来实现,绘制的思路还是差不多的,只是扩展性会好一点。
1、定义基本属性
package com.ywwl.nmedia.api.uulijun_pic_test;
import lombok.Data;
import lombok.Getter;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Getter
public class ImgWatermark implements Serializable {
private List<Watermark> watermarks = new ArrayList<>();
private List<FontText> fonts = new ArrayList<>();
@Data
public class Watermark{
//图片地址
private String imgUrl;
//水印图片左上、右下标
private List<Double> points;
public Watermark(String imgUrl, List<Double> points) {
this.imgUrl = imgUrl;
this.points = points;
}
}
@Data
public class FontText{
private String text;
private Integer textSize = 50;
private String textColor = "#ff0000";
private String textFont = "宋体";
private double startX;
private double startY;
public FontText(String text, double startX, double startY) {
this.text = text;
this.startX = startX;
this.startY = startY;
}
}
}
2、图片工具类
package com.ywwl.nmedia.api.uulijun_pic_test;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Coordinate;
import org.apache.commons.lang3.StringUtils;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ImgUtil {
public static void main(String[] args) {
String baseImgUrl = "http://xxx:8082/store/lesson/qrcode/2018/07/89670065122466.jpg";
String qrcode = "http://xxx:8082/store/lesson/qrcode/2018/07/194684822489251.png";
List<Double> points = Arrays.asList(0.35D,0.65D,0.66D,0.85D);
ImgWatermark imgWatermarkVo = new ImgWatermark();
imgWatermarkVo.getWatermarks().add(new ImgWatermark().new Watermark(qrcode,points));
try {
BufferedImage bufferedImage = watermarkImg(baseImgUrl, imgWatermarkVo);
OutputStream os = new FileOutputStream("/Users/whb/Documents/new.jpg");
ImageIO.write(bufferedImage,"jpg",os);
}catch (Exception e){
e.printStackTrace();
}
}
public static BufferedImage watermarkImg(String baseImgUrl, ImgWatermark imgWatermarkVo) throws Exception {
InputStream inputStream = getInputStream(baseImgUrl);
if(null == inputStream){
throw new RuntimeException("海报图片生成失败");
}
BufferedImage destImage = ImageIO.read(inputStream);
BufferedImage tempImage = null;
int w1 = destImage.getWidth(),h1 = destImage.getHeight(),startX,startY,endX,endY;
Coordinate coordinate = null;//水印位置
List<Double> points = null;//水印位置坐标左上、右下
for(ImgWatermark.Watermark imgVo : imgWatermarkVo.getWatermarks()){
inputStream = getInputStream(imgVo.getImgUrl());
if(null == inputStream){
continue;
}
points = imgVo.getPoints();
startX = new BigDecimal(points.get(0) * w1).intValue();
startY = new BigDecimal(points.get(1) * h1).intValue();
endX = new BigDecimal(points.get(2) * w1).intValue();
endY = new BigDecimal(points.get(3) * h1).intValue();
coordinate = new Coordinate(startX,startY);//设置水印位置
tempImage = Thumbnails.of(ImageIO.read(inputStream)).size(endX - startX,endY -startY).keepAspectRatio(false).asBufferedImage();
destImage = Thumbnails.of(destImage).size(w1,h1).watermark(coordinate,tempImage,1f).asBufferedImage();
}
for(ImgWatermark.FontText fontText : imgWatermarkVo.getFonts()){
startX = new BigDecimal(fontText.getStartX() * w1).intValue();
startY = new BigDecimal(fontText.getStartY() * h1).intValue();
destImage = mergeFontText(destImage,fontText,startX,startY);
}
return destImage;
}
private static BufferedImage mergeFontText(BufferedImage bufferedImage,ImgWatermark.FontText fontText,
int left,int top) throws Exception{
Graphics2D g = bufferedImage.createGraphics();
g.setColor(getColor(fontText.getTextColor()));
g.setFont(new Font(fontText.getTextFont(),Font.BOLD,fontText.getTextSize()));
g.setBackground(Color.white);
g.drawString(new String(fontText.getText().getBytes(),"utf-8"),left,top);
g.dispose();
return bufferedImage;
}
private static Color getColor(String color){
if(StringUtils.isBlank(color) || color.length() < 7){
return null;
}
try {
int r = Integer.parseInt(color.substring(1, 3), 16);
int g = Integer.parseInt(color.substring(3, 5), 16);
int b = Integer.parseInt(color.substring(5), 16);
return new Color(r,g,b);
}catch (NumberFormatException nfe){
return null;
}
}
public static InputStream getInputStream(String baseUrl) {
if (StringUtils.isBlank(baseUrl)) {
return null;
}
try {
URL url = new URL(baseUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(6000);
connection.setReadTimeout(6000);
int code = connection.getResponseCode();
if (HttpURLConnection.HTTP_OK == code) {
return connection.getInputStream();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private List<Double> getWatermarkPoints(String pointStr){
if(StringUtils.isBlank(pointStr)){
return new ArrayList<>();
}
List<Double> pointValues = new ArrayList<>();
for(String pont : pointStr.split(",")){
pointValues.add(Double.valueOf(pont));
}
return pointValues;
}
}
未完待续...