宣传照(私密)勿转发

精美的海报通常都是由UI进行精心设计的,现在有100 件商品需要进行宣传推广,如果每个商品都出一张图显然是不合理的,且商品信息各异。因此需要通过代码的形式生成海报。对此,我也对我宣传一波,企图实现我一夜暴富的伟大宏图。

在这里插入图片描述

生成的海报放在最前面,扫描下方二维码,手机上更好的实时阅读小咸鱼的技术窝。

在这里插入图片描述

代码实现

需要的依赖

  <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>core</artifactId>
        <version>3.4.0</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>
    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>javase</artifactId>
        <version>3.4.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.9</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.5</version>
    </dependency>

完整Java 代码

需要你准备一张背景图、封面图、二维码图、以及对应的文字描述,我这里全部搞成静态的了。各位织入自己的业务即可。用到的技术是 Graphics2D。我们使用的时候只需要知道三个概念就行。

  • x 坐标:横坐标
  • y 坐标:纵坐标
  • width:坐标点向右,的宽度
  • height:坐标点向下的,高度

为了保证图片的美观性,你需要去向 ui 询问,字体的配色参数、图片的尺寸参数。然后进行排版。里面需要自己去理解一下,都是些数学加减法的计算。这里不过多 bb。本文海报用到的图片尺寸是 610*633 的。

public class ImageUtils {
    public static String createPoster(String content) throws Exception {
        if (content.length() > 300) {
            content = StringUtils.substring(content, 0, 300) + "...";
        }
        //封面
        File petImg = new File("/Users/zhangzixing/Desktop/temp/fm.jpg");
        //二维码图片
        File qrCodeImg = new File("/Users/zhangzixing/Desktop/temp/ewm.png");
        //背景地址
        URL url = ImageUtils.class.getResource("/image/bj1.jpg");
        File fileBg = FileUtils.toFile(url);
        FileInputStream fis = new FileInputStream(fileBg);
        Image srcImg = ImageIO.read(fis);
        BufferedImage bufferedImage = new BufferedImage(
                srcImg.getWidth(null),
                srcImg.getHeight(null),
                BufferedImage.TYPE_INT_RGB);
        int width = bufferedImage.getWidth();
        int height = bufferedImage.getHeight();
        Graphics2D g = bufferedImage.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.drawImage(srcImg.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
        //内容
        Graphics2DUtils.drawString(g, Color.decode("#323232"),
                new Font("PingFang SC Bold",
                        Font.BOLD, 30),
                content,
                100, 640, 500, 30, 10, false);
        BufferedImage read = ImageIO.read(qrCodeImg);
        //扫一扫
        Graphics2DUtils.drawString(g, Color.decode("#323232"),
                new Font("PingFang SC Bold", Font.BOLD, 70),
                "扫一扫",
                width - read.getWidth() / 2 - 200, height - 70,
                width - 20,
                20, 10, false);

        //二维码
        g.drawImage(ImageIO.read(qrCodeImg), width - read.getWidth() - 100, height - read.getHeight() - 150, read.getWidth(), read.getHeight(), null);
        //封面
        g.drawImage(ImageIO.read(petImg), 20, 20, width - 40, height - 900, null);
        g.dispose();
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        ImageIO.write(bufferedImage, "jpg", os);
        String encodeStr = Base64.getEncoder().encodeToString(os.toByteArray());
        FileUtils.writeByteArrayToFile(new File("/Users/zhangzixing/Desktop/temp/海报.jpg"), os.toByteArray());
        fis.close();
        os.close();
        return encodeStr;

    }

    //610*633
    public static void main(String[] args) throws Exception {
        System.err.println(createPoster("22 届本科毕业生,擅长Spring 全家桶源码、Mybatis 源码、常见设计模式使用、Redis 各大数据类型使用、Java 常用并发包源码、Spring Cloud 全家桶、RocketMq 使用"));
    }
}

用到的工具类

import org.apache.commons.lang3.StringUtils;

import java.awt.*;
import java.util.ArrayList;

public final class Graphics2DUtils {
    /**
     * 向画布上写文字
     *
     * @param g       Graphics2D对象
     * @param color   颜色
     * @param font    字体
     * @param content 内容
     * @param x       坐标x
     * @param y       坐标y
     */
    public static void drawString(Graphics2D g, Color color, Font font, String content, float x, float y) {
        g.setColor(color);
        g.setFont(font);
        g.drawString(content, x, y);
    }

