宣传照(私密)勿转发

精美的海报通常都是由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*633public 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);}
}

总结

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

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海外静态IP和动态IP有什么区别?推荐哪种?

什么是静态ip、动态ip&#xff0c;二者有什么区别&#xff1f;哪种好&#xff1f;关于这个问题&#xff0c;不难发现&#xff0c;在知道、知乎上面的解释有很多&#xff0c;但据小编的发现&#xff0c;这些回答都是关于静态ip和动态ip的专业术语解释&#xff0c;普通非专业人事…

计算机毕业设计 SpringBoot的乡村养老服务管理系统 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

log4cplus visual c++ 编译及调试小记

简介 最近在调试一款SATA加密设备&#xff0c;发现设备有时加密出来的数据&#xff0c;再解密时与明文对不上&#xff0c;怀疑是通信问题。因此&#xff0c;急需要在测试工具中加入通信日志。由于对第三方日志库都不熟悉&#xff0c;所以随便选了个log4cplus软件集成到现有工具…

Python中的垃圾回收机制是什么

一、写在前面&#xff1a; 我们都知道Python一种面向对象的脚本语言&#xff0c;对象是Python中非常重要的一个概念。在Python中数字是对象&#xff0c;字符串是对象&#xff0c;任何事物都是对象&#xff0c;而它们的核心就是一个结构体--PyObject。 typedef struct_object{i…

【数据结构——二叉树】二叉树及其应用2023(头歌习题)【合集】

目录 第1关&#xff1a;括号表示法创建二叉树任务描述相关知识编程要求测试说明完整代码 第2关&#xff1a;先序序列创建二叉树任务描述相关知识二叉树的前序遍历如何创建一颗二叉树伪代码如下&#xff1a; 二叉树的中序遍历 编程要求测试说明完整代码 第3关&#xff1a;计算二…

畅捷通的 Serverless 探索实践之路

作者&#xff1a;计缘&#xff0c;阿里云云原生架构师 畅捷通介绍 畅捷通是中国领先的小微企业财税及业务云服务提供商&#xff0c;成立于 2010 年。畅捷通在 2021 年中国小微企业云财税市场份额排名第一&#xff0c;在产品前瞻性及行业全覆盖方面领跑市场&#xff0c;位居中…

使用运程操作电脑向日葵安装MySQl与Navicat的安装

目录 一、向日葵 1.1、简介 1.2、应用场景 1.3、原理&#xff1a; 1.4、使用&#xff1a; 1.5、在实施中的应用场景&#xff1a; 二、在Windows Server2012中安装MySQL 2.1、MySQL简介 2.2、MySQL5.7安装与8.0 2.3、输入命令步骤 三、Navicat 3.1、简介 3.2、安装N…

再见2023,你好2024(附新年烟花python实现)

亲爱的朋友们&#xff1a; 写点什么呢&#xff0c;我已经停更两个月了。2023年快结束了&#xff0c;时间真的过得好快&#xff0c;总要写点什么留下纪念吧。这一年伴随着许多挑战和机会&#xff0c;给了我无数的成长和体验。坦白说&#xff0c;有时候我觉得自己好像是在时间的…

JavaBean

学习目的与要求 熟练掌握<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>等JSP的操作指令。 本章主要内容 编写JavaBean在JSP中使用JavaBean 一个JSP页面通过使用HTML标记为用户显示数据&#xff08;静态部分&#xff09;&#xff0c;页面中变量的…

BMS均衡技术

一、电池的不一致性&#xff1f; 每个电池都有自己的“个性”&#xff0c;要说均衡&#xff0c;得先从电池谈起。即使是同一厂家同一批次生产的电池&#xff0c;也都有自己的生命周期、自己的“个性”——每个电池的容量不可能完全一致。例如以下的两个原因都会造成电池不一致…

Redis缓存保卫战:拒绝缓存击穿的进攻【redis问题 三】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Redis缓存保卫战&#xff1a;拒绝缓存击穿的进攻 前言缓存击穿的定义和原理为何会发生缓存击穿缓存击穿的危害防范缓存击穿结语: 前言 你是否曾经遇到过系统在高并发情况下出现严重性能问题&#xff…

JavaSE学习笔记 2023-12-28 --MySQL

MySQL 1.数据库介绍 数据库:数据仓库 DataBase:简称DB,用于长期存储有结构的,大量的,共享的数据长期的:持久存储,永久存储 有结构:有类型,有内部的数据类型有关系,数据与数据之前是有关联的 大量的:大多数据库都是以文件系统存在的,可以将数据存储在磁盘中 共享的:多个应用之…

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

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

干洗店洗鞋店小程序核心功能有哪些?

在繁忙的生活中&#xff0c;我们的鞋子常常承载着风尘仆仆的故事。而洗鞋小程序&#xff0c;就是那个让您的鞋子焕然一新的魔法师。通过这个小程序&#xff0c;您可以在线预约、支付&#xff0c;查询洗鞋订单&#xff0c;并与洗鞋店铺进行互动&#xff0c;轻松享受专业的洗鞋服…

小红书如何高效引流?

近年来&#xff0c;公域流量价格不断上涨&#xff0c;私域流量的优势逐渐凸显。企业正花费大量资源和成本来获取新流量&#xff0c;但与其如此&#xff0c;不如将精力放在留存和复购上&#xff0c;从而实现业绩的新增长。其中关键在于如何有效地将公域流量转化为私域流量。 然而…

听GPT 讲Rust源代码--src/tools(38)

File: rust/src/tools/clippy/clippy_dev/src/lib.rs rust/src/tools/clippy/clippy_dev/src/lib.rs文件是Clippy开发工具的入口文件&#xff0c;其作用是提供Clippy开发过程中所需的功能和工具。Clippy是一个Rust代码的静态分析工具&#xff0c;用于提供各种有用的代码规范、编…

在Android设备上设置和使用隧道代理HTTP

随着互联网的深入发展&#xff0c;网络信息的传递已经成为人们日常生活中不可或缺的一部分。对于我们中国人来说&#xff0c;由于某些特殊的原因&#xff0c;访问国外网站时常常会遇到限制。为了解决这个问题&#xff0c;使用代理服务器成为了许多人的选择。而在Android设备上设…

UI5与后端的文件交互(二)

文章目录 前言一、开发Action1. 创建Structure2. BEDF添加Action3. class中实现Action 二、修改UI5 项目1. 添加一个按钮2. 定义事件函数 三、测试及解析1. 测试2. js中提取到的excel流数据3. 后端解析 前言 这系列文章详细记录在Fiori应用中如何在前端和后端之间使用文件进行…

微信小程序开发系列-07组件

微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》《微信小程序开发系列-02注册小程序》《微信小程序开发系列-03全局配置中的“window”和“tabBar”》《微信小程序开发系列-04获取用户图像和昵称》《微信小程序开发系列-05登录小程序》《微信小程序…

ConcurrentHashMap源码学习

实现接口 ConcurrentMap&#xff08;Map的基础方法&#xff09;、Serializable(序列化) 基础属性 最大容量&#xff1a;2^30 默认容量&#xff1a;16 常用方法 PUT 调用PutVal方法进行插入。 判断key或value是否为空&#xff1a; 是&#xff1a;抛出空指针一场 否&#xff…