[Java生成商品的海报图片 ]

news/2023/11/29 7:59:03

目录

前言: 

生成商品海报图片需要处理两个问题:

依赖:

编写生成海报代码

另一个方法:

补全上面的main测试方法:



前言: 

     你知道的 这只是一个简单笔记......

生成商品海报图片需要处理两个问题:

1)将文字和二维码合成为一张图片;

2)将图片保存到文件。

依赖:

其中,com.google.zxing是一个二维码处理库,com.itextpdf是一个PDF处理库,org.apache.commons.lang3是一个常用的Java工具库。这些库可以通过Maven中央仓库进行下载和引用。

<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version>
</dependency>
<dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.4.1</version>
</dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version>
</dependency>
  1. 编写生成海报代码

生成海报代码可以分为两个部分,分别处理文字和二维码。

处理文字

处理文字需要使用iText库,通过创建PDF文档、设置字体、添加文本、设置位置等方式生成一个带有文字的PDF页面,然后将PDF页面转换为图片。

代码如下:

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;
import org.apache.commons.lang3.StringUtils;import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;public class PosterGenerator {private static final String FONT_PATH = "src/main/resources/msyh.ttf";/*** 生成带有文字的海报图片** @param text      文字内容* @param imageSize 图片大小* @param fontName  字体名称* @param fontSize  字体大小* @return 生成的海报图片*/public static BufferedImage generateTextPoster(String text, int imageSize, String fontName, float fontSize) throws DocumentException, IOException {Document document = new Document();PdfWriter writer = PdfWriter.getInstance(document, new ByteArrayOutputStream());document.open();PdfContentByte contentByte = writer.getDirectContent();Font font = FontFactory.getFont(fontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, fontSize);Phrase phrase = new Phrase(text, font);ColumnText.showTextAligned(contentByte, Element.ALIGN_CENTER, phrase, imageSize / 2, imageSize / 2, 0);document.close();ByteArrayOutputStream baos = (ByteArrayOutputStream) writer.getDirectContent().getOutputStream();byte[] pdfBytes = baos.toByteArray();return convertPDFToImage(pdfBytes, imageSize, imageSize);}private static BufferedImage convertPDFToImage(byte[] pdfBytes, int width, int height) throws IOException {Image image = Image.getInstance(pdfBytes);BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D graphics = bufferedImage.createGraphics();graphics.setColor(Color.WHITE);graphics.fillRect(0, 0, width, height);graphics.drawImage(image, 0, 0, width, height, null);graphics.dispose();return bufferedImage;}
}
  • 代码中,generateTextPoster方法用于生成带有文字的海报图片。首先创建一个PDF文档,设置字体、添加文本、设置位置等,然后将PDF文档转换为图片。convertPDFToImage方法用于将PDF文档转换为BufferedImage类型的图片。

  • 处理二维码

    处理二维码需要使用Google的ZXing库,通过创建二维码内容、设置参数等方式生成二维码图片。

