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

一、导入依赖

<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;

/**
 * @author XuPengFei
 */
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;

/**
 * @author XuPengFei
 */
@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;

/**
 * @author XuPengFei
 */
@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实现画图内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 25行Java代码将普通图片转换为字符画图片和文本的实现

    本文主要介绍了25行Java代码将普通图片转换为字符画图片和文本的实现,分享给大家,具体如下: 原图 生成字符画文本(像素转换字符显示后,打开字符画显示相当于原图的好几倍大,不要用记事本打开,建议用notepad++等软件打开) 生成字符画图片(背景颜色和画笔颜色代码里可设置调节) 新建普通java 项目,Java单类实现代码,复制到java项目中,用idea编辑器 主方法运行.(引入的Class 都是JDK中自有的) import javax.imageio.ImageIO; import j

  • java 2d画图示例分享(用java画图)

    Java 2D API通过扩展抽象窗口工具箱(AWT),为Java程序提供了二维图像,文本和图形的功能.这个复杂的渲染包支持线形图像,文本和图形,为富用户界面,复杂绘图程序和图像处理器开发者提供灵活的,功能强大的框架.Java 2D对象出现在一个平面中,称为用户坐标系空间,和设备坐标系空间.当对象在屏幕或打印机中渲染时,用户空间坐标系被转换成设备空间坐标系. 复制代码 代码如下: import java.awt.BasicStroke;import java.awt.Color;import j

  • java用applet画图用到的方法(涉及双缓冲)

    准备学习java2游戏编程.(其实这是一本书啦) 然后作为基础的基础的基础,必须学习如何让键盘与界面进行交互.下面就是对一个基础得不能再基础的applet程序. 虽然这是个小程序,但其中关于双缓冲概念的介绍是很重要的,要深入理解.(高级噢) 首先先看代码: package bear.game.keyevent; import java.applet.Applet; import java.awt.Color; import java.awt.Graphics; import java.awt.I

  • java实现画图板功能

    本文实例为大家分享了java实现画图板的具体代码,供大家参考,具体内容如下 画图板需要满足的功能有: 画线,画三角形,画矩形,画多边形,画曲线 设置不同颜色的画笔 改变窗口大小或最小化窗口后重新打开时图案不消失 画图方法的编写: 创建一个类,继承JPanel类,重写JPanel的绘制方法,重写方法时写上原有的绘制方法,再添加绘制已有的图形的方法.(为了在改变窗口大小和最小化窗口后再打开时图案不消失) 在画图方法中首先创建一个窗体,设置好各项参数后,将窗体设置边框布局.由于继承了JPanel类,重

  • Java实现的简单画图板示例

    本文实例讲述了Java实现的简单画图板.分享给大家供大家参考,具体如下: 这个画图板是我好久之前做的,之后浙大的同学需要做课设然后就花了一点时间将它改了一下,变得简单些能够方便扩充功能,同时学习java基础 先截图一下吧,就可以知道有哪些功能了~ 三个分区,上面选择图形,下面选择颜色,立体圆就是一个分形,也先放着不需要的同学可以注释了它 代码很简单,就是JPanel进行分区,得到画笔,同时使用画图的函数就可以做到了 贴代码应该很快就会了~ 主类 package awtDemo; import j

  • java实现画图板上画一条直线

    目标:在画图板上画一条直线,供大家参考,具体内容如下 一.首先需要建立一个界面 过程:1.创建界面对象(Java语言中已经有,可直接创建对象来使用). 2.对于一个界面,我们需要设置它的大小.居中.界面关闭.界面可见. 3.写主方法去实现界面. (目前界面还未实现画图板的功能) public class DrawUI { //显示界面的方法 public void show(){ //创建界面对象 JFrame jframe = new JFrame(); //设置界面的尺寸.位置居中.关闭.标

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

    一.导入依赖 <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.13</version> </dependency> 二.工具类 package com.geidco.dcp.util; import net.coobird.thumbnailator.Thumbnail

  • Java网络编程之TCP通信完整代码示例

    一.概述 Socket类是Java执行客户端TCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信.Socket类的方法会建立和销毁连接,设置各种Socket选项. ServerSocket类是Java执行服务器端操作的基础类,该类运行于服务器,监听入站TCP连接,每个socket服务器监听服务器的某个端口,当远程主机的客户端尝试连接此端口时,服务器就被唤醒,并返回一个表示两台主机之间socket的正常Socket对象. 二.什么是TCP? TCP是一种面向连接的.可靠的.

  • Java实现生成Excel树形表头完整代码示例

    本文主要分享了Java实现生成Excel树形表头完整代码示例,没有什么好解释的,直接看看代码过程. 源数据格式: String[] targetNames = { "指标名称", "单位", "xx_yy1", "xx_yy2_zz1", "xx_yy2_zz2", "2017年5月_主营业务收入_累计", "2017年5月_主营业务收入_同比", "201

  • Java配置DBeaver的详细步骤

    DBeaver简介: 无意中得知DBeaver这个工具,觉得特别神奇,对我们目前工作特别有用,所以特别惊喜.(有点土包子没见过世面...) 借用百度百科:DBeaver是一个通用的数据库管理工具和 SQL 客户端,支持 MySQL, PostgreSQL, Oracle, DB2, MSSQL, Sybase, Mimer, HSQLDB, Derby, 以及其他兼容 JDBC 的数据库.DBeaver 提供一个图形界面用来查看数据库结构.执行SQL查询和脚本,浏览和导出数据,处理BLOB/CL

  • 微信小程序后端Java接口开发的详细步骤

    目录 1.搭建一个springboot项目并引入依赖 2.编写controller层 3.创建微信小程序项目 微信小程序使用wx.request(OBJECT)来调用后端接口. 首先 我们来一个简单案例 -- helloworld实现 1.搭建一个springboot项目并引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-

  • Java实现截图小工具的完整代码

    目录 写在前面 效果展示 代码展示 项目结构 设计思路 项目测试 写在前面 今天利用Java的图形用户界面GUI技术写了一个电脑截图小工具.本程序代码简单,涉及到异常处理,事件处理,图形用户界面等,是初学者练手的好项目.一起来学习吧! 效果展示 代码展示 import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.

  • 在Linux上搭建一个Java部署环境的详细步骤

    目录 在Linux上搭建一个Java部署环境 1. 安装jdk 2.操作步骤: 3. 安装mysql 小结 上篇介绍了如何在 Linux 上搭建 java 部署环境(安装jdk/tomcat/mysql) + 将程序部署到云服务器上的操作). 在Linux上搭建一个Java部署环境 为了部署java web程序,需要安装:jdk.tomcat.mysql.(注意:所有的安装yum都需要管理员权限) 1. 安装jdk 安装jdk有很多种方式,但是我们这里推荐的是使用yum直接安装openjdk.

  • java连接mysql数据库详细步骤解析

    第一步:下载一个JDBC驱动包,例如我用的是:mysql-connector-java-5.1.17-bin.jar 第二步:导入下载的JDBC驱动包,我用的是myeclipse,选中自己要导包的项目,右   击选中propertise,再选JavaBuild Path, 右边会出现libreries,点进去,再点Add External JARs  然后再找到你要导入的驱动包.完了之后再点Order andExport,下面再选中你导入的包. 第三步:加载驱动程序:Class.forName(

  • Java+Swing实现医院管理系统的完整代码

    一.系统介绍 本系统实现的以下功能 管理员功能:登录系统.病人信息的增删改查.就医档案的录入.医生信息的增删改查.科室信息的增删改查.收费统计功能.修改密码. 医生功能:登录系统.病人信息的增删改查.医生信息的增删改查.科室信息的增删改查.收费统计功能.修改密码. 收费员功能:价格管理.收费管理.修改密码. JDK版本:1.8 数据库:Mysql8.0.13 数据库用到的表 cashier charge department doctor drugtable manager medical_re

  • 微信小程序后端(java)开发流程的详细步骤

    微信小程序后端开发流程根据官网总结为两个步骤 1.前端调用 wx.login 返回了code,然后调用wx.getUserInfo获取到用户的昵称 头像 2.服务端根据code去微信获取openid, 接口地址: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html%EF%BC%9B%E5%90%8C%E6%97%B6%EF%BC%8C%E6%9B%B4

随机推荐