最近公司一个需要,需要把商品的优惠卷分享链接,生成一个二维码然后和商品主图合成一张,并且在新合成的主图增加商品信息的描述,好了直接看合成后图片的样式

下面我就直接贴代码,首先是Contorller层

    /**
* 淘宝二维码,商品主图,合成一张图
*
* @param pictUrl
* @param request
* @param response
* @throws IOException
*/
@RequestMapping("/getTaoBaoqQRCode")
public void getTaoBaoqQRCode(TaoBaoQRCode taoBaoQRCode, HttpServletRequest request,
HttpServletResponse response) throws IOException {
ServletOutputStream os = null;
InputStream buffin = null;
try {
// 二维码
String couponUlr = "https:" + taoBaoQRCode.getCouponShareUrl();// 高额卷分享链接
byte[] imgByte = QrCodeUtil.createQrCode2Bytes(250, 250, couponUlr);
buffin = new ByteArrayInputStream(imgByte);
BufferedImage couponImage = ImageIO.read(buffin);
// 商品主图
String imageUrl = "https:" + taoBaoQRCode.getPictUrl();
URL url = new URL(imageUrl);
BufferedImage picImage = ImageIO.read(url);
BufferedImage modifyImage =
imageHandleUtil.mergeImage(picImage, couponImage, taoBaoQRCode.getTitle(),
taoBaoQRCode.getReservePrice(), taoBaoQRCode.getZkFinalPrice());
response.setContentType("image/jpg");
os = response.getOutputStream();
ImageIO.write(modifyImage, "jpg", os);
os.flush();
} catch (Exception e) {
LOGGER.error("getTaoBaoqQRCode error");
e.printStackTrace();
} finally {
buffin.close();
os.close();
}
}

二维码QrCodeUtil 生成帮助类

