java实现图片的组合(三)

前两篇文章都是用 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;
    }
}
未完待续...

猜你喜欢

转载自blog.csdn.net/qq_33101675/article/details/81022241