代码如下:

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;public class PosterGenerator {/*** 生成带有文字和二维码的海报图片** @param text         文字内容* @param imageSize    图片大小* @param fontName     字体名称* @param fontSize     字体大小* @param qrCodeString 二维码内容* @param qrCodeSize   二维码大小* @param qrCodeX      二维码X坐标* @param qrCodeY      二维码Y坐标* @return 生成的海报图片*/public static BufferedImage generatePoster(String text, int imageSize, String fontName, float fontSize,String qrCodeString, int qrCodeSize, int qrCodeX, int qrCodeY) throws Exception {BufferedImage textImage = generateTextPoster(text, imageSize, fontName, fontSize);BufferedImage qrCodeImage = generateQRCode(qrCodeString, qrCodeSize);Graphics2D graphics = textImage.createGraphics();graphics.drawImage(qrCodeImage, qrCodeX, qrCodeY, null);graphics.dispose();return textImage;}/*** 生成带有文字的海报图片** @param text      文字内容* @param imageSize 图片大小* @param fontName  字体名称* @param fontSize  字体大小* @return 生成的海报图片*/public static BufferedImage generateTextPoster(String text, int imageSize, String fontName, float fontSize) throws Exception {Document document = new Document();PdfWriter writer = PdfWriter.getInstance(document, new ByteArrayOutputStream());document.open();PdfContentByte contentByte = writer.getDirectContent();Font font = FontFactory.getFont(fontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, fontSize);Phrase phrase = new Phrase(text, font);ColumnText.showTextAligned(contentByte, Element.ALIGN_CENTER, phrase, imageSize / 2, imageSize / 2, 0);document.close();ByteArrayOutputStream baos = (ByteArrayOutputStream) writer.getDirectContent().getOutputStream();byte[] pdfBytes = baos.toByteArray();return convertPDFToImage(pdfBytes, imageSize, imageSize);}/*** 生成二维码图片** @param qrCodeString 二维码内容* @param size         二维码大小* @return 生成的二维码图片*/public static BufferedImage generateQRCode(String qrCodeString, int size) throws WriterException, IOException {Map<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");QRCodeWriter qrCodeWriter = new QRCodeWriter();BitMatrix bitMatrix = qrCodeWriter.encode(qrCodeString, BarcodeFormat.QR_CODE, size, size, hints);BufferedImage qrCodeImage = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < size; x++) {for (int y = 0; y < size; y++) {qrCodeImage.setRGB(x, y, bitMatrix.get(x, y) ? Color.BLACK.getRGB() : Color.WHITE.getRGB());}}return qrCodeImage;}private static BufferedImage convertPDFToImage(byte[] pdfBytes, int width, int height) throws IOException {Image image = Image.getInstance(pdfBytes);BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D graphics = bufferedImage.createGraphics();graphics.setColor(Color.WHITE);graphics.fillRect(0, 0, width, height);graphics.drawImage(image, 0, 0, width, height, null);graphics.dispose();return bufferedImage;}public static void main(String[] args) throws Exception {String text = "这是一段测试文字,用于生成海报";String qrCodeString = "https://www.baidu.com/";int imageSize = 600;int qrCodeSize = 

另一个方法:

将文字和二维码合成为一张图片,需要将二维码图片放置到文字图片上,并设置二维码的位置和大小。

示例代码如下:

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;public class PosterGenerator {private static final String FONT_PATH = "src/main/resources/msyh.ttf";/*** 生成带有文字和二维码的海报图片** @param text         文字内容* @param imageSize    图片大小* @param fontName     字体名称* @param fontSize     字体大小* @param qrCodeString 二维码内容* @param qrCodeSize   二维码大小* @param qrCodeX      二维码X坐标* @param qrCodeY      二维码Y坐标* @return 生成的海报图片*/public static BufferedImage generatePoster(String text, int imageSize, String fontName, float fontSize,String qrCodeString, int qrCodeSize, int qrCodeX, int qrCodeY) throws Exception {BufferedImage textImage = generateTextPoster(text, imageSize, fontName, fontSize);BufferedImage qrCodeImage = generateQRCode(qrCodeString, qrCodeSize);Graphics2D graphics = textImage.createGraphics();graphics.drawImage(qrCodeImage, qrCodeX, qrCodeY, null);graphics.dispose();return textImage;}/*** 生成带有文字的海报图片** @param text      文字内容* @param imageSize 图片大小* @param fontName  字体名称* @param fontSize  字体大小* @return 生成的海报图片*/public static BufferedImage generateTextPoster(String text, int imageSize, String fontName, float fontSize) throws Exception {Document document = new Document();PdfWriter writer = PdfWriter.getInstance(document, new ByteArrayOutputStream());document.open();PdfContentByte contentByte = writer.getDirectContent();Font font = FontFactory.getFont(fontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, fontSize);Phrase phrase = new Phrase(text, font);ColumnText.showTextAligned(contentByte, Element.ALIGN_CENTER, phrase, imageSize / 2, imageSize / 2, 0);document.close();ByteArrayOutputStream baos = (ByteArrayOutputStream) writer.getDirectContent().getOutputStream();byte[] pdfBytes = baos.toByteArray();return convertPDFToImage(pdfBytes, imageSize, imageSize);}/*** 生成二维码图片** @param qrCodeString 二维码内容* @param size         二维码大小* @return 生成的二维码图片*/public static BufferedImage generateQRCode(String qrCodeString, int size) throws WriterException {Map<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");BitMatrix bitMatrix = new MultiFormatWriter().encode(qrCodeString, BarcodeFormat.QR_CODE, size, size, hints);int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();BufferedImage qrCodeImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {qrCodeImage.setRGB(x, y, bitMatrix.get(x, y) ? Color.BLACK.getRGB() : Color.WHITE.getRGB());}}return qrCodeImage;}private static BufferedImage convertPDFToImage(byte[] pdfBytes, int width, int height) throws IOException {Image image = Image.getInstance(pdfBytes);BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D graphics = bufferedImage.createGraphics();graphics.setColor(Color.WHITE);graphics.fillRect(0, 0, width, height);graphics.drawImage(image, 0, 0, width, height, null);graphics.dispose();return bufferedImage;}public static void main(String[] args) throws Exception {String text = "这是一段测试文字,用于生成海报";String qrCodeString = "https://www.baidu.com/";int imageSize = 600;int qrCodeSize = 200;int qrCodeX = 200;int qrCodeY = 200;String fontPath = "src/main/resources/msyh.ttf";float fontSize = 30;BufferedImage posterImage = generatePoster(text, imageSize, fontPath, fontSize,qrCodeString, qrCodeSize, qrCodeX, qrCodeY);File outputFile = new File("poster.png");ImageIO.write(posterImage, "png", outputFile);
}
}

补全上面的main测试方法:

public static void main(String[] args) throws Exception {String text = "这是一段测试文字,用于生成海报";String qrCodeString = "https://www.baidu.com/";int imageSize = 600;int qrCodeSize = 200;int qrCodeX = 200;int qrCodeY = 200;String fontPath = "src/main/resources/msyh.ttf";float fontSize = 30;BufferedImage posterImage = generatePoster(text, imageSize, fontPath, fontSize,qrCodeString, qrCodeSize, qrCodeX, qrCodeY);File outputFile = new File("poster.png");ImageIO.write(posterImage, "png", outputFile);
}

在主函数中,我们设置了以下参数:

  • text:海报中要显示的文字内容。
  • qrCodeString:生成海报中的二维码内容,这里设置为百度首页。
  • imageSize:生成的海报图片大小。
  • qrCodeSize:生成的二维码大小。
  • qrCodeXqrCodeY:二维码在海报中的位置。
  • fontPath:文字所使用的字体路径。
  • fontSize:文字大小。

最后,我们调用generatePoster方法生成海报图片,并将其保存到文件中。注意,这里我们将图片保存为png格式,也可以保存为其他格式。


http://www.ppmy.cn/news/298114.html

相关文章

Doris学习笔记

1.数据模型 数据模型 - Apache Doris 1.1 Aggregate 模型(聚合&#xff09; 可以发现&#xff0c;user_id、date、age ...等没有设置 AggregationType, 那么这几个字段就成了一个key了。设置了 AggregationType 字段&#xff0c;说明该列的属性已经成value了。 我们导入一张…

【每天学习一点新知识】应急响应快速指南

一、前言 马上就端午节啦&#xff0c;提前祝大家端午快乐&#xff0c;顺便把之前的六一也给补上&#xff0c;希望大家每天的生活都跟童话世界一样美好&#xff0c;充满希望&#xff08;虽然现实很残酷&#xff09;。 最近更的没有以前勤快了&#xff0c;一是在实习&#xff0c;…

VA屏和IPS屏有什么区别呢?

现在液晶屏行业VA屏和IPS屏都使用非常广泛&#xff0c;在电脑、手机、电视、汽车等行业都可以经常看到。但是很多人并不是很了解VA屏和IPS屏之间的区别&#xff0c;到底哪个好呢。深圳兴宇合技术人员给大家简单介绍下&#xff0c;希望对大家有所帮助。 &#xff08;VA液晶屏&am…

VA液晶屏底色发白是什么原因?

近期有个一直联系但是没有合作的工程师很着急的过来找我&#xff0c;他说他之前合作的液晶屏工厂给他做了一批产品&#xff0c;大概有20%底色发白&#xff0c;正常VA屏的底色是黑色的不可能发白&#xff0c;于是他怀疑是不是做的假VA&#xff0c;我让他给我寄过来不合格的样品来…

Windows 10 控制面板 (Control Panel)

Windows 10 控制面板 (Control Panel) 1. 开始 -> Windows 系统 -> 控制面板 2. Windows 10 开始菜单区域&#xff0c;默认有搜索窗口&#xff0c;在搜索框中直接输入“控制面板”即可。 References https://yongqiang.blog.csdn.net/

MCSManager 面板(MCSM面板)

MCSManager 面板是由国内开发者制作的适用于 Minecraft 服务器的管理面板。 这是一款可以管理多个 Minecraft 服务端&#xff08;支持群组端&#xff09;的 Web 管理面板&#xff0c;并且可以分配多个子账号来分别管理不同的 Minecraft 服务端&#xff0c;支持绝大部分主流的服…

液晶面板类型详解

(转自网络)一个液晶显示器的好坏首先要看它的面板&#xff0c;因为面板的好坏直接影响到画面的观看效果&#xff0c;并且液晶电视面板占到了整机成本了一半以上&#xff0c;是影响液晶电视的造价的主要因素&#xff0c;所以要选一款好的液晶显示器&#xff0c;首先要选好它的面…

Panel面板

Panel面板 package com.zeng.GUI;import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener;public class PPanel {public static void main(String[] args) {Frame frame new Frame("向窗口里…

VA01/VA02/VA03 屏幕增强

销售订单屏幕增强 项目中经常有销售订单屏幕增强的需求以满足客户在录入销售订单时特殊指标的录入和存储。 销售订单屏幕增强分为抬头屏幕增强和行项目屏幕增强&#xff0c;根据需求&#xff0c;完成增强开发。 1.T-code :SE80 输入程序SAPMV45A 2.打开屏幕子文件夹 2.1. …

面板Panel

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>用户登录界面</title> <script typt"text/javascript" src"../ext/ext-all.js"></script> …

面板的操控

1.我把操作跟解析都写在图上了&#xff0c;请自行观看 效果下 2. .set-con{ width:&#xff08;宽&#xff09;; height:&#xff08;高&#xff09;; border:&#xff08;像素&#xff09;&#xff08;线条&#xff09;&#xff08;颜色&am…

IPS面板和PLS液晶面板区别

IPS LG公司广视角技术&#xff0c;常说的硬屏&#xff0c;产品很丰富 PLS 三星公司新出的广视角技术 PLS亮度较高&#xff0c;对比度稍高&#xff0c;他们比VA面板对比度都差很多&#xff0c;VA能达到原生对比度3000:1 。 下面是这三种面板的驱动模式对比。 TN面板 TN全称为Tw…

kubernetes中的PV、PVC

目录 一、statfulset 1.创建顺序 2.收缩顺序 二、PV PVC 1.PV 状态/生命周期 2.PVC 3.nfs 4.PVC 三、emptyDir存储卷 四、hostPath存储卷 五、nfs共享存储卷 六、PVC 和 PV 七、NFS使用PV和PVC 1.配置nfs存储 2.定义PV 3.定义PVC 4.测试访问 一、statfulset…

java 面板刷新延迟_VA面板的高刷新率显示器为什么是垃圾?显示器的“响应延迟”到底什么意思?为什么它这么重要?...

最近在很多朋友选购显示器的时候&#xff0c;都冒出了一个疑问&#xff1a;响应延迟到底是什么&#xff1f;它决定什么&#xff1f;输入延迟又是什么&#xff0c;它决定了什么&#xff1f; 今天我们就把这个问题说个明白 本文将引用很多TFT Central的数据&#xff0c;这家网站目…

青龙面板稳定毛之rdxk

最近有个比较稳定的毛挺稳定得叫热度星客 1&#xff0c;拉库链接 ql raw https://wjkjs.top/wp-content/uploads/2023/01/1675137474-dee45c4ecba0a65.js 2&#xff0c;定时每天跑一次就行了 0 */12 * * * 3&#xff0c;抓包 变量名rdck扫码打开小程序后 抓包 m.reduxing…

显示器面板类型

显示器TN面板和TFT LCD的分别 TFT-LCD是指薄膜晶体管液晶平板显示器&#xff1b; TFT也是一种技术&#xff0c;相对来说&#xff0c;属于比较初级阶段的产物&#xff1b;而TN.VA.IPS面板技术随后不断的被退出&#xff0c; TN全称为Twisted Nematic(扭曲向列型)面板&#xff0c;…

ips和va哪个对眼睛好一点 ips和va屏幕哪个色彩好

IPS屏&#xff1a;广视角、色彩好 IPS屏面板较硬&#xff0c;用手指轻触屏幕&#xff0c;画面不会变形。IPS屏在色彩显示、可视角度等方面比TN面板好上不少&#xff0c;对于色彩的呈现范围与准确性也都有亮眼的表现&#xff0c;广视角是IPS面板的原生优势&#xff0c;不论哪个角…

显示器面板挑花眼 IPS、TN、VA都是啥?

选显示器就是选面板&#xff0c;相信经常关注显示器的朋友都多少看到过这句话。确实&#xff0c;优质的面板是我们获得更好观看体验的保证。 目前&#xff0c;常见的液晶显示器面板类型主要有IPS、VA和TN三种类型。它们的特点各不相同&#xff0c;但是也增加了大家的选购难度。…

TN、IPS、VA面板区别

TN/VA/IPS&#xff0c;指的是TFT-LCD所用的液晶分子种类。由于液晶材料的特性和不同&#xff0c;驱动方式和色彩表现也有很大不同 IPS液晶分子的亮机都是在同一平面&#xff0c;不论什么状态&#xff0c;液晶分子都是和屏幕平行&#xff0c;保持二维的躺平&#xff0c;这一特性…

TN面板、IPS面板、VA面板的区别

空间光调制器&#xff08;SLM&#xff0c;Spatlal Light Modulator&#xff09;是一种能将信息加载于一维或两维的光学数据场上&#xff0c;以便有效的利用光的固有速度、并行性和互连能力的一类器件。目前液晶空间光调制器在空间光调制器中占有主导地位。液晶空间光调制器的显…
最新文章