宣传照(私密)勿转发

精美的海报通常都是由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.hqwc.cn/news/317873.html

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

相关文章

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-7Lead Compensator超前补偿器(调节根轨迹)

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-7Lead Compensator超前补偿器&#xff08;调节根轨迹&#xff09; 1. Plot Rootlocus 绘制根轨迹2. System Performance 系统表现3. 改善/加快收敛速度4. 超前补偿器 Lead Compe…

什么是向量数据库

什么是向量数据库 向量数据库是一种应用在高效存储和查询高维向量的数据库。在传统的OLTP和OLAP数据库中&#xff08;如上图所示&#xff09;&#xff0c;数据按行和列组织&#xff08;这些称为表&#xff09;&#xff0c;并根据这些列中的值执行查询。然而&#xff0c;在某些应…

stm32学习总结:5、Proteus8+STM32CubeMX+MDK仿真串口并使用串口打印日志(注意重定向printf到串口打印的问题)

stm32学习总结&#xff1a;5、Proteus8STM32CubeMXMDK仿真串口并使用串口打印日志&#xff08;注意重定向printf到串口打印的问题&#xff09; 文章目录 stm32学习总结&#xff1a;5、Proteus8STM32CubeMXMDK仿真串口并使用串口打印日志&#xff08;注意重定向printf到串口打印…

.babky勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言&#xff1a; 网络安全威胁不断进化&#xff0c;其中.babky勒索病毒引起了广泛关注。这篇文章91数据恢复将深入介绍.babky的狡猾特征&#xff0c;以及在遭受其袭击时如何高效地恢复被加密的数据&#xff0c;并提供实用的预防方法。当面对被勒索病毒攻击导致的数据文件加密…

Halcon顶帽运算与底帽运算的应用

Halcon顶帽运算与底帽运算的应用 文章目录 Halcon顶帽运算与底帽运算的应用1. 提取小的物件2. 校正非均匀光照 正如上文所说的&#xff0c;顶帽运算返回的像素部分是尺寸比结构元素小的&#xff0c;并且比较亮的局部小区域&#xff1b;底帽运算返回的像素部分是尺寸比结构元素小…

【计算机网络】网络层

文章目录 网络层提供的服务虚电路数据报服务虚电路与数据报服务比较 虚拟互连网络IP地址IP层次结构IP地址分类特殊地址子网掩码 子网划分变长子网划分超网合并网络规律 IP地址与MAC地址ARP协议ARP欺骗的应用 数据包数据包首部 路由ICMP协议RIP动态路由协议OSPF协议BGP协议 VPNN…

SpringMVC学习与开发(三)

注&#xff1a;此为笔者学习狂神说SpringMVC的笔记&#xff0c;其中包含个人的笔记和理解&#xff0c;仅做学习笔记之用&#xff0c;更多详细资讯请出门左拐B站&#xff1a;狂神说!!! 10、ssm整合 问了一下ChatGPT SSM 是一个基于 Java 的开发框架整合&#xff0c;由 Spring、…

金和OA SAP_B1Config.aspx存在未授权访问漏洞

产品简介 金和网络是专业信息化服务商&#xff0c;为城市监管部门提供了互联网监管解决方案&#xff0c;为企事业单位提供组织协同OA系统升开发平台&#xff0c;电子政务一体化平台智慧电商平合等服务 漏洞概述 金和OA SAP_B1Config.aspx存在未授权访问漏洞&#xff0c;攻击…

什么是 NAS?

一、什么是 NAS&#xff1f; 在数字化时代&#xff0c;小型企业面临着日益增长的数据存储需求。为了应对这一挑战&#xff0c;网络附加存储&#xff08;NAS&#xff09;系统成为了许多企业的首选解决方案。NAS系统是一种连接到网络的存储设备&#xff0c;允许授权网络用户和异…

如何移除视频中的背景音乐或人物声音

移除视频声音是将视频指定的声音移除&#xff0c;可以选择移除人物声音还是视频的背景音乐&#xff0c;方便实现二次创作。 小编给大家推荐一些方法帮助大家更轻松地移除视频中的背景音乐或人物声音&#xff0c;有兴趣的朋友请自行百度查找&#xff0c;或小程序查找 1、方法&a…

JWT的快速使用(simplejwt)

djangorestframework-simplejwt使用 1 快速使用 1.1 配置 # 1 安装 pip install djangorestframework-simplejwt# 2 路由层 from rest_framework_simplejwt.views import token_obtain_pair, token_verify, token_refreshurlpatterns [path(login/, token_obtain_pair),pat…