返回顶部
首页 > 资讯 > 后端开发 > Python >java使用Graphics2D绘图/画图方式
  • 723
分享到

java使用Graphics2D绘图/画图方式

2024-04-02 19:04:59 723人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、笔者在开发过程中遇到生成分享海报的需求二、Graphics2D常用API三、上才艺四、输出图片五、总结一、笔者在开发过程中遇到生成分享海报的需求 需要后端动态生成分享图(最终

一、笔者在开发过程中遇到生成分享海报的需求

需要后端动态生成分享图(最终前端自己实现的,哈哈);记录下过程中遇到的一些问题和解决办法。

二、Graphics2D常用api

首先获取Graphics2D实例


BufferedImage bi = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = bi.createGraphics();
// 开启抗锯齿
RenderingHints renderingHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);
// 使用高质量压缩
renderingHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
graphics.setRenderingHints(renderingHints);

1、graphics.drawImage(),往画布添加图片,参数有位置及图片宽高


BufferedImage bgmImage = Imageio.read(new ByteArrayInputStream(FileUtils.readFileToByteArray(new File("filePath"))));
graphics.drawImage(bgmImage, x, y, width, height, null);

2、graphics.drawString(),往画布上添加文字(自动换行需自己实现)


graphics.setFont(new Font("PingFangSC-Regular", Font.PLaiN, 24));
graphics.setColor(Color.WHITE);
graphics.drawString(title, x, y);

3、graphics.fillRoundRect(),带背景色的圆角矩形(用于给文字画背景色,注意要先画矩形背景,再画文字上去),最后两个参数是设置圆角弧度


// 背景色矩形
graphics.setColor(new Color(254, 68, 82));
graphics.fillRoundRect(x, y, width, height, 4, 4);

三、上才艺

1、刚刚提到的画文字自动换行需要自己实现,这里简单说下实现原理;其实就是根据设置的行宽及要画进去的字符串做一个计算,每个文字的行宽是可以拿到的,这样就能算出每行能展示多少个字,然后就能算出总共分多少行展示,最后循环调用graphics.drawString()方法画上去就好了;下面是换行的核心代码:


   private static int drawStringAutoLineFeed(Graphics g, String strContent, int rowWidth, int x, int y) {
        String[] split = strContent.split("\n");
        int total = 0;
        for (String str : split) {
            int height = drawStringAutoLine(g, str, rowWidth, x, y);
            total += height;
            y += height;
        }
        return total;
    }
 
    
    private static int drawStringAutoLine(Graphics g, String strContent, int rowWidth, int x, int y) {
        // 获取字符串 字符的总宽度
        int strWidth = getStringLength(g, strContent);
        // 获取字符高度
        int strHeight = getStringHeight(g);
        // 字符串总个数
        int rows = 0;
        if (strWidth > rowWidth) {
            int rowStrNum = getRowStrNum(strContent.length(), rowWidth, strWidth);
            rows = getRows(strWidth, rowWidth);
            String temp = "";
            for (int i = 0; i < rows; i++) {
                // 获取各行的String
                if (i == rows - 1) {
                    // 最后一行
                    temp = strContent.substring(i * rowStrNum, strContent.length());
                } else {
                    temp = strContent.substring(i * rowStrNum, i * rowStrNum + rowStrNum);
                }
                if (i > 0) {
                    // 第一行不需要增加字符高度,以后的每一行在换行的时候都需要增加字符高度
                    y = y + strHeight;
                }
                g.drawString(temp, x, y);
            }
        } else {
            // 直接绘制
            g.drawString(strContent, x, y);
        }
        return strHeight * rows;
    }
 
    private static int getDrawStringAutoLineHeight(Graphics g, String strContent, int rowWidth) {
        String[] split = strContent.split("\n");
        int height = 0;
        for (String str : split) {
            // 获取字符串 字符的总宽度
            int strWidth = getStringLength(g, str);
            // 获取字符高度
            height += getStringHeight(g) * getRows(strWidth, rowWidth);
        }
        return height;
    }
 
    private static int getStringLength(Graphics g, String str) {
        char[] strChar = str.toCharArray();
        return g.getFontMetrics().charsWidth(strChar, 0, str.length());
    }
 
    // 每一行字符的个数
    private static int getRowStrNum(int strNum, int rowWidth, int strWidth) {
        int rowsNum = 0;
        rowsNum = (rowWidth * strNum) / strWidth;
        return rowsNum;
    }
 
    // 字符行数
    private static int getRows(int strWidth, int rowWidth) {
        int rows = 0;
        if (strWidth % rowWidth > 0) {
            rows = strWidth / rowWidth + 1;
        } else {
            rows = strWidth / rowWidth;
        }
        return rows;
    }
 
    // 字符高度
    private static int getStringHeight(Graphics g) {
        return g.getFontMetrics().getHeight();
    }

使用方法:


graphics.setFont(new Font("PingFangSC-Regular", Font.PLAIN, 12));
graphics.setColor(Color.GRAY);
drawStringAutoLineFeed(graphics, strContent, rowWidth, x, y);

四、输出图片

1、输出图片字节数组


ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageIO.write(bi, "jpg", outputStream);
return outputStream.toByteArray();

2、直接输出图片文件


ImageIO.write(bi, "jpg", new File("outFilePath"));

五、总结

1、简单的并且图片是固定尺寸和样式的场景还比较好使

2、调试过程非常的恶心,不断生成图片看效果

