文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java实现画图的详细步骤(完整代码)

2024-04-02 19:55

关注

一、导入依赖


<dependency>
   <groupId>net.coobird</groupId>
   <artifactId>thumbnailator</artifactId>
   <version>0.4.13</version>
</dependency>

二、工具类


package com.geidco.dcp.util;
 
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.filters.ImageFilter;
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.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Base64;
import java.util.List;
 

public class ImageUtil {
 
    public static BufferedImage watermarkImgBase64(String base64, List<ImageWatermark> images, List<ImageFontText> texts) throws Exception {
        InputStream inputStream = null;
        base64 = base64.replaceFirst("data:image\\/.*;base64,", "");
 
        Base64.Decoder decoder = Base64.getDecoder();
        try {
            byte[] bytes = decoder.decode(base64);
            ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
            inputStream = bais;
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        BufferedImage destImage = ImageIO.read(inputStream);
        BufferedImage tempImage = null;
        int w1 = destImage.getWidth(), h1 = destImage.getHeight(), startX, startY, endX, endY;
        System.out.println("w1" + w1);
        System.out.println("h1" + h1);
        //水印位置
        Coordinate coordinate = null;
        //水印位置坐标左上、右下
        List<Integer> points = null;
 
        for (ImageWatermark imageWatermark : images) {
            inputStream = getInputStream(imageWatermark.getImageUrl());
            if (null == inputStream) {
                continue;
            }
            points = imageWatermark.getPoints();
            startX = new BigDecimal(points.get(0)).intValue();
            startY = new BigDecimal(points.get(1)).intValue();
            endX = new BigDecimal(points.get(2)).intValue();
            endY = new BigDecimal(points.get(3)).intValue();
            //设置水印位置
            coordinate = new Coordinate(startX, startY);
            tempImage = Thumbnails.of(ImageIO.read(inputStream)).size(endX - startX, endY - startY).keepAspectRatio(false).asBufferedImage();
//            tempImage = Thumbnails.of(ImageIO.read(inputStream)).size(180,180).keepAspectRatio(false).asBufferedImage();
//            destImage = Thumbnails.of(destImage).size(w1,h1).watermark(coordinate,tempImage,1f).asBufferedImage();
            destImage = Thumbnails.of(destImage).size(w1, h1).watermark(coordinate, tempImage, 1f).asBufferedImage();
        }
 
        for (ImageFontText fontText : texts) {
            startX = new BigDecimal(fontText.getStartX()).intValue();
            startY = new BigDecimal(fontText.getStartY()).intValue();
            destImage = mergeFontText(destImage, fontText, startX, startY);
        }
        destImage = Thumbnails.of(destImage).addFilter(new ThumbnailsImgFilter()).size(w1, h1).asBufferedImage();
        return destImage;
    }
 
    public static BufferedImage watermarkImg(String baseImgUrl, List<ImageWatermark> images, List<ImageFontText> texts) 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;
        System.out.println("w1" + w1);
        System.out.println("h1" + h1);
        //水印位置
        Coordinate coordinate = null;
        //水印位置坐标左上、右下
        List<Integer> points = null;
        for (ImageWatermark imageWatermark : images) {
            inputStream = getInputStream(imageWatermark.getImageUrl());
            if (null == inputStream) {
                continue;
            }
            points = imageWatermark.getPoints();
            startX = new BigDecimal(points.get(0)).intValue();
            startY = new BigDecimal(points.get(1)).intValue();
            endX = new BigDecimal(points.get(2)).intValue();
            endY = new BigDecimal(points.get(3)).intValue();
            //设置水印位置
            coordinate = new Coordinate(startX, startY);
            tempImage = Thumbnails.of(ImageIO.read(inputStream)).size(endX - startX, endY - startY).keepAspectRatio(false).asBufferedImage();
//            tempImage = Thumbnails.of(ImageIO.read(inputStream)).size(180,180).keepAspectRatio(false).asBufferedImage();
//            destImage = Thumbnails.of(destImage).size(w1,h1).watermark(coordinate,tempImage,1f).asBufferedImage();
            destImage = Thumbnails.of(destImage).addFilter(new ThumbnailsImgFilter()).size(w1, h1).watermark(coordinate, tempImage, 1f).asBufferedImage();
        }
 
        for (ImageFontText fontText : texts) {
            startX = new BigDecimal(fontText.getStartX()).intValue();
            startY = new BigDecimal(fontText.getStartY()).intValue();
            destImage = mergeFontText(destImage, fontText, startX, startY);
        }
        return destImage;
    }
 
