当前位置:   article > 正文

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

java实现海报生成

目录

前言: 

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

依赖:

编写生成海报代码

另一个方法:

补全上面的main测试方法:



前言: 

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

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

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

2)将图片保存到文件。

依赖:

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

  1. <dependency>
  2. <groupId>com.google.zxing</groupId>
  3. <artifactId>core</artifactId>
  4. <version>3.4.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.google.zxing</groupId>
  8. <artifactId>javase</artifactId>
  9. <version>3.4.1</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>com.itextpdf</groupId>
  13. <artifactId>itextpdf</artifactId>
  14. <version>5.5.13</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.apache.commons</groupId>
  18. <artifactId>commons-lang3</artifactId>
  19. <version>3.12.0</version>
  20. </dependency>
  1. 编写生成海报代码

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

处理文字

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

代码如下:

  1. import com.itextpdf.text.*;
  2. import com.itextpdf.text.pdf.PdfContentByte;
  3. import com.itextpdf.text.pdf.PdfWriter;
  4. import org.apache.commons.lang3.StringUtils;
  5. import java.awt.*;
  6. import java.awt.image.BufferedImage;
  7. import java.io.ByteArrayOutputStream;
  8. import java.io.File;
  9. import java.io.FileOutputStream;
  10. import java.io.IOException;
  11. public class PosterGenerator {
  12. private static final String FONT_PATH = "src/main/resources/msyh.ttf";
  13. /**
  14. * 生成带有文字的海报图片
  15. *
  16. * @param text 文字内容
  17. * @param imageSize 图片大小
  18. * @param fontName 字体名称
  19. * @param fontSize 字体大小
  20. * @return 生成的海报图片
  21. */
  22. public static BufferedImage generateTextPoster(String text, int imageSize, String fontName, float fontSize) throws DocumentException, IOException {
  23. Document document = new Document();
  24. PdfWriter writer = PdfWriter.getInstance(document, new ByteArrayOutputStream());
  25. document.open();
  26. PdfContentByte contentByte = writer.getDirectContent();
  27. Font font = FontFactory.getFont(fontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, fontSize);
  28. Phrase phrase = new Phrase(text, font);
  29. ColumnText.showTextAligned(contentByte, Element.ALIGN_CENTER, phrase, imageSize / 2, imageSize / 2, 0);
  30. document.close();
  31. ByteArrayOutputStream baos = (ByteArrayOutputStream) writer.getDirectContent().getOutputStream();
  32. byte[] pdfBytes = baos.toByteArray();
  33. return convertPDFToImage(pdfBytes, imageSize, imageSize);
  34. }
  35. private static BufferedImage convertPDFToImage(byte[] pdfBytes, int width, int height) throws IOException {
  36. Image image = Image.getInstance(pdfBytes);
  37. BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  38. Graphics2D graphics = bufferedImage.createGraphics();
  39. graphics.setColor(Color.WHITE);
  40. graphics.fillRect(0, 0, width, height);
  41. graphics.drawImage(image, 0, 0, width, height, null);
  42. graphics.dispose();
  43. return bufferedImage;
  44. }
  45. }
  • 代码中,generateTextPoster方法用于生成带有文字的海报图片。首先创建一个PDF文档,设置字体、添加文本、设置位置等,然后将PDF文档转换为图片。convertPDFToImage方法用于将PDF文档转换为BufferedImage类型的图片。

  • 处理二维码

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