public class QrCodeUtil {
private static final int DAFAULT_WIDTH = 360;
private static final int DAFAULT_HEIGHT = 360; private static final Logger LOGGER = LoggerFactory.getLogger(QrCodeUtil.class); public static String createQrCode(String text) {
return createQrCode(DAFAULT_WIDTH, DAFAULT_HEIGHT, text);
} public static String createQrCode(int widht, int height, String text) {
HashMap<EncodeHintType, String> hints = new HashMap<EncodeHintType, String>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
try {
byte[] bytes = createQrCode2Bytes(widht, height, text);
String fileName = UUID.randomUUID().toString().replaceAll("-", "") + ".png";
return UpYunClient.upload(fileName, bytes);
} catch (Exception e) {
LOGGER.error("create qrcode error", e);
}
return null;
} public static byte[] createQrCode2Bytes(String text) {
return createQrCode2Bytes(DAFAULT_WIDTH, DAFAULT_HEIGHT, text);
} public static byte[] createQrCode2Bytes(int widht, int height, String text) {
HashMap<EncodeHintType, String> hints = new HashMap<EncodeHintType, String>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
try {
BitMatrix bitMatrix =
new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, widht, height,
hints);
ByteArrayOutputStream out = new ByteArrayOutputStream();
BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
ImageIO.write(image, "png", out);
return out.toByteArray();
} catch (Exception e) {
LOGGER.error("create qrcode error", e);
}
return null;
} /**
* 生成条形码并已字节码形式返回,生成的图片格式为png
*
* @param contents
* @param width
* @param height
* @return
*/
public static byte[] createBarcode2Byte(String contents, int width, int height) {
int codeWidth = 3 + // start guard
(7 * 6) + // left bars
5 + // middle guard
(7 * 6) + // right bars
3; // end guard
codeWidth = Math.max(codeWidth, width);
try {
BitMatrix bitMatrix =
new MultiFormatWriter().encode(contents, BarcodeFormat.CODE_128, codeWidth,
height, null);
BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(image, "png", out);
return out.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

二维码生成我这里用的是谷歌的看下面maven pom.xml 文件

        <!-- 条形码、二维码生成 -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>2.2</version>
</dependency>

合成图片方法如何

package com.qft.campuscircle.common.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import org.springframework.stereotype.Component; @Component
public class ImageHandleUtil {
private Font font = null;
private Graphics2D g = null; /**
* 导入本地图片到缓冲区
*
* @param imgName
* @return
*/
public BufferedImage loadImageLocal(String imgName) {
try {
return ImageIO.read(new File(imgName));
} catch (IOException e) {
e.printStackTrace();
}
return null;
} /**
* 导入网络图片到缓冲区
*
* @param imgName
* @return
*/
public BufferedImage loadImageUrl(String imgName) {
try {
URL url = new URL(imgName);
return ImageIO.read(url);
} catch (IOException e) {
e.printStackTrace();
}
return null;
} /**
* 生成新图片到本地
*
* @param newImage
* @param img
*/
public void writeImageLocal(String newImage, BufferedImage img) {
if (newImage != null && img != null) {
try {
// 目录不存在则创建
String dirUrl = newImage.substring(0, newImage.lastIndexOf(File.separator));
File dir = new File(dirUrl);
if (!dir.exists()) {
dir.mkdirs();
}
File outputfile = new File(newImage);
ImageIO.write(img, "png", outputfile);
} catch (IOException e) {
e.printStackTrace();
}
}
} /**
* 设定文字的字体等
*
* @param fontStyle
* @param fontSize
*/
public void setFont(String name, int style, int fontSize) {
this.font = new Font(name, style, fontSize);
} /**
* 修改图片,返回修改后的图片缓冲区(只输出一行文本),图片居中显示
*
* @param img
* @param content
* @param y
* @param color
* @return
*/
public BufferedImage modifyImage(BufferedImage img, Object content, int y, Color color) {
try {
g = img.createGraphics();
g.setBackground(Color.WHITE);
g.setColor(color);// 设置字体颜色
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿
if (this.font != null)
g.setFont(this.font);
int width = img.getWidth();// 图片宽度
if (content != null) {
String str = content.toString();
int strWidth = g.getFontMetrics().stringWidth(str);// 字体宽度
g.drawString(str, (width - strWidth) / 2, y);
}
g.dispose();
} catch (Exception e) {
e.printStackTrace();
}
return img;
} public BufferedImage modifyImage(BufferedImage img, Object content, int x, int y, Color color) {
try {
g = img.createGraphics();
g.setBackground(Color.WHITE);
g.setColor(color);// 设置字体颜色
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿
if (this.font != null)
g.setFont(this.font);
if (content != null) {
String str = content.toString();
g.drawString(str, x, y);
}
g.dispose();
} catch (Exception e) {
e.printStackTrace();
}
return img;
} /**
* 将一张图片画在另一张图片上
*
* @param addImage 被添加的图片
* @param sourceImg 源图
* @param x
* @param y
* @param width
* @param height
* @return
*/
public BufferedImage modifyImagetogeter(BufferedImage addImage, BufferedImage sourceImg, int x,
int y) {
int width = addImage.getWidth();
int height = addImage.getHeight();
try {
g = sourceImg.createGraphics();
g.drawImage(addImage, x, y, width, height, null);
g.dispose();
} catch (Exception e) {
e.printStackTrace();
}
return sourceImg;
}
/**
*
* @param img1
* @param img2
* @param title 标题
* @param reservePrice 现价
* @param zkFinalPrice 折扣价
* @return BufferedImage
* @throws IOException
*/
public BufferedImage mergeImage(BufferedImage img1, BufferedImage img2,String title,String reservePrice,String zkFinalPrice)
throws IOException {
Font font = new Font("微软雅黑", Font.BOLD, 20);
int w1 = img1.getWidth();
int h1 = img1.getHeight();
int w2 = img2.getWidth();
int h2 = img2.getHeight();
BufferedImage newImage = new BufferedImage(w1, h2 + h1 + h2/2, BufferedImage.TYPE_INT_RGB);// 新的图
Graphics2D graphics = (Graphics2D) newImage.getGraphics();
graphics.setBackground(Color.WHITE);
graphics.fillRect(0, 0, newImage.getWidth(), newImage.getHeight());
graphics.drawImage(img1, 0, 0, null);
graphics.drawImage(img2, (newImage.getWidth()) / 2 - (w2 / 2), newImage.getHeight() - h2,
null);
graphics.setFont(font);
graphics.setColor(Color.BLACK);
int width = graphics.getFontMetrics(font).stringWidth(title);
int startY = h1 + 30;
if (width > newImage.getWidth()) {
char[] array = title.toCharArray();
StringBuilder sb = new StringBuilder(array[0]);
for (char c : array) {
sb.append(c);
int newWidth = graphics.getFontMetrics(font).stringWidth(sb.toString());
if ((newWidth + 19) >= newImage.getWidth()) {// 准备换行
graphics.drawString(sb.toString(), 0, startY);
startY += 30;
sb.delete(0, sb.length());
}
}
graphics.drawString(sb.toString(), 0, startY);
} else {
graphics.drawString(title, 0, startY);
}
graphics.drawString("现价¥"+reservePrice, 0, startY + 30);
startY += 30;
graphics.drawString("卷后价¥"+zkFinalPrice, 0, startY + 30);
return newImage;
}
}

两个帮助类里面有很多方法没用到,大家只要看几个关键的方法就可以了,TaoBaoQRCode 对象里面的属性我就没列出来了,大家自己根据自己的需求而定

java 对图片的添加文字描述,以及两张图片合成一张的更多相关文章

  1. java图片处理——多张图片合成一张Gif图片并播放或Gif拆分成多张图片

    1.多张jpg图合成gif动画 /** * 把多张jpg图片合成一张 * @param pic String[] 多个jpg文件名 包含路径 * @param newPic String 生成的gif ...

  2. java在图片上添加文字

    业务需求要在图片上添加水印.下面粘出代码供自己和大家分享 package com.pro.drawTextOnImg; import java.awt.Color; import java.awt.F ...

  3. python 图片上添加文字

    import PIL from PIL import ImageFont from PIL import Image from PIL import ImageDraw #设置字体,如果没有,也可以不 ...

  4. Office WORD如何在图片上添加文字

    如图所示,在图片格式中选择图片衬于文字下方即可,这样看起来感觉就像在图片上直接加字一样,没有生硬的感觉. 最终效果: Word如何在图片上添加文字Word如何在图片上添加文字Word如何在图片上添加文 ...

  5. python如何在图片上添加文字(中文和英文)

    Python在图片上添加文字的两种方法:OpenCV和PIL 一.OpenCV方法 1.安装cv2 pip install opencv-python 2.利用putText方法来实现在图片的指定位置 ...

  6. java 通过Qrcode生成二维码添加图片logo和文字描述

    /** * 二维码创建 * @author yhzm * */ public class printServiceImpl extends BaseService { public void barC ...

  7. php 使用GD库压缩图片,添加文字图片水印

    先上一个工具类,提供了压缩,添加文字.图片水印等方法: image.class.php <?php class Image { private $info; private $image; pu ...

  8. python PIL图像处理-图片上添加文字

    首先需要安装库pillow cmd安装命令:pip install pillow 安装完后,编写脚本如下: from PIL import Image, ImageDraw, ImageFont de ...

  9. C#在图片上添加文字代码

    创建.NET WinForm程序,设置项目的默认命名空间为Keleyi.Com,在窗体上添加一个PictureBox控件pictureBox_keleyi_com和一个Button控件button_A ...

随机推荐

  1. input设置为disabled,表单无法提交后台解决方法

    <input name="country" id="country" size=12 value="disabled提交时得不到该值 " ...

  2. 移动 APP 端与服务器端用户身份认证的安全方案

    最近要做一个项目是java开发后端服务,然后移动APP调用.由于之前没有接触过这块,所以在网上搜索相关的方案.然后搜到下面的一些方案做一些参考. 原文:移动 APP 端与服务器端用户身份认证的安全方案 ...

  3. JSON解析及数据库操作实战篇

    代码: JSONObject json = JSONObject.parseObject(ubody);//得到整个json JSONObject AutoTable=json.getJSONObje ...

  4. php基础系列之 数据的存储和读取

    ·文件处理 ·写入一个文件 1,打开这个文件.如果这个文件不存在,需要先创建它 2,将数据写入这个文件 3,关闭这个文件 ·从一个文件读出数据 1,打开这个文件.如果这个文件不能打开(例如,文件不存在 ...

  5. 用阿里fastJson解析Json字符串

    一下总结来自工作代码: 1.第一种情况: 通过服务器端发送http请求获取的接送字符串. String jsonStr = HttpRequestUtil.sendGet(config.getAddr ...

  6. 关于Javaweb的比较好用的jar包概述

    (连接数据库之前首先要导入这个数据库的驱动jar包 例如mysql 为mysql-connector-java-5.1.46.jar) 关于连接数据库的数据库连接池c3p0  jar包: c3p0-0 ...

  7. 工具使用:xmind

    概念 心智图,又称脑图.思维导图.灵感触发图.概念地图或思维地图,是一种图像式思维的工具与及一种利用图像式思考辅助工具来表达思维的工具. 详细的可以查看这里(维基百科)还有这里(百度百科) 用了思维导 ...

  8. crontab调用python脚本新思路

    crontab调用python脚本文件,有可能失败,定时执行并没有执行,怎么办? 答:写一个shell脚本调用python,然后用crontab调用shell脚本.具体细节,有时间补充. ————— ...

  9. 1167E - Range Deleting 双指针

    题意:给出n个数的序列,并给出x,这n个数的范围为[1,x],f(L,R)表示删除序列中取值为[l,r]的数,问有几对L,R使得操作后的序列为非递减序列 思路:若[l,r]成立,那么[l,r+1],. ...

  10. Django_类视图

    1. View 2. tamplate view 3. ListView