    private static BufferedImage mergeFontText(BufferedImage bufferedImage, ImageFontText fontText,
                                               int left, int top) throws Exception {
        Graphics2D g = bufferedImage.createGraphics();
        g.setColor(getColor(fontText.getTextColor()));
 
        Font font = new Font(fontText.getTextFont(), Font.BOLD, fontText.getTextSize());
        g.setFont(font);
 
        g.setBackground(Color.white);
 
        if (fontText.getStartX() == -1) {
            //昵称居中设置
            FontMetrics fmNick = g.getFontMetrics(font);
            int nickWidth = fmNick.stringWidth(fontText.getText());
            int nickWidthX = (bufferedImage.getWidth() - nickWidth) / 2;
            //绘制文字
            g.drawString(new String(fontText.getText().getBytes(), "utf-8"), nickWidthX, top);
        } else {
            g.drawString(new String(fontText.getText().getBytes(), "utf-8"), left, top);
        }
        g.dispose();
        return bufferedImage;
//        AttributedString ats = new AttributedString("我是\n小雨哈哈哈");
//        ats.addAttribute(TextAttribute.FOREGROUND, f, 0,2 );
//        AttributedCharacterIterator iter = ats.getIterator();
//        g.drawString(iter,left,top);
    }
 
    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 {
            InputStream inputStream = new FileInputStream(baseUrl);
            return inputStream;
        } catch (IOException e) {
            e.printStackTrace();
        }
//        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;
    }
 
    
    public static class ThumbnailsImgFilter implements ImageFilter {
        @Override
        public BufferedImage apply(BufferedImage img) {
            int w = img.getWidth();
            int h = img.getHeight();
            BufferedImage newImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
            Graphics2D graphic = newImage.createGraphics();
            graphic.setColor(Color.white);//背景设置为白色
            graphic.fillRect(0, 0, w, h);
            graphic.drawRenderedImage(img, null);
            graphic.dispose();
            return newImage;
        }
    }
}

三、工具类


package com.geidco.dcp.util;
 
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
 

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ImageFontText {
    private String text;
    private Integer textSize = 50;
    private String textColor = "#ff0000";
    private String textFont = "宋体";
    private Integer startX;
    private Integer startY;
}

四、工具类


package com.geidco.dcp.util;
 
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
 
import java.util.List;
 

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ImageWatermark {
    
    private String imageUrl;
    
    private List<Integer> points;
}

五、测试接口


package com.geidco.dcp.controller.meetingApply;
 
import com.geidco.dcp.pojo.meetingApply.MeetingApply;
import com.geidco.dcp.pojo.meetingApply.MeetingGuestCardTemplate;
import com.geidco.dcp.service.meetingApply.MeetingApplyService;
import com.geidco.dcp.service.meetingApply.MeetingGuestCardTemplateService;
import com.geidco.dcp.util.*;
import com.xlkh.cloud.platform.common.annotation.Log;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
 
@RestController
@RequestMapping("/meetingGuestCard")
public class MeetingGuestCardController {
 
    @Value("${config.ldir}")
    String ldir;
 
    @Value("${config.wdir}")
    String wdir;
 
    @Autowired
    private MeetingApplyService meetingApplyService;
 
    @Autowired
    private IdWorker idWorker;
 
