Java 生成图片(图片合成二维码、文字)

package com.rsfy.utils;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.ImageOutputStream;

import net.sf.json.JSONObject;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.InputStreamBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

/**
 * Java 图片生成
 * 
 * @author houzhenghai
 * @date 2018年10月19日 下午4:59:35
 */
public class DrawingUtils {

	private static float jPEGcompression = 0.75f;// 图片清晰比率

	/**
	 * @Description : 将二维码图片和文字生成到一张图片上
	 * @Param : originalImg 原图
	 * @Param : qrCodeImg 二维码地址
	 * @Param : shareDesc 图片文字
	 * @return : java.lang.String
	 * @Author : houzhenghai
	 * @Date : 2018/8/15
	 */
	public static String generateImg(String originalImg, String qrCodeImg, String shareDesc) throws Exception {
		// 加载原图图片
		BufferedImage imageLocal = ImageIO.read(new URL(originalImg));
		// 加载用户的二维码
		BufferedImage imageCode = ImageIO.read(new URL(qrCodeImg));
		// 以原图片为模板
		Graphics2D g = imageLocal.createGraphics();
		AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER);
		g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
		g.setComposite(ac);
		g.setBackground(Color.WHITE);
		// 在模板上添加用户二维码(地址,左边距,上边距,图片宽度,图片高度,未知)
		g.drawImage(imageCode, 100, imageLocal.getHeight() - 190, 160, 158, null);
		// 设置文本样式
		g.setFont(new Font("微软雅黑", Font.PLAIN, 40));
		g.setColor(Color.red);
		// 计算文字长度,计算居中的x点坐标
		g.drawString(shareDesc, imageLocal.getWidth() - 330, imageLocal.getHeight() - 530);

		// 设置文本样式
		g.setFont(new Font("微软雅黑", Font.PLAIN + Font.BOLD, 16));
		g.setColor(Color.WHITE);
		// 计算文字长度,计算居中的x点坐标
		String caewm = "长按二维码";
		g.drawString(caewm, 105, imageLocal.getHeight() - 10);

		ByteArrayOutputStream out = new ByteArrayOutputStream();
		saveAsJPEG(imageLocal, out);
		out.close();
		return urlImgDownInputStream(FileUtils.parse(out));
	}

	/**
	 * 以JPEG编码保存图片
	 * 
	 * @param image_to_save
	 *            要处理的图像图片
	 * @param fos
	 *            文件输出流
	 * @throws IOException
	 */
	private static void saveAsJPEG(BufferedImage imageToSave, ByteArrayOutputStream fos) throws IOException {
		ImageWriter imageWriter = ImageIO.getImageWritersBySuffix("jpg").next();
		ImageOutputStream ios = ImageIO.createImageOutputStream(fos);
		imageWriter.setOutput(ios);
		if (jPEGcompression >= 0 && jPEGcompression <= 1f) {
			// new Compression
			JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) imageWriter.getDefaultWriteParam();
			jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
			jpegParams.setCompressionQuality(jPEGcompression);

		}
		// new Write and clean up
		ImageIO.setUseCache(false);
		imageWriter.write(new IIOImage(imageToSave, null, null));
		ios.close();
		imageWriter.dispose();
	}

	/**
	 * 图片流远程上传
	 * 
	 * @author houzhenghai
	 * @date 2018年10月19日 下午5:07:24
	 * @param inStream
	 * @param imgType
	 * @return
	 * @throws Exception
	 */
	private static String urlImgDownInputStream(InputStream inStream) throws Exception {
		String md5 = MD5Utils.MD5(TimeUtils.getTimestamp().toString());
		HttpClient httpclient = new DefaultHttpClient();
		try {
			HttpPost post = new HttpPost(IMG_UPLOAD_PATH);// 文件服务器上传图片地址
			MultipartEntity mpEntity = new MultipartEntity();
			ContentBody contb = new InputStreamBody(inStream, md5 + ".png");
			mpEntity.addPart("Filedata", contb);
			post.setEntity(mpEntity);
			HttpResponse httpResponse = httpclient.execute(post);
			HttpEntity entity = httpResponse.getEntity();
			String jsonStr = EntityUtils.toString(entity);
			JSONObject ob = JSONObject.fromObject(jsonStr);
			if (!ob.isEmpty() && ob.containsKey("pic_id")) {
				return ob.getString("pic_id");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			httpclient.getConnectionManager().shutdown();
		}
		return null;
	}

	/**
	 * test
	 * 
	 * @param args
	 * @throws
	 */
	public static void main(String[] args) {
		long starttime = System.currentTimeMillis();
		System.out.println("开始:" + starttime);
		try {
			String originalImg = "http://xxxxxx.com/images/original.jpg";
			String qrCodeImg = "http://xxxxxx.com/images/qrcode.jpg";
			String shareDesc = "原价9999.99元";
			String img = generateImg(originalImg, qrCodeImg, shareDesc);
			System.out.println("生成完毕,url=" + img);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("结束:" + (System.currentTimeMillis() - starttime) / 1000);
	}

}

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值