    /**
     * 向画布上写多行文字文字,自动居中
     *
     * @param g           Graphics2D对象
     * @param color       颜色
     * @param font        字体
     * @param content     内容
     * @param x           坐标X
     * @param y           坐标y
     * @param width       画布宽度
     * @param lineWordNum 每行字数
     * @param linePadding 行间距
     * @param center      是否居中
     */
    public static void drawString(Graphics2D g, Color color, Font font, String content, float x, float y, int width, int lineWordNum, int linePadding, boolean center) {
        int num = content.length();

        ArrayList<String> contents = new ArrayList<String>();
        if (num <= lineWordNum) {

            contents.add(content);
        } else {
            for (int i = 0; i < num; i += lineWordNum) {
                contents.add(StringUtils.substring(content, i, i + lineWordNum));
            }

        }
        for (int i = 0; i < contents.size(); i++) {
            String s = contents.get(i);
            if (i != 0) {
                y += linePadding + font.getSize();
            }
            if (center) {
                drawCenterString(g, color, font, s, width, y);
            } else {
                drawString(g, color, font, s, x, y);
            }
        }
    }

    /**
     * 向画布上写多行文字文字,自动居中
     *
     * @param g           Graphics2D对象
     * @param color       颜色
     * @param font        字体
     * @param content     内容
     * @param y           坐标y
     * @param width       画布宽度
     * @param lineWordNum 每行字数
     * @param linePadding 行间距
     */
    public static void drawCenterString(Graphics2D g, Color color, Font font, String content, float y, int width, int lineWordNum, int linePadding) {
        drawString(g, color, font, content, 0, y, width, lineWordNum, linePadding, true);
    }

    /**
     * 向画布上写文字,自动居中
     *
     * @param g       Graphics2D对象
     * @param color   颜色
     * @param font    字体
     * @param content 内容
     * @param width   画布宽度
     * @param y       坐标y
     */
    public static void drawCenterString(Graphics2D g, Color color, Font font, String content, int width, float y) {
        int textWidth = getStringWidth(g, font, content);

        drawString(g, color, font, content, (width - textWidth) / 2, y);
    }