代码如下:

  1. import com.google.zxing.BarcodeFormat;
  2. import com.google.zxing.EncodeHintType;
  3. import com.google.zxing.WriterException;
  4. import com.google.zxing.common.BitMatrix;
  5. import com.google.zxing.qrcode.QRCodeWriter;
  6. import javax.imageio.ImageIO;
  7. import java.awt.image.BufferedImage;
  8. import java.io.ByteArrayOutputStream;
  9. import java.io.IOException;
  10. import java.util.HashMap;
  11. import java.util.Map;
  12. public class PosterGenerator {
  13. /**
  14. * 生成带有文字和二维码的海报图片
  15. *
  16. * @param text 文字内容
  17. * @param imageSize 图片大小
  18. * @param fontName 字体名称
  19. * @param fontSize 字体大小
  20. * @param qrCodeString 二维码内容
  21. * @param qrCodeSize 二维码大小
  22. * @param qrCodeX 二维码X坐标
  23. * @param qrCodeY 二维码Y坐标
  24. * @return 生成的海报图片
  25. */
  26. public static BufferedImage generatePoster(String text, int imageSize, String fontName, float fontSize,
  27. String qrCodeString, int qrCodeSize, int qrCodeX, int qrCodeY) throws Exception {
  28. BufferedImage textImage = generateTextPoster(text, imageSize, fontName, fontSize);
  29. BufferedImage qrCodeImage = generateQRCode(qrCodeString, qrCodeSize);
  30. Graphics2D graphics = textImage.createGraphics();
  31. graphics.drawImage(qrCodeImage, qrCodeX, qrCodeY, null);
  32. graphics.dispose();
  33. return textImage;
  34. }
  35. /**
  36. * 生成带有文字的海报图片
  37. *
  38. * @param text 文字内容
  39. * @param imageSize 图片大小
  40. * @param fontName 字体名称
  41. * @param fontSize 字体大小
  42. * @return 生成的海报图片
  43. */
  44. public static BufferedImage generateTextPoster(String text, int imageSize, String fontName, float fontSize) throws Exception {
  45. Document document = new Document();
  46. PdfWriter writer = PdfWriter.getInstance(document, new ByteArrayOutputStream());
  47. document.open();
  48. PdfContentByte contentByte = writer.getDirectContent();
  49. Font font = FontFactory.getFont(fontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, fontSize);
  50. Phrase phrase = new Phrase(text, font);
  51. ColumnText.showTextAligned(contentByte, Element.ALIGN_CENTER, phrase, imageSize / 2, imageSize / 2, 0);
  52. document.close();
  53. ByteArrayOutputStream baos = (ByteArrayOutputStream) writer.getDirectContent().getOutputStream();
  54. byte[] pdfBytes = baos.toByteArray();
  55. return convertPDFToImage(pdfBytes, imageSize, imageSize);
  56. }
  57. /**
  58. * 生成二维码图片
  59. *
  60. * @param qrCodeString 二维码内容
  61. * @param size 二维码大小
  62. * @return 生成的二维码图片
  63. */
  64. public static BufferedImage generateQRCode(String qrCodeString, int size) throws WriterException, IOException {
  65. Map<EncodeHintType, Object> hints = new HashMap<>();
  66. hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
  67. QRCodeWriter qrCodeWriter = new QRCodeWriter();
  68. BitMatrix bitMatrix = qrCodeWriter.encode(qrCodeString, BarcodeFormat.QR_CODE, size, size, hints);
  69. BufferedImage qrCodeImage = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);
  70. for (int x = 0; x < size; x++) {
  71. for (int y = 0; y < size; y++) {
  72. qrCodeImage.setRGB(x, y, bitMatrix.get(x, y) ? Color.BLACK.getRGB() : Color.WHITE.getRGB());
  73. }
  74. }
  75. return qrCodeImage;
  76. }
  77. private static BufferedImage convertPDFToImage(byte[] pdfBytes, int width, int height) throws IOException {
  78. Image image = Image.getInstance(pdfBytes);
  79. BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  80. Graphics2D graphics = bufferedImage.createGraphics();
  81. graphics.setColor(Color.WHITE);
  82. graphics.fillRect(0, 0, width, height);
  83. graphics.drawImage(image, 0, 0, width, height, null);
  84. graphics.dispose();
  85. return bufferedImage;
  86. }
  87. public static void main(String[] args) throws Exception {
  88. String text = "这是一段测试文字,用于生成海报";
  89. String qrCodeString = "https://www.baidu.com/";
  90. int imageSize = 600;
  91. int qrCodeSize =

另一个方法:

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

示例代码如下:

  1. import javax.imageio.ImageIO;
  2. import java.awt.*;
  3. import java.awt.image.BufferedImage;
  4. import java.io.File;
  5. import java.io.IOException;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8. public class PosterGenerator {
  9. private static final String FONT_PATH = "src/main/resources/msyh.ttf";
  10. /**
  11. * 生成带有文字和二维码的海报图片
  12. *
  13. * @param text 文字内容
  14. * @param imageSize 图片大小
  15. * @param fontName 字体名称
  16. * @param fontSize 字体大小
  17. * @param qrCodeString 二维码内容
  18. * @param qrCodeSize 二维码大小
  19. * @param qrCodeX 二维码X坐标
  20. * @param qrCodeY 二维码Y坐标
  21. * @return 生成的海报图片
  22. */
  23. public static BufferedImage generatePoster(String text, int imageSize, String fontName, float fontSize,
  24. String qrCodeString, int qrCodeSize, int qrCodeX, int qrCodeY) throws Exception {
  25. BufferedImage textImage = generateTextPoster(text, imageSize, fontName, fontSize);
  26. BufferedImage qrCodeImage = generateQRCode(qrCodeString, qrCodeSize);
  27. Graphics2D graphics = textImage.createGraphics();
  28. graphics.drawImage(qrCodeImage, qrCodeX, qrCodeY, null);
  29. graphics.dispose();
  30. return textImage;
  31. }
  32. /**
  33. * 生成带有文字的海报图片
  34. *
  35. * @param text 文字内容
  36. * @param imageSize 图片大小
  37. * @param fontName 字体名称
  38. * @param fontSize 字体大小
  39. * @return 生成的海报图片
  40. */
  41. public static BufferedImage generateTextPoster(String text, int imageSize, String fontName, float fontSize) throws Exception {
  42. Document document = new Document();
  43. PdfWriter writer = PdfWriter.getInstance(document, new ByteArrayOutputStream());
  44. document.open();
  45. PdfContentByte contentByte = writer.getDirectContent();
  46. Font font = FontFactory.getFont(fontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, fontSize);
  47. Phrase phrase = new Phrase(text, font);
  48. ColumnText.showTextAligned(contentByte, Element.ALIGN_CENTER, phrase, imageSize / 2, imageSize / 2, 0);
  49. document.close();
  50. ByteArrayOutputStream baos = (ByteArrayOutputStream) writer.getDirectContent().getOutputStream();
  51. byte[] pdfBytes = baos.toByteArray();
  52. return convertPDFToImage(pdfBytes, imageSize, imageSize);
  53. }
  54. /**
  55. * 生成二维码图片
  56. *
  57. * @param qrCodeString 二维码内容
  58. * @param size 二维码大小
  59. * @return 生成的二维码图片
  60. */
  61. public static BufferedImage generateQRCode(String qrCodeString, int size) throws WriterException {
  62. Map<EncodeHintType, Object> hints = new HashMap<>();
  63. hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
  64. BitMatrix bitMatrix = new MultiFormatWriter().encode(qrCodeString, BarcodeFormat.QR_CODE, size, size, hints);
  65. int width = bitMatrix.getWidth();
  66. int height = bitMatrix.getHeight();
  67. BufferedImage qrCodeImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  68. for (int x = 0; x < width; x++) {
  69. for (int y = 0; y < height; y++) {
  70. qrCodeImage.setRGB(x, y, bitMatrix.get(x, y) ? Color.BLACK.getRGB() : Color.WHITE.getRGB());
  71. }
  72. }
  73. return qrCodeImage;
  74. }
  75. private static BufferedImage convertPDFToImage(byte[] pdfBytes, int width, int height) throws IOException {
  76. Image image = Image.getInstance(pdfBytes);
  77. BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  78. Graphics2D graphics = bufferedImage.createGraphics();
  79. graphics.setColor(Color.WHITE);
  80. graphics.fillRect(0, 0, width, height);
  81. graphics.drawImage(image, 0, 0, width, height, null);
  82. graphics.dispose();
  83. return bufferedImage;
  84. }
  85. public static void main(String[] args) throws Exception {
  86. String text = "这是一段测试文字,用于生成海报";
  87. String qrCodeString = "https://www.baidu.com/";
  88. int imageSize = 600;
  89. int qrCodeSize = 200;
  90. int qrCodeX = 200;
  91. int qrCodeY = 200;
  92. String fontPath = "src/main/resources/msyh.ttf";
  93. float fontSize = 30;
  94. BufferedImage posterImage = generatePoster(text, imageSize, fontPath, fontSize,
  95. qrCodeString, qrCodeSize, qrCodeX, qrCodeY);
  96. File outputFile = new File("poster.png");
  97. ImageIO.write(posterImage, "png", outputFile);
  98. }
  99. }

补全上面的main测试方法:

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

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

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

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

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号