    @Autowired
    private MeetingGuestCardTemplateService meetingGuestCardTemplateService;
 
 
    @PostMapping("/generateGuestCard")
    @Log("绘制电子嘉宾证")
    public void generateGuestCard(@RequestBody Map<String, String> formData, HttpServletResponse response) {
        String templateId = formData.get("templateId");
        String ids = formData.get("meetingApplyId");
 
        List<String> meetingApplyIds = Arrays.asList(ids.split(","));
        List<MeetingApply> meetingApplys = meetingApplyService.getByKeys(meetingApplyIds);
 
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        String datePath = new SimpleDateFormat("yyyy/MM/dd").format(new Date()) + "/" + uuid + "/";
        String zipPath = SysMeetingUtil.getAnnexFilePath() + "generateGuestCard/" + datePath;
        File file = new File(zipPath);
        if (!file.exists()) {
            file.mkdirs();
        }
 
        // 上传的位置
        String path = System.getProperty("os.name").toLowerCase().indexOf("win") >= 0 ? wdir : ldir;
 
        MeetingGuestCardTemplate cardTemplate = meetingGuestCardTemplateService.findById(templateId);
        // 底图
        String baseImgUrl = cardTemplate.getBaseMapUrl();
        try {
 
            for (int i = 0; i < meetingApplys.size(); i++) {
                MeetingApply meetingApply = meetingApplys.get(i);
 
                String name = null;
                String unitName = null;
                String postName = null;
 
                String photoUrl = path;
 
                if ("zh".equals(meetingApply.getApplyWay())) {
                    name = meetingApply.getName();
                    unitName = meetingApply.getUnitName();
                    postName = meetingApply.getPositionName();
                    photoUrl = photoUrl + meetingApply.getPhotoUrl();
                } else {
                    name = meetingApply.getNameEn();
                    unitName = meetingApply.getUnitNameEn();
                    postName = meetingApply.getPositionNameEn();
                    photoUrl = photoUrl + meetingApply.getPhotoUrl();
                }
 
                List<ImageWatermark> images = new ArrayList<>();
                List<ImageFontText> texts = new ArrayList<>();
 
                // 查询模板详情
                List<MeetingGuestCardTemplate> templates = meetingGuestCardTemplateService.findByTemplateId(templateId);
                for (MeetingGuestCardTemplate template : templates) {
                    String dict = template.getElementTypeDict();
                    if ("1".equals(dict)) {
                        ImageFontText imageFontText = new ImageFontText(name, StringUtils.isNotBlank(template.getFontSize()) ? Integer.parseInt(template.getFontSize()) : 30,
                                StringUtils.isNotBlank(template.getFontColor()) ? template.getFontColor() : "#333333",
                                StringUtils.isNotBlank(template.getFontType()) ? template.getFontType() : "宋体",
                                template.getStartX(), template.getStartY());
                        texts.add(imageFontText);
                    }
                    if ("2".equals(dict)) {
                        ImageFontText imageFontText = new ImageFontText(unitName, StringUtils.isNotBlank(template.getFontSize()) ? Integer.parseInt(template.getFontSize()) : 30,
                                StringUtils.isNotBlank(template.getFontColor()) ? template.getFontColor() : "#333333",
                                StringUtils.isNotBlank(template.getFontType()) ? template.getFontType() : "宋体",
                                template.getStartX(), template.getStartY());
                        texts.add(imageFontText);
                    }
                    if ("3".equals(dict)) {
                        ImageFontText imageFontText = new ImageFontText(postName, StringUtils.isNotBlank(template.getFontSize()) ? Integer.parseInt(template.getFontSize()) : 30,
                                StringUtils.isNotBlank(template.getFontColor()) ? template.getFontColor() : "#333333",
                                StringUtils.isNotBlank(template.getFontType()) ? template.getFontType() : "宋体",
                                template.getStartX(), template.getStartY());
                        texts.add(imageFontText);
                    }
                    if ("100".equals(dict)) {
                        Integer startX = template.getStartX();
                        Integer startY = template.getStartY();
                        Integer endX = template.getEndX();
                        Integer endY = template.getEndY();
                        List<Integer> imagePoints = Arrays.asList(startX, startY, endX, endY);
                        ImageWatermark image = new ImageWatermark(photoUrl, imagePoints);
                        images.add(image);
                    }
                }
 
                try {
                    BufferedImage bufferedImage = ImageUtil.watermarkImgBase64(baseImgUrl, images, texts);
                    OutputStream os = new FileOutputStream(zipPath + String.valueOf(i + 1) + name + ".jpg");
                    ImageIO.write(bufferedImage, "jpg", os);
 
                    //更新meetingApply的状态
                    MeetingApply apply = new MeetingApply();
                    apply.setId(meetingApply.getId());
                    apply.setCreateCardDate(new Date());
                    apply.setIsCreateCard("Yes");
                    apply.setCardUrl("generateGuestCard/" + datePath + String.valueOf(i + 1) + name + ".jpg");
                    meetingApplyService.update(apply);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
 
            String zipFile = CompressUtil.zipFile(new File(zipPath), "zip");
            response.setContentType("APPLICATION/OCTET-STREAM");
            String fileName = "guestCard" + uuid + ".zip";
            response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
 
            //ZipOutputStream out = new ZipOutputStream(response.getOutputStream());
            OutputStream out = response.getOutputStream();
            File ftp = ResourceUtils.getFile(zipFile);
            InputStream in = new FileInputStream(ftp);
 
            // 循环取出流中的数据
            byte[] b = new byte[100];
            int len;
            while ((len = in.read(b)) != -1) {
                out.write(b, 0, len);
            }
            in.close();
            out.close();
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
}

六、页面效果

到此这篇关于Java实现画图的详细步骤(完整代码)的文章就介绍到这了,更多相关Java实现画图内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