3、样式较为负责的推荐让前端html2image,笔者的前端同事已经实现,效果比后端画图好很多!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: java使用Graphics2D绘图/画图方式

本文链接: https://lsjlt.com/news/157337.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java使用Graphics2D绘图/画图方式
    目录一、笔者在开发过程中遇到生成分享海报的需求二、Graphics2D常用API三、上才艺四、输出图片五、总结一、笔者在开发过程中遇到生成分享海报的需求 需要后端动态生成分享图(最终...
    99+
    2024-04-02
  • java 使用Graphics2D在图片上写字
    目录使用Graphics2D在图片上写字Graphics2D 的使用1、Graphics2D和Graphics的区别2、setRenderingHint的具体用处3、Stroke的使...
    99+
    2024-04-02
  • 怎么使用python sns.countplot()绘画条形图
    这篇文章主要介绍了怎么使用python sns.countplot()绘画条形图的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用python sns.countplot()绘画条形图文...
    99+
    2023-07-02
  • Java如何使用Graphics画图
    在Java中,可以使用Graphics类来画图。下面是一个简单的例子,展示了如何使用Graphics类来画一个简单的圆形:```ja...
    99+
    2023-08-24
    Java Graphics
  • python利用scatter绘画散点图
    scatter绘画散点图代码如下: import matplotlib.pyplot  as plt plt.scatter(x,y,                 s = 20 ...
    99+
    2024-04-02
  • python使用seaborn绘图直方图displot,密度图,散点图
    目录一、直方图distplot()二、密度图2.1 单个样本数据分布密度图一、直方图distplot() import numpy as np import seaborn as ...
    99+
    2024-04-02
  • Java中怎么使用Graphics画图
    要使用Graphics类来绘制图形,需要在Java中创建一个继承自JPanel的类,并重写其paintComponent方法。在该方...
    99+
    2023-10-23
    Java Graphics
  • 使用Python怎么在画布中绘制图表
    本篇文章给大家分享的是有关使用Python怎么在画布中绘制图表,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Python主要用来做什么Python主要应用于:1、Web开发;2...
    99+
    2023-06-14
  • 使用drawImage()在画布上绘制多个图像
    要在画布上绘制多个图像,您可以使用drawImage()方法多次调用。每次调用时,您可以指定要绘制的图像,要绘制到画布上的位置以及图...
    99+
    2023-09-27
    drawImage()
  • Python利用Turtle绘画简单图形
    目录前期准备基本函数与用法绘画图形1.画一个正方形2.画一个三角形3.画一个八角星4.画一个八边形5.其他图形No.1、多彩的五角星No.2、多彩的八角星No.3、四圆镶嵌No.4、...
    99+
    2024-04-02
  • vue使用Canvas在画布上添加图片方式
    目录使用Canvas在画布上添加图片使用canvas在图片上加上文字总结使用Canvas在画布上添加图片 首先在template 里面创建一个dom <div style="d...
    99+
    2023-05-16
    vue使用Canvas Canvas在画布添加图片 vue Canvas画布添加图片
  • python怎么利用scatter绘画散点图
    这篇文章主要介绍了python怎么利用scatter绘画散点图的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python怎么利用scatter绘画散点图文章都会有所收获,下面我们一起来看看吧。scatter绘画...
    99+
    2023-07-02
  • 如何用Python画了一组手绘图
    今天就跟大家聊聊有关如何用Python画了一组手绘图,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。这几天,许多城市,迎来了2019年的第一场雪13日早晨,当北京市民拉开窗帘时发现,窗...
    99+
    2023-06-02
  • python怎么使用seaborn绘制直方图,密度图,散点图
    本文小编为大家详细介绍“python怎么使用seaborn绘制直方图,密度图,散点图”,内容详细,步骤清晰,细节处理妥当,希望这篇“python怎么使用seaborn绘制直方图,密度图,散点图”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢...
    99+
    2023-07-02
  • python中pyplot直方图的绘制方式
    目录pyplot直方图的绘制python灰度直方图绘制pyplot直方图的绘制 import matplotlib.pyplot as plt import numpy as np ...
    99+
    2024-04-02
  • android图像绘制(五)画布保存为指定格式/大小的图片
    将图片进行编辑(放缩,涂鸦等),最后保存成指定格式、大小的图片。 先贴代码: 代码如下: Bitmap bmp = Bitmap.createBitmap(480, 800,...
    99+
    2022-06-06
    图片 Android
  • 如何使用Canvas绘制图形图文
    这篇文章主要讲解了“如何使用Canvas绘制图形图文”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Canvas绘制图形图文”吧!HTML5火的正热,...
    99+
    2024-04-02
  • 怎么使用Python matplotlib.pyplot.hist()绘制直方图
    本篇内容介绍了“怎么使用Python matplotlib.pyplot.hist()绘制直方图”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能...
    99+
    2023-07-02
  • Java使用Tess4J实现图像识别方式
    目录Java Tess4J实现图像识别首先,下载Tess4J的相关资源(一个压缩包)项目的的目录如下lib中的文件如下(tess4J.jar也在该目录下)再在eclipse中打开项目...
    99+
    2024-04-02
  • 使用R语言怎么绘制双坐标图直方图
    这期内容当中小编将会给大家带来有关使用R语言怎么绘制双坐标图直方图,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。什么是R语言R语言是用于统计分析、绘图的语言和操作环境,属于GNU系统的一个自由、免费、源代...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作