    /**
     * 获取字符串内容的宽度
     *
     * @param g       Graphics2D对象
     * @param font    字体
     * @param content 内容
     * @return
     */
    public static int getStringWidth(Graphics2D g, Font font, String content) {
        FontMetrics fm = g.getFontMetrics(font);
        //获取字符串宽度
        return fm.stringWidth(content);
    }
}

总结

关注不迷路,这里是小咸鱼的技术窝

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/287121.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nice Water Shader

非常好的水着色器! 标准RP上的新程序泡沫!!(URP即将推出) URP支持!! 有3个版本: -台式机 -移动设备 -桌面拼接 有灯光支持!! 使用 CUSTOM SHADER INSPECTOR(自定义着色器检查器) 个性化事物的能力,如: 镶嵌图案 3种不同颜色,形成渐变深度 色彩位置优势 菲涅耳颜色和…

[讲座] - 闲聊工业设计

1&#xff0c;工业设计相关的学科分类 2&#xff0c;工业设计的职业发展路线 3&#xff0c;工业设计师的成名人物 4&#xff0c;设计了可口可乐的Loewy 可口可乐的瓶子&#xff0c;无论白天晚上还是瓶子被打碎&#xff0c;都能认出这个是可口可乐的瓶子。 草图参照了可可豆&am…

GZ075 云计算应用赛题第4套

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷4 某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenSt…

Oracle笔记-查看表已使用空间最大空间

目前以Oracle18c为例&#xff0c;主要是查这个表USER_SEGMENTS。 在 Oracle 18c 数据库中&#xff0c;USER_SEGMENTS 是一个系统表&#xff0c;用于存储当前用户&#xff08;当前会话&#xff09;拥有的所有段的信息。段是 Oracle 中分配存储空间的逻辑单位&#xff0c;用于存…

数据结构和算法-数据结构的基本概念和三要素和数据类型和抽象数据类型

文章目录 总览数据结构的基本概念总览数据早期和现代的计算机处理的数据数据元素-描述一个个体数据对象-一类数据元素什么是数据结构小结 数据结构的三要素总览逻辑结构-集合结构逻辑结构-线性结构逻辑结构-树形结构逻辑结构-图形结构逻辑结构-小结数据的运算物理结构&#xff…

JAVA对象、List、Map和JSON之间的相互转换

JAVA对象、List、Map和JSON之间的相互转换 1.Java中对象和json互转2.Java中list和json互转3.Java中map和json互转 1.Java中对象和json互转 Object obj new Object(); String objJson JSONObject.toJSONString(obj);//java对象转json Object newObj JSONObject.parseObject(…

一类医疗器械需要做EMC和安规吗?

摘要: 在医疗器械领域&#xff0c;EMC&#xff08;电磁兼容性&#xff09;和安规&#xff08;安全规格&#xff09;测试是非常重要的。医疗器械需要符合电磁兼容性标准&#xff0c;以确保其在电磁环境下能够正常运行而不会受到外部电磁干扰的影响&#xff0c;也不会干扰其他设备…

IOS - 手机安装包 ipa 常见几种方式

安装 ipa 包的方法有很多中&#xff0c;可以通过不同的软件安装&#xff0c;本文只列出了常用的几种&#xff0c;做个简单的归纳整理 1、iTunes 安装 数据线连接手机之后&#xff0c;会自动连接iTunes&#xff0c;&#xff08;第一次连接的时候会提示是否信任此电脑&#xff0…

小红书、抖音、视频号下载工具:随心管理个人作品集 | 开源日报 No.134

karanpratapsingh/system-design Stars: 20.6k License: NOASSERTION 这个项目是关于系统设计的。它提供了有关系统设计的课程内容&#xff0c;包括 IP、OSI 模型、TCP 和 UDP 等主题。该项目的核心优势和特点如下&#xff1a; 提供全面而高效的系统架构定义。从基础设施到数…

k8s的声明式资源管理

在k8s当中支持两种声明资源的方式&#xff1a; 1、 yaml格式&#xff1a;主要用于和管理资源对象 2、 json格式&#xff1a;主要用于在API接口之间进行消息传递 声明式管理方法(yaml)文件 1、 适合对资源的修改操作 2、 声明式管理依赖于yaml文件&#xff0c;所有的内容都…

小白入门基础 - tomcat

一&#xff1a;前言 Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。对于一个初学者来说&#xff0c;可以这样认为&#x…

【解决】Unity 设置跨设备分辨率表现

开发平台&#xff1a;Unity 2018版本以上 开发语言&#xff1a;CSharp 编程平台&#xff1a;Visual Studio 2022   问题描述 使用 UnityEngine.dll 中关于设置分辨率的方法时&#xff0c;无法满足应用以设定分辨率进行屏幕显示问题。因而造成画面不同程度的拉伸情况。而这种情…

[概率论]四小时不挂猴博士

贝叶斯公式是什么 贝叶斯公式是概率论中的一个重要定理&#xff0c;用于计算在已知一些先验信息的情况下&#xff0c;更新对事件发生概率的估计。贝叶斯公式的表达式如下&#xff1a; P(A|B) P(B|A) * P(A) / P(B) 其中&#xff0c;P(A|B)表示在事件B发生的条件下事件A发生的概…

【Emgu.CV教程】第21篇 、色彩处理之ConvertTo()函数改变图像的亮度和对比度

先画重点&#xff1a; 亮度是指图像的整体明亮程度。增加亮度会使图像整体变得更加明亮&#xff0c;而减少亮度则会使图像变暗。对比度是指图像中不同区域之间亮度差异的程度。它衡量了图像中最亮和最暗区域之间的差异。对比度高的图像明暗差异大&#xff0c;而对比度低就是明…

2024.1.2 安装JDK和Eclipse,并配置java编译环境

2024.1.2 安装JDK和Eclipse&#xff0c;并配置java编译环境 一直对java一知半解&#xff0c;利用春节前一个月时间补补课。 一、安装jdk 首先在oracle官网上下载jdk&#xff0c;这里选jdk17&#xff0c;选择第二项直接安装&#xff0c;第一项是压缩文件&#xff0c;带有一些…

二分图的最大权匹配

二分图的最大权匹配 二分图的最大匹配 匈牙利算法 思路&#xff1a;将点分为两类&#xff0c;左边的点和右边的点。每次尝试给左边的点找一个右边的点与之匹配&#xff0c; for (int i 1; i < n; i) {Arrays.fill(st, false);//为什么要每次都要重置stif (find(i)) res…

企业CIO如何面对数字化转型

随着互联网新技术的不断发展&#xff0c;必将导致商业模式的改变&#xff0c;企业信息化的内涵也将发生改变。IT在企业的定位更可能会上升到合作伙伴型与引领型这些较高的层面&#xff0c;IT架构模式、系统建设模式、IT部门结构等都将发生质变。而数字化时代必定属于CIO的时代&…

浅谈余压监控系统在某高层住宅的应用方案

【摘要】&#xff1a; 本文介绍了余压监控系统的基本架构和功能&#xff0c;结合某高层住宅建设实例分析了高层民用建筑中设置此系统的优点与必要性&#xff0c;总结了余压监控系统的功能用于高层建筑物中楼梯间和前室、前室和走道之间的余压的监控与调节&#xff0c;使监控区域…

第一个Qt程序----Hello word!

从今天起就开始我们的第一个Qt小程序&#xff0c;点击New Project后点击右侧的Application后点击Qt Widgets Application。Qt Widgets 模块提供了一组UI元素用于创建经典的桌面风格的用户界面&#xff0c;Widgets是小部件的意思&#xff0c;也可以称为控件&#xff0c;因此Qt …

DevOps成熟度评估模型

什么是DevOps 随着敏捷软件方法的广泛采用&#xff0c;以及IT基础设施即程序代码的管理方式的推广&#xff0c;DevOps也应运而生了。 DevOps 是通过人、流程和技术的有机整合&#xff0c;以协作、自动化、精益、度量和共享文化为指引&#xff0c;旨在建立一种可以快速交付价值…