yujian
2020-05-20 4c336b22a20b45a1e439a87f70747a96ad0e8e7b
fanli/src/main/java/com/yeshi/fanli/util/ImageUtil.java
@@ -1,1352 +1,2775 @@
package com.yeshi.fanli.util;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.RenderingHints.Key;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.imageio.ImageIO;
import org.yeshi.utils.DateLunarUtil;
import org.yeshi.utils.HttpUtil;
import org.yeshi.utils.entity.DateInfo;
import com.yeshi.fanli.entity.bus.activity.RecommendActivityTaoBaoGoods;
import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.util.taobao.TaoBaoUtil;
public class ImageUtil {
   // 画商品分享图
   public static InputStream drawGoodsShareImg(InputStream qrcodeStream, InputStream portrait,
         TaoBaoGoodsBrief goods) {
      String fontPath = "/usr/share/fonts/PingFang_Medium.ttf";
      String os = System.getProperty("os.name");
      if (os.toLowerCase().startsWith("win")) {
         fontPath = "D:/PingFang_Medium.ttf";
      }
      String fontBoldPath = "/usr/share/fonts/PingFang_Heavy_0.ttf";
      if (os.toLowerCase().startsWith("win")) {
         fontBoldPath = "D:/PingFang_Heavy_0.ttf";
      }
      final BufferedImage targetImg = new BufferedImage(720, 1280, BufferedImage.TYPE_INT_RGB);
      HashMap<Key, Object> mapH = new HashMap<Key, Object>();
      mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
      mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
      final Graphics2D g2d = (Graphics2D) targetImg.getGraphics();
      g2d.setRenderingHints(mapH);
      g2d.setColor(Color.WHITE);
      g2d.fillRect(0, 0, 720, 1280);
      Font font = null;
      try {
         font = Font.createFont(Font.PLAIN, new File(fontPath)).deriveFont(30.0f);
      } catch (FontFormatException e1) {
         e1.printStackTrace();
      } catch (IOException e1) {
         e1.printStackTrace();
      }
      g2d.setFont(font);
      try {
         g2d.setColor(new Color(153, 153, 153));
         // 画来源图标
         InputStream userTypeIcon = null;
         if (goods.getUserType() == 0)// 淘宝
         {
            userTypeIcon = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_tb.png");
         } else {
            userTypeIcon = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_tm.png");
         }
         g2d.drawImage(ImageIO.read(userTypeIcon), 50, 88, null);
         // 商品标题
         String title = goods.getTitle();
         int row = 0;
         int length = 0;
         // 画第一排
         length = getTextLengthByWidth(g2d, font, title, 500, 10);
         g2d.drawString(title.substring(0, length), 50 + 65, 112 + row * 40);
         title = title.substring(length);
         row++;
         // 判断是否画完,最多画2排
         while (title.length() > 0 && row < 2) {
            length = getTextLengthByWidth(g2d, font, title, 335, 10);
            g2d.drawString(title.substring(0, length), 50, 112 + row * 40);
            title = title.substring(length);
            row++;
         }
         // 画商品主图
         InputStream goodsPicture = TaoBaoHttpUtil.getAsInputStream(goods.getPictUrl());
         BufferedImage picImage = ImageIO.read(goodsPicture);
         picImage = zoomInImage(picImage, 620, 620);
         g2d.drawImage(picImage, 50, 190, null);
         Font boldFont = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(50.0f);
         // 画价格
         // 有券
         if (!StringUtil.isNullOrEmpty(goods.getCouponInfo())) {
            BigDecimal finalPrice = goods.getZkPrice();
            if (goods.getCouponStartFee().compareTo(goods.getZkPrice()) <= 0
                  && goods.getZkPrice().compareTo(goods.getCouponAmount()) >= 0) {
               finalPrice = goods.getZkPrice().subtract(goods.getCouponAmount());
            }
            g2d.setColor(new Color(229, 0, 93));
            g2d.drawString("券后价  ¥", 57, 875);
            g2d.setColor(new Color(229, 0, 93));
            g2d.setFont(boldFont);
            g2d.drawString(finalPrice.toString(), 85 + 110, 875);
            // 画券右侧
            BufferedImage quanRight = ImageIO
                  .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_right.png"));
            g2d.setColor(new Color(241, 66, 66));
            g2d.drawImage(quanRight, 670 - quanRight.getWidth(), 852, null);
            // 画券的内容
            g2d.setColor(new Color(229, 0, 93));
            String quanString = " " + MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount()) + "元券 ";
            boldFont = boldFont.deriveFont(44.0f);
            g2d.setFont(boldFont);
            FontMetrics fm = g2d.getFontMetrics(boldFont);
            int textLength = fm.stringWidth(quanString);
            g2d.fillRect(670 - quanRight.getWidth() - textLength, 852, textLength, 80);
            g2d.setColor(Color.WHITE);
            g2d.setFont(boldFont);
            g2d.drawString(quanString, 670 - quanRight.getWidth() - textLength, 927 - 19);
            // 画券左侧
            BufferedImage quanLeft = ImageIO
                  .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_left.png"));
            g2d.drawImage(quanLeft, 670 - quanRight.getWidth() - textLength - quanLeft.getWidth(), 852, null);
            String zkPriceName = "";
            if (goods.getUserType() == 0)
               zkPriceName = "淘宝价  ¥ " + MoneyBigDecimalUtil.getWithNoZera(goods.getZkPrice());
            else
               zkPriceName = "天猫价  ¥ " + MoneyBigDecimalUtil.getWithNoZera(goods.getZkPrice());
            g2d.setColor(new Color(153, 153, 153));
            font = font.deriveFont(30.0f);
            g2d.setFont(font);
            g2d.drawString(zkPriceName, 56, 930);
         } else// 无券
         {
            g2d.setColor(new Color(229, 0, 93));
            g2d.drawString("¥", 60, 870);
            g2d.setColor(new Color(229, 0, 93));
            BigDecimal finalPrice = goods.getZkPrice();
            g2d.setFont(boldFont);
            g2d.drawString(finalPrice.toString(), 85, 870);
         }
         g2d.setColor(new Color(247, 247, 247));
         g2d.fillRect(56, 1015, 608, 204);
         // 画二维码
         BufferedImage qrcodeImage = ImageIO.read(qrcodeStream);
         qrcodeImage = zoomInImage(qrcodeImage, 170, 170);
         g2d.drawImage(qrcodeImage, 56 + 17, 1015 + 17, null);
         // 画头像
         if (portrait != null) {
            BufferedImage portraitImg = ImageIO.read(portrait);
            portraitImg = zoomInImage(portraitImg, 40, 40);
            g2d.drawImage(portraitImg, 56 + 17 + (qrcodeImage.getWidth() - portraitImg.getWidth()) / 2,
                  1015 + 17 + (qrcodeImage.getHeight() - portraitImg.getHeight()) / 2, null);
         }
         font = font.deriveFont(30.0f);
         g2d.setFont(font);
         g2d.setColor(new Color(229, 0, 93));
         // g2d.drawString("返利券提醒您", 250 + 17, 1080 + 17);
         g2d.setColor(new Color(102, 102, 102));
         g2d.drawString("长按识别二维码领取优惠券", 250 + 17, 1130 + 17);
         g2d.dispose();
         // OutputStream out = new ByteArrayOutputStream(); new
         // FileOutputStream(new File(targetPath));
         // ImageIO.write(targetImg, "JPEG", out);
         // out.flush();
         // out.close();
         ByteArrayOutputStream aos = new ByteArrayOutputStream();
         ImageIO.write(targetImg, "JPEG", aos);
         InputStream is = new ByteArrayInputStream(aos.toByteArray());
         return is;
      } catch (Exception e) {
         try {
            LogHelper.errorDetailInfo(e);
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      }
      return null;
   }
   /**
    * 绘制大的商品动态分享图
    *
    * @param qrcodeStream
    * @param portrait
    * @param goods
    * @return
    */
   public static InputStream drawActivityGoodsShareBigImg(InputStream qrcodeStream, InputStream portrait,
         List<RecommendActivityTaoBaoGoods> goodsList) {
      String fontPath = "/usr/share/fonts/PingFang_Medium.ttf";
      String os = System.getProperty("os.name");
      if (os.toLowerCase().startsWith("win")) {
         fontPath = "D:/PingFang_Medium.ttf";
      }
      String fontBoldPath = "/usr/share/fonts/PingFang_Heavy_0.ttf";
      if (os.toLowerCase().startsWith("win")) {
         fontBoldPath = "D:/PingFang_Heavy_0.ttf";
      }
      final BufferedImage targetImg = new BufferedImage(1420, 1334, BufferedImage.TYPE_INT_RGB);
      HashMap<Key, Object> mapH = new HashMap<Key, Object>();
      mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
      mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
      final Graphics2D g2d = (Graphics2D) targetImg.getGraphics();
      g2d.setRenderingHints(mapH);
      g2d.setColor(Color.WHITE);
      g2d.fillRect(0, 0, 1420, 1334);
      Font font = null;
      try {
         font = Font.createFont(Font.PLAIN, new File(fontPath)).deriveFont(30.0f);
      } catch (FontFormatException e1) {
         e1.printStackTrace();
      } catch (IOException e1) {
         e1.printStackTrace();
      }
      Font boldFont = null;
      try {
         boldFont = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(50.0f);
      } catch (FontFormatException e2) {
         e2.printStackTrace();
      } catch (IOException e2) {
         e2.printStackTrace();
      }
      g2d.setFont(font);
      try {
         g2d.setColor(new Color(153, 153, 153));
         // 画第一张
         for (int i = 0; i < goodsList.size(); i++) {
            RecommendActivityTaoBaoGoods goods = goodsList.get(i);
            // 第一张图需要有价格信息
            if (i == 0) {
               int topX = 50;
               int topY = 50;
               // 画大图 起始点坐标为(50,50)
               InputStream goodsPicture = TaoBaoHttpUtil
                     .getAsInputStream(goods.getPictUrl().replace("_.webp", "").replace("_220x220", ""));
               BufferedImage picImage = ImageIO.read(goodsPicture);
               picImage = zoomInImage(picImage, 650, 650);
               g2d.drawImage(picImage, topX, topX, null);
               g2d.setColor(new Color(224, 224, 224));
               // 画边框
               g2d.setStroke(new BasicStroke(1.0f));
               g2d.drawRect(topX - 1, topY - 1, 651, 651);
               // 画透明背景
               g2d.setColor(new Color(255, 255, 255, 210));
               g2d.fillRect(50, 600, 650, 100);
               // 画金额
               g2d.setColor(new Color(240, 0, 102));
               boldFont = boldFont.deriveFont(22.0f);
               g2d.setFont(boldFont);
               g2d.drawString("¥", 70, 650);
               boldFont = boldFont.deriveFont(42.0f);
               g2d.setFont(boldFont);
               g2d.drawString(goods.getQuanPrice(), 90, 650);
               // 画原价
               g2d.setColor(new Color(102, 102, 102));
               font = font.deriveFont(24.0f);
               g2d.setFont(font);
               String zkPrice = new BigDecimal(goods.getQuanPrice().replace("¥", "")).add(goods.getCouponAmount())
                     .toString();
               g2d.drawString("¥ " + zkPrice, 70, 650 + 33);
               FontMetrics fm = g2d.getFontMetrics(font);
               int textLength = fm.stringWidth(zkPrice);
               // 画删除线
               g2d.setStroke(new BasicStroke(2.0f));
               g2d.drawLine(70 + 20, 674, 90 + 10 + textLength, 674);
               // 画券右侧
               BufferedImage quanRight = ImageIO
                     .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_right.png"));
               quanRight = zoomInImage(quanRight, 12, 60);
               g2d.setColor(new Color(241, 66, 66));
               g2d.drawImage(quanRight, topX + 630 - quanRight.getWidth(), topY + 630 - quanRight.getHeight(),
                     null);
               // 画券的内容
               g2d.setColor(new Color(229, 0, 93));
               String quanString = " " + MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount()) + "元券 ";
               font = font.deriveFont(36.0f);
               g2d.setFont(font);
               fm = g2d.getFontMetrics(font);
               textLength = fm.stringWidth(quanString);
               g2d.fillRect(topX + 630 - quanRight.getWidth() - textLength, topY + 630 - quanRight.getHeight(),
                     textLength, quanRight.getHeight());
               g2d.setColor(Color.WHITE);
               g2d.drawString(quanString, topX + 630 - quanRight.getWidth() - textLength,
                     topY + 630 + 42 - quanRight.getHeight());
               // 画券左侧
               BufferedImage quanLeft = ImageIO
                     .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_left.png"));
               quanLeft = zoomInImage(quanLeft, 12, 60);
               g2d.drawImage(quanLeft, topX + 630 - quanRight.getWidth() - textLength - quanLeft.getWidth(),
                     topY + 630 - quanRight.getHeight(), null);
            } else {
               // 计算左上角坐标
               int topX = 0;
               int topY = 0;
               if (i == 1)
                  topX = 50 + (315 + 20) * 0;
               else if (i == 2 || i % 2 != 0)// 2,3,5,7
                  topX = 50 + (315 + 20) * (i % 2 + 1);
               else if (i % 2 == 0)// 4,6,8
                  topX = 50 + (315 + 20) * 3;
               if (i == 1 || i == 2)
                  topY = 50 + 650 + 20;
               else if (i == 3 || i == 4)
                  topY = 50;
               else if (i == 5 || i == 6)
                  topY = 50 + (315 + 20) * 1;
               else if (i == 7 || i == 8)
                  topY = 50 + (315 + 20) * 2;
               // 画大图
               InputStream goodsPicture = TaoBaoHttpUtil
                     .getAsInputStream(goods.getPictUrl().replace("_.webp", ""));
               BufferedImage picImage = ImageIO.read(goodsPicture);
               picImage = zoomInImage(picImage, 315, 315);
               g2d.drawImage(picImage, topX, topY, null);
               g2d.setColor(new Color(224, 224, 224));
               // 画边框
               g2d.setStroke(new BasicStroke(1.0f));
               g2d.drawRect(topX - 1, topY - 1, 316, 316);
               // 画券
               // 画券右侧
               BufferedImage quanRight = ImageIO
                     .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_right.png"));
               quanRight = zoomInImage(quanRight, 8, 40);
               g2d.setColor(new Color(241, 66, 66));
               g2d.drawImage(quanRight, topX + 315 - quanRight.getWidth(), topY + 315 - quanRight.getHeight(),
                     null);
               // 画券的内容
               g2d.setColor(new Color(229, 0, 93));
               String quanString = " " + MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount()) + "元券 ";
               font = font.deriveFont(24.0f);
               g2d.setFont(font);
               FontMetrics fm = g2d.getFontMetrics(font);
               int textLength = fm.stringWidth(quanString);
               g2d.fillRect(topX + 315 - quanRight.getWidth() - textLength, topY + 315 - quanRight.getHeight(),
                     textLength, quanRight.getHeight());
               g2d.setColor(Color.WHITE);
               g2d.setFont(font);
               g2d.drawString(quanString, topX + 315 - quanRight.getWidth() - textLength,
                     topY + 315 + 28 - quanRight.getHeight());
               // 画券左侧
               BufferedImage quanLeft = ImageIO
                     .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_left.png"));
               quanLeft = zoomInImage(quanLeft, 8, 40);
               g2d.drawImage(quanLeft, topX + 315 - quanRight.getWidth() - textLength - quanLeft.getWidth(),
                     topY + 315 - quanRight.getHeight(), null);
            }
         }
         g2d.setColor(new Color(247, 247, 247));
         g2d.fillRect(50, 1070, 1320, 214);
         // 画二维码
         BufferedImage qrcodeImage = ImageIO.read(qrcodeStream);
         qrcodeImage = zoomInImage(qrcodeImage, 170, 170);
         g2d.drawImage(qrcodeImage, 70, 1092, null);
         // 画头像
         if (portrait != null) {
            BufferedImage portraitImg = ImageIO.read(portrait);
            portraitImg = zoomInImage(portraitImg, 40, 40);
            g2d.drawImage(portraitImg, 70 + (qrcodeImage.getWidth() - portraitImg.getWidth()) / 2,
                  1092 + (qrcodeImage.getHeight() - portraitImg.getHeight()) / 2, null);
         }
         font = font.deriveFont(50.0f);
         g2d.setFont(font);
         g2d.setColor(new Color(229, 0, 93));
         // g2d.drawString("返利券提醒您", 312, 1118 + 40);
         g2d.setColor(new Color(102, 102, 102));
         g2d.drawString("长按识别二维码领取优惠券", 312, 1118 + 77);
         g2d.dispose();
         // OutputStream out = new ByteArrayOutputStream(); new
         // FileOutputStream(new File(targetPath));
         // ImageIO.write(targetImg, "JPEG", out);
         // out.flush();
         // out.close();
         ByteArrayOutputStream aos = new ByteArrayOutputStream();
         ImageIO.write(targetImg, "JPEG", aos);
         InputStream is = new ByteArrayInputStream(aos.toByteArray());
         return is;
      } catch (Exception e) {
         try {
            LogHelper.errorDetailInfo(e);
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      }
      return null;
   }
   /**
    * 绘制大的商品动态分享图
    *
    * @param qrcodeStream
    * @param portrait
    * @param goods
    * @return
    */
   public static InputStream drawGoodsShareBigImg(InputStream qrcodeStream, InputStream portrait,
         List<TaoBaoGoodsBrief> goodsList) {
      String fontPath = "/usr/share/fonts/PingFang_Medium.ttf";
      String os = System.getProperty("os.name");
      if (os.toLowerCase().startsWith("win")) {
         fontPath = "D:/PingFang_Medium.ttf";
      }
      String fontBoldPath = "/usr/share/fonts/PingFang_Heavy_0.ttf";
      if (os.toLowerCase().startsWith("win")) {
         fontBoldPath = "D:/PingFang_Heavy_0.ttf";
      }
      final BufferedImage targetImg = new BufferedImage(1420, 1334, BufferedImage.TYPE_INT_RGB);
      HashMap<Key, Object> mapH = new HashMap<Key, Object>();
      mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
      mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
      final Graphics2D g2d = (Graphics2D) targetImg.getGraphics();
      g2d.setRenderingHints(mapH);
      g2d.setColor(Color.WHITE);
      g2d.fillRect(0, 0, 1420, 1334);
      Font font = null;
      try {
         font = Font.createFont(Font.PLAIN, new File(fontPath)).deriveFont(30.0f);
      } catch (FontFormatException e1) {
         e1.printStackTrace();
      } catch (IOException e1) {
         e1.printStackTrace();
      }
      Font boldFont = null;
      try {
         boldFont = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(50.0f);
      } catch (FontFormatException e2) {
         e2.printStackTrace();
      } catch (IOException e2) {
         e2.printStackTrace();
      }
      g2d.setFont(font);
      try {
         // g2d.setColor(new Color(153, 153, 153));
         // 画第一张
         for (int i = 0; i < goodsList.size(); i++) {
            TaoBaoGoodsBrief goods = goodsList.get(i);
            BigDecimal couplePrice = TaoBaoUtil.getAfterUseCouplePrice(goods);
            // 第一张图需要有价格信息
            if (i == 0) {
               int topX = 50;
               int topY = 50;
               // 画大图 起始点坐标为(50,50)
               InputStream goodsPicture = TaoBaoHttpUtil
                     .getAsInputStream(goods.getPictUrl().replace("_.webp", "").replace("_220x220", ""));
               BufferedImage picImage = ImageIO.read(goodsPicture);
               picImage = zoomInImage(picImage, 650, 650);
               g2d.drawImage(picImage, topX, topX, null);
               g2d.setColor(new Color(224, 224, 224));
               // 画边框
               g2d.setStroke(new BasicStroke(1.0f));
               g2d.drawRect(topX - 1, topY - 1, 651, 651);
               // 画透明背景
               g2d.setColor(new Color(255, 255, 255, 210));
               g2d.fillRect(50, 600, 650, 100);
               // 画金额
               g2d.setColor(new Color(240, 0, 102));
               boldFont = boldFont.deriveFont(22.0f);
               g2d.setFont(boldFont);
               g2d.drawString("¥", 70, 650);
               boldFont = boldFont.deriveFont(42.0f);
               g2d.setFont(boldFont);
               g2d.drawString(couplePrice + "", 90, 650);
               // 画原价
               g2d.setColor(new Color(102, 102, 102));
               font = font.deriveFont(24.0f);
               g2d.setFont(font);
               String zkPrice = new BigDecimal((couplePrice + "").replace("¥", "")).add(goods.getCouponAmount())
                     .toString();
               g2d.drawString("¥ " + zkPrice, 70, 650 + 33);
               FontMetrics fm = g2d.getFontMetrics(font);
               int textLength = fm.stringWidth(zkPrice);
               // 画删除线
               g2d.setStroke(new BasicStroke(2.0f));
               g2d.drawLine(70 + 20, 674, 90 + 10 + textLength, 674);
               String quanString = "";
               BigDecimal withNoZera = MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount());
               if (!withNoZera.toString().endsWith("0")) {
                  // 画券右侧
                  BufferedImage quanRight = ImageIO.read(
                        ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_right.png"));
                  quanRight = zoomInImage(quanRight, 12, 60);
                  g2d.setColor(new Color(241, 66, 66));
                  g2d.drawImage(quanRight, topX + 630 - quanRight.getWidth(), topY + 630 - quanRight.getHeight(),
                        null);
                  // 画券的内容
                  g2d.setColor(new Color(229, 0, 93));
                  quanString = " " + withNoZera + "元券 ";
                  font = font.deriveFont(36.0f);
                  g2d.setFont(font);
                  fm = g2d.getFontMetrics(font);
                  textLength = fm.stringWidth(quanString);
                  g2d.fillRect(topX + 630 - quanRight.getWidth() - textLength, topY + 630 - quanRight.getHeight(),
                        textLength, quanRight.getHeight());
                  g2d.setColor(Color.WHITE);
                  g2d.drawString(quanString, topX + 630 - quanRight.getWidth() - textLength,
                        topY + 630 + 42 - quanRight.getHeight());
                  // 画券左侧
                  BufferedImage quanLeft = ImageIO.read(
                        ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_left.png"));
                  quanLeft = zoomInImage(quanLeft, 12, 60);
                  g2d.drawImage(quanLeft, topX + 630 - quanRight.getWidth() - textLength - quanLeft.getWidth(),
                        topY + 630 - quanRight.getHeight(), null);
               }
            } else {
               // 计算左上角坐标
               int topX = 0;
               int topY = 0;
               if (i == 1)
                  topX = 50 + (315 + 20) * 0;
               else if (i == 2 || i % 2 != 0)// 2,3,5,7
                  topX = 50 + (315 + 20) * (i % 2 + 1);
               else if (i % 2 == 0)// 4,6,8
                  topX = 50 + (315 + 20) * 3;
               if (i == 1 || i == 2)
                  topY = 50 + 650 + 20;
               else if (i == 3 || i == 4)
                  topY = 50;
               else if (i == 5 || i == 6)
                  topY = 50 + (315 + 20) * 1;
               else if (i == 7 || i == 8)
                  topY = 50 + (315 + 20) * 2;
               // 画大图
               InputStream goodsPicture = TaoBaoHttpUtil
                     .getAsInputStream(goods.getPictUrl().replace("_.webp", ""));
               BufferedImage picImage = ImageIO.read(goodsPicture);
               picImage = zoomInImage(picImage, 315, 315);
               g2d.drawImage(picImage, topX, topY, null);
               g2d.setColor(new Color(224, 224, 224));
               // 画边框
               g2d.setStroke(new BasicStroke(1.0f));
               g2d.drawRect(topX - 1, topY - 1, 316, 316);
               // 画券
               String quanString = "";
               BigDecimal withNoZera = MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount());
               if (!withNoZera.toString().endsWith("0")) {
                  // 画券右侧
                  BufferedImage quanRight = ImageIO.read(
                        ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_right.png"));
                  quanRight = zoomInImage(quanRight, 8, 40);
                  g2d.setColor(new Color(241, 66, 66));
                  g2d.drawImage(quanRight, topX + 315 - quanRight.getWidth(), topY + 315 - quanRight.getHeight(),
                        null);
                  // 画券的内容
                  g2d.setColor(new Color(229, 0, 93));
                  quanString = " " + withNoZera + "元券 ";
                  font = font.deriveFont(24.0f);
                  g2d.setFont(font);
                  FontMetrics fm = g2d.getFontMetrics(font);
                  int textLength = fm.stringWidth(quanString);
                  g2d.fillRect(topX + 315 - quanRight.getWidth() - textLength, topY + 315 - quanRight.getHeight(),
                        textLength, quanRight.getHeight());
                  g2d.setColor(Color.WHITE);
                  g2d.setFont(font);
                  g2d.drawString(quanString, topX + 315 - quanRight.getWidth() - textLength,
                        topY + 315 + 28 - quanRight.getHeight());
                  // 画券左侧
                  BufferedImage quanLeft = ImageIO.read(
                        ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_left.png"));
                  quanLeft = zoomInImage(quanLeft, 8, 40);
                  g2d.drawImage(quanLeft, topX + 315 - quanRight.getWidth() - textLength - quanLeft.getWidth(),
                        topY + 315 - quanRight.getHeight(), null);
               }
            }
         }
         g2d.setColor(new Color(247, 247, 247));
         g2d.fillRect(50, 1070, 1320, 214);
         // 画二维码
         BufferedImage qrcodeImage = ImageIO.read(qrcodeStream);
         qrcodeImage = zoomInImage(qrcodeImage, 170, 170);
         g2d.drawImage(qrcodeImage, 70, 1092, null);
         // 画头像
         if (portrait != null) {
            BufferedImage portraitImg = ImageIO.read(portrait);
            // 放缩大小
            portraitImg = zoomInImage(portraitImg, 40, 40);
            // 圆角
            portraitImg = roundImage(portraitImg, 10);
            g2d.drawImage(portraitImg, 70 + (qrcodeImage.getWidth() - portraitImg.getWidth()) / 2,
                  1092 + (qrcodeImage.getHeight() - portraitImg.getHeight()) / 2, null);
         }
         font = font.deriveFont(50.0f);
         g2d.setFont(font);
         g2d.setColor(new Color(229, 0, 93));
         // g2d.drawString("返利券提醒您", 312, 1118 + 40);
         g2d.setColor(new Color(102, 102, 102));
         g2d.drawString("长按识别二维码免费领券", 312, 1150);
         g2d.setColor(new Color(102, 102, 102));
         g2d.drawString("共", 1000, 1150);
         g2d.setColor(new Color(229, 0, 93));
         g2d.drawString(goodsList.size() + "", 1055, 1150);
         g2d.setColor(new Color(102, 102, 102));
         g2d.drawString("个商品", 1090, 1150);
         // 提示语
         BufferedImage tips = ImageIO
               .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/share/tips1.png"));
         tips = zoomInImage(tips, 850, 65);
         g2d.drawImage(tips, 312, 1190, null);
         g2d.dispose();
         ByteArrayOutputStream aos = new ByteArrayOutputStream();
         ImageIO.write(targetImg, "JPEG", aos);
         InputStream is = new ByteArrayInputStream(aos.toByteArray());
         return is;
      } catch (Exception e) {
         try {
            LogHelper.errorDetailInfo(e);
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      }
      return null;
   }
   // 画商品分享图
   public static InputStream drawGoodsShareImgHCJ(InputStream qrcodeStream, InputStream portrait,
         TaoBaoGoodsBrief goods) throws Exception {
      String fontPath = "/usr/share/fonts/PingFang_Medium.ttf";
      String os = System.getProperty("os.name");
      if (os.toLowerCase().startsWith("win")) {
         fontPath = "D:/PingFang_Medium.ttf";
      }
      String fontBoldPath = "/usr/share/fonts/PingFang_Heavy_0.ttf";
      if (os.toLowerCase().startsWith("win")) {
         fontBoldPath = "D:/PingFang_Heavy_0.ttf";
      }
      Font font = null;
      Font boldFont = null;
      font = Font.createFont(Font.PLAIN, new File(fontPath)).deriveFont(28.0f);
      boldFont = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(28.0f);
      final BufferedImage targetImg = new BufferedImage(720, 1280, BufferedImage.TYPE_INT_RGB);
      HashMap<Key, Object> mapH = new HashMap<Key, Object>();
      mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
      mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
      final Graphics2D g2d = (Graphics2D) targetImg.getGraphics();
      g2d.setRenderingHints(mapH);
      g2d.setColor(Color.WHITE);
      g2d.fillRect(0, 0, 720, 1280);
      g2d.setFont(font.deriveFont(28.0f));
      // 画广告语
      InputStream adTitle = ImageUtil.class.getClassLoader().getResourceAsStream("image/hcj_share_title_icon.png");
      if (adTitle != null) {
         BufferedImage adTitleImage = ImageIO.read(adTitle);
         g2d.drawImage(adTitleImage, 192, 101, null);
      }
      // 画商品主图
      InputStream goodsPicture = TaoBaoHttpUtil.getAsInputStream(goods.getPictUrl().replace("https://", "http://"));
      BufferedImage picImage = ImageIO.read(goodsPicture);
      picImage = zoomInImage(picImage, 620, 620);
      g2d.drawImage(picImage, 50, 207, null);
      // 画价格
      BigDecimal money = TaoBaoUtil.getAfterUseCouplePrice(goods);
      money = MoneyBigDecimalUtil.getWithNoZera(money);
      g2d.setColor(new Color(240, 66, 66));
      g2d.setFont(boldFont.deriveFont(30.0f));
      g2d.drawString("¥", 62, 900);
      g2d.setFont(boldFont.deriveFont(56.0f));
      g2d.drawString(money.toString(), 90, 900);
      g2d.setFont(font.deriveFont(56.0f));
      g2d.setColor(new Color(153, 153, 153));
      if (!StringUtil.isNullOrEmpty(goods.getCouponInfo())) {
         // 画天猫价或者淘宝价
         String zkPriceName = "";
         if (goods.getUserType() == 0)
            zkPriceName = "淘宝价  ¥ " + MoneyBigDecimalUtil.getWithNoZera(goods.getZkPrice());
         else
            zkPriceName = "天猫价  ¥ " + MoneyBigDecimalUtil.getWithNoZera(goods.getZkPrice());
         font = font.deriveFont(30.0f);
         g2d.setFont(font);
         g2d.drawString(zkPriceName, 56, 955);
         // 画券右侧
         BufferedImage quanRight = ImageIO
               .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/hcj_quan_right.png"));
         g2d.setColor(new Color(241, 66, 66));
         g2d.drawImage(quanRight, 670 - quanRight.getWidth(), 867, null);
         // 画券的内容
         g2d.setColor(new Color(241, 66, 66));
         String quanString = " ¥ " + MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount()) + " 券 ";
         font = font.deriveFont(44.0f);
         g2d.setFont(font);
         FontMetrics fm = g2d.getFontMetrics(font);
         int textLength = fm.stringWidth(quanString);
         g2d.fillRect(670 - quanRight.getWidth() - textLength, 872, textLength, 80);
         g2d.setColor(Color.WHITE);
         g2d.setFont(font);
         g2d.drawString(quanString, 670 - quanRight.getWidth() - textLength, 927);
         // 画券左侧
         BufferedImage quanLeft = ImageIO
               .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/hcj_quan_left.png"));
         g2d.drawImage(quanLeft, 670 - quanRight.getWidth() - textLength - quanLeft.getWidth(), 867, null);
      }
      InputStream userTypeIcon;
      if (goods.getUserType() == 0)// 淘宝
      {
         userTypeIcon = ImageUtil.class.getClassLoader().getResourceAsStream("image/hcj_icon_tb.png");
      } else {
         userTypeIcon = ImageUtil.class.getClassLoader().getResourceAsStream("image/hcj_icon_tm.png");
      }
      g2d.drawImage(ImageIO.read(userTypeIcon), 63, 1022, null);
      String title = goods.getTitle();
      // 商品标题
      font = font.deriveFont(30.0f);
      g2d.setFont(font);
      int length = getTextLengthByWidth(g2d, font, title, 290, 8);
      g2d.setColor(new Color(153, 153, 153));
      int row = 0;
      // 画第一排
      g2d.drawString(title.substring(0, length), 20 + 50 + 46, 1044 + row * 40);
      if (length < title.length())
         title = title.substring(length);
      else
         title = "";
      // 判断是否画完
      row++;
      while (title.length() > 0) {
         length = getTextLengthByWidth(g2d, font, title, 330, 10);
         g2d.drawString(title.substring(0, length), 63, 1044 + row * 40);
         title = title.substring(length);
         row++;
      }
      // 画边框
      InputStream erCodeSide = ImageUtil.class.getClassLoader().getResourceAsStream("image/hcj_ercode_side.png");
      BufferedImage erCodeSideImage = ImageIO.read(erCodeSide);
      erCodeSideImage = zoomInImage(erCodeSideImage, 200, 200);
      g2d.drawImage(erCodeSideImage, 466, 986, null);
      // 画二维码
      BufferedImage qrcodeImage = ImageIO.read(qrcodeStream);
      qrcodeImage = zoomInImage(qrcodeImage, 170, 170);
      g2d.drawImage(qrcodeImage, 481, 1000, null);
      // 画头像
      if (portrait != null) {
         BufferedImage portraitImg = ImageIO.read(portrait);
         portraitImg = zoomInImage(portraitImg, 30, 30);
         g2d.drawImage(portraitImg, 481 + (qrcodeImage.getWidth() - portraitImg.getWidth()) / 2,
               1000 + (qrcodeImage.getHeight() - portraitImg.getHeight()) / 2, null);
      }
      font = font.deriveFont(22.0f);
      g2d.setFont(font);
      g2d.setColor(new Color(241, 66, 66));
      FontMetrics fm = g2d.getFontMetrics(font);
      int textLength = fm.stringWidth("海草街提醒您");
      g2d.drawString("海草街提醒您", 481 + (qrcodeImage.getWidth() - textLength) / 2, 1220);
      g2d.setColor(new Color(102, 102, 102));
      fm = g2d.getFontMetrics(font);
      textLength = fm.stringWidth("长按识别二维码");
      g2d.drawString("长按识别二维码", 481 + (qrcodeImage.getWidth() - textLength) / 2, 1255);
      g2d.dispose();
      ByteArrayOutputStream aos = new ByteArrayOutputStream();
      ImageIO.write(targetImg, "JPEG", aos);
      InputStream is = new ByteArrayInputStream(aos.toByteArray());
      return is;
   }
   private static int[] computeCropPosition(BufferedImage source, int width, int height) {
      int[] cropParams = new int[4];
      int owidth = source.getWidth();
      int oheight = source.getHeight();
      if (oheight * width - owidth * height > 0) {
         cropParams[0] = 0;
         cropParams[1] = (oheight - height) / 2;
         cropParams[2] = owidth;
         cropParams[3] = cropParams[2] * height / width;
      } else {
         cropParams[0] = (owidth - width) / 2;
         cropParams[1] = 0;
         cropParams[3] = oheight;
         cropParams[2] = cropParams[3] * width / height;
      }
      return cropParams;
   }
   public static BufferedImage crop(BufferedImage source, int startX, int startY, int w, int h) {
      int width = source.getWidth();
      int height = source.getHeight();
      if (startX <= -1) {
         startX = 0;
      }
      if (startY <= -1) {
         startY = 0;
      }
      if (w <= -1) {
         w = width - 1;
      }
      if (h <= -1) {
         h = height - 1;
      }
      BufferedImage result = new BufferedImage(w, h, source.getType());
      for (int y = startY; y < h + startY; y++) {
         for (int x = startX; x < w + startX; x++) {
            int rgb = source.getRGB(x, y);
            result.setRGB(x - startX, y - startY, rgb);
         }
      }
      return result;
   }
   public static BufferedImage zoomInImage(BufferedImage originalImage, int width, int height) {
      int type = originalImage.getType();
      if (type == 0)
         type = 5;
      BufferedImage newImage = new BufferedImage(width, height, type);
      Graphics g = newImage.getGraphics();
      g.drawImage(originalImage, 0, 0, width, height, null);
      g.dispose();
      return newImage;
   }
   // 邀请好友图片
   public static void inviteFriendImg(InputStream urlInputStream, InputStream portraitInputStream,
         InputStream erCodeInputStream, String targetPath,String inviteCode) throws IOException {
      inviteFriendImg(urlInputStream, portraitInputStream, erCodeInputStream, targetPath, 260, 908, 230, inviteCode);
   }
   /**
    *
    * @param urlInputStream
    * @param portraitInputStream
    * @param erCodeInputStream
    * @param targetPath
    * @param pX
    *            -二维码的横坐标
    * @param pY
    *            -二维码的纵坐标
    * @param size
    *            -二维码的尺寸
    * @param inviteCode
    *            -邀请码
    * @throws IOException
    */
   // 邀请好友图片
   public static void inviteFriendImg(InputStream urlInputStream, InputStream portraitInputStream,
         InputStream erCodeInputStream, String targetPath, int pX, int pY, int size, String inviteCode)
         throws IOException {
      BufferedImage bgImage = ImageIO.read(urlInputStream);
      final BufferedImage targetImg = new BufferedImage(bgImage.getWidth(), bgImage.getHeight(),
            BufferedImage.TYPE_INT_RGB);
      HashMap<Key, Object> mapH = new HashMap<Key, Object>();
      mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
      mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
      // 画 背景图片
      final Graphics2D g2d = targetImg.createGraphics();
      g2d.drawImage(bgImage, 0, 0, bgImage.getWidth(), bgImage.getHeight(), null);
      // 画 二维码
      BufferedImage qrCodeImage = ImageIO.read(erCodeInputStream);
      qrCodeImage = ImageUtil.qrCodeImage(g2d, qrCodeImage, pX, pY, size, size); // 二维码长宽
      // 230*230
      // 画 头像
      BufferedImage portraitImg = ImageIO.read(portraitInputStream);
      int portraitSize = size * 5 / 23;
      int pPX = pX + size / 2 - portraitSize / 2;
      int pPY = pY + size / 2 - portraitSize / 2;
      portraitImg = ImageUtil.portraitImg(g2d, portraitImg, pPX, pPY, portraitSize, portraitSize);// 头像长宽
      // 画邀请码(邀请码的大小与字体固定)
      if (!StringUtil.isNullOrEmpty(inviteCode)) {
         String st = "邀请码:" + inviteCode;
         int width = bgImage.getWidth();
         String os = System.getProperty("os.name");
         String fontBoldPath = "/usr/share/fonts/PingFang_Medium.ttf";
         if (os.toLowerCase().startsWith("win")) {
            fontBoldPath = "D:/PingFang_Medium.ttf";
         }
         Font boldFont = null;
         try {
            boldFont = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(36.0f);
         } catch (FontFormatException e) {
            e.printStackTrace();
         }
         g2d.setFont(boldFont);
         g2d.setColor(new Color(0, 0, 0));
         FontMetrics fm = g2d.getFontMetrics(boldFont);
         int textLength = fm.stringWidth(st);
         int ax = (width - textLength) / 2;
         int ay = bgImage.getHeight() - 92 + boldFont.getSize() / 2 - 5;
         g2d.setColor(new Color(0, 0, 0));
         g2d.drawString(st, ax, ay);
      }
      OutputStream out = new FileOutputStream(new File(targetPath));
      ImageIO.write(targetImg, "JPEG", out);
      out.flush();
      out.close();
   }
   // 二维码
   public static BufferedImage qrCodeImage(Graphics2D g2d, BufferedImage originalImage, int pX, int pY, int width,
         int height) {
      g2d.drawImage(originalImage, pX, pY, width, height, null);
      return originalImage;
   }
   // 头像
   public static BufferedImage portraitImg(Graphics2D g2d, BufferedImage originalImage, int pX, int pY, int width,
         int height) {
      g2d.drawImage(originalImage, pX, pY, width, height, null);
      return originalImage;
   }
   static BufferedImage roundImage(BufferedImage srcImage, int cornerRadius) { // 半径
      int width = srcImage.getWidth();
      int height = srcImage.getHeight();
      BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
      Graphics2D gs = image.createGraphics();
      HashMap<Key, Object> mapH = new HashMap<Key, Object>();
      mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
      mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
      gs.setRenderingHints(mapH);
      gs.setClip(new RoundRectangle2D.Double(0, 0, width, height, cornerRadius, cornerRadius));
      gs.drawImage(srcImage, 0, 0, null);
      gs.dispose();
      return image;
   }
   public static int saveToImgByInputStream(InputStream inputStream, String imgPath, String imgName) {
      int stateInt = 1;
      try {
         File file = new File(imgPath, imgName);// 可以是任何图片格式.jpg,.png等
         FileOutputStream fos = new FileOutputStream(file);
         FileInputStream fis = (FileInputStream) inputStream;
         byte[] b = new byte[1024];
         int nRead = 0;
         while ((nRead = fis.read(b)) != -1) {
            fos.write(b, 0, nRead);
         }
         fos.flush();
         fos.close();
         fis.close();
      } catch (Exception e) {
         stateInt = 0;
         e.printStackTrace();
      } finally {
      }
      return stateInt;
   }
   static int getTextLengthByWidth(Graphics2D g2d, Font font, String content, int maxWidth, int startPos) {
      FontMetrics fm = g2d.getFontMetrics(font);
      for (int i = startPos; i < content.length(); i++) {
         if (fm.stringWidth(content.substring(0, i)) >= maxWidth)
            return i + 1;
      }
      return content.length();
   }
   public static int[] getImgWidthAndHeight(String imgUrl) throws MalformedURLException, IOException {
      if (StringUtil.isNullOrEmpty(imgUrl))
         return new int[] { 0, 0 };
      if (imgUrl.toLowerCase().endsWith("webp"))
         return getImgWidthAndHeightWithWebp(imgUrl);
      else
         return getImgWidthAndHeightWithPngAndJpg(imgUrl);
   }
   public static int[] getImgWidthAndHeightWithPngAndJpg(String imgUrl) throws MalformedURLException, IOException {
      InputStream murl = new URL(imgUrl).openStream();
      BufferedImage sourceImg = ImageIO.read(murl);
      int width = sourceImg.getWidth();
      int height = sourceImg.getHeight();
      return new int[] { width, height };
   }
   public static int[] getImgWidthAndHeightWithWebp(String imgUrl) throws MalformedURLException, IOException {
      String cacheFile = FileUtil.getCacheDir();
      String targetPath = cacheFile + "/CACHE_DOWNLOAD_IMG_" + System.currentTimeMillis() + "_"
            + (long) (Math.random() * 1000000000L);
      HttpUtil.downloadFile(imgUrl, targetPath);
      FileInputStream file = new FileInputStream(targetPath);
      byte[] bytes = new byte[30];
      file.read(bytes, 0, bytes.length);
      int width = ((int) bytes[27] & 0xff) << 8 | ((int) bytes[26] & 0xff);
      int height = ((int) bytes[29] & 0xff) << 8 | ((int) bytes[28] & 0xff);
      file.close();
      return new int[] { width, height };
   }
   /**
    * 绘制邀请问候图
    * @param bgPigInStream  背景图
    * @param portraitInStream  用户头像
    * @param erCodeInStream    二维码
    * @param targetPath    路径
    * @param inviteCode    邀请码
    * @param content       文字内容
    * @param date         显示日历
    * @throws IOException
    */
   public static void drawInviteToGreet(InputStream bgPigInStream, InputStream portraitInStream,
         InputStream erCodeInStream, String targetPath, String inviteCode, String content, Date date)
         throws IOException {
      // 背景图片
      BufferedImage bgImage = ImageIO.read(bgPigInStream);
      final BufferedImage targetImg = new BufferedImage(bgImage.getWidth(), bgImage.getHeight(),
            BufferedImage.TYPE_INT_RGB);
      HashMap<Key, Object> mapH = new HashMap<Key, Object>();
      mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
      mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
      // 画 背景图片
      final Graphics2D g2d = targetImg.createGraphics();
      g2d.drawImage(bgImage, 0, 0, bgImage.getWidth(), bgImage.getHeight(), null);
      g2d.setRenderingHints(mapH);
      // 画 蒙层
      BufferedImage mengCeng = ImageIO
            .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/invite/mc.png"));
      g2d.drawImage(mengCeng, 0, bgImage.getHeight() / 2, bgImage.getWidth(), bgImage.getHeight() / 2, null);
      int width = bgImage.getWidth();
      int height = bgImage.getHeight();
      int pX = width - 250;
      int pY = height - 290; // 320
      int size = 210; // 230
      // 画 二维码
      BufferedImage qrCodeImage = ImageIO.read(erCodeInStream);
      qrCodeImage = ImageUtil.qrCodeImage(g2d, qrCodeImage, pX, pY, size, size); // 二维码长宽
      // 230*230
      // 画 头像
      int portraitSize = size * 5 / 23;
      int pPX = pX + size / 2 - portraitSize / 2;
      int pPY = pY + size / 2 - portraitSize / 2;
      BufferedImage portraitImg = ImageIO.read(portraitInStream);
      portraitImg = ImageUtil.portraitImg(g2d, portraitImg, pPX, pPY, portraitSize, portraitSize);// 头像长宽
      // 文字白色
      Color color = new Color(255, 255, 255);
      String os = System.getProperty("os.name");
      String fontBoldPath = "/usr/share/fonts/yahei.ttf";
      if (os.toLowerCase().startsWith("win")) {
         fontBoldPath = "D:/yahei.ttf";
      }
      Font boldFont = null;
      // 画邀请码(邀请码的大小与字体固定)
      if (!StringUtil.isNullOrEmpty(inviteCode)) {
         String st = "邀请码:" + inviteCode;
         try {
            boldFont = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(32.0f);
         } catch (FontFormatException e) {
            e.printStackTrace();
         }
         g2d.setFont(boldFont);
         g2d.setColor(new Color(255, 255, 255));
         FontMetrics fm = g2d.getFontMetrics(boldFont);
         int textLength = fm.stringWidth(st);
         int ax = (width - textLength) - 30;
         int ay = bgImage.getHeight() - 50 + boldFont.getSize() / 2 - 5;
         g2d.setColor(new Color(255, 255, 255));
         g2d.drawString(st, ax, ay);
      }
      // 左边距
      int padding_left = 30;
      // 日历
      try {
         if (date == null) {
            date = new Date();
         }
         boldFont = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(36.0f);
         g2d.setFont(boldFont);
         g2d.setColor(color);
         g2d.setRenderingHints(mapH);
         DateInfo dateInfo = DateLunarUtil.getDateInfo(date);
         // 农历
         g2d.drawString(dateInfo.getLunar_month() + dateInfo.getLunar_day(), padding_left, height - 80);
         // 天干地支
         g2d.drawString(dateInfo.getAgenary_month() + " " + dateInfo.getAgenary_day(), padding_left, height - 140);
         // 当前日期
         Font boldFontMax = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(100.0f);
         g2d.setFont(boldFontMax);
         if (dateInfo.getDay() < 10) {
            g2d.drawString("0" + dateInfo.getDay().toString(), padding_left, height - 200);
         } else {
            g2d.drawString(dateInfo.getDay().toString(), padding_left, height - 200);
         }
         String theDate = "";
         if (dateInfo.getMonth() < 10) {
            theDate = "/0";
         } else {
            theDate = "/";
         }
         theDate += dateInfo.getMonth() + "/" + dateInfo.getYear() + " " + dateInfo.getWeekDay();
         g2d.setFont(boldFont);
         g2d.drawString(theDate, padding_left + boldFontMax.getSize() + 15, height - 200);
      } catch (Exception e) {
         e.printStackTrace();
      }
      if (!StringUtil.isNullOrEmpty(content)) {
         // 文字内容
         try {
            boldFont = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(36.0f);
            g2d.setFont(boldFont);
            g2d.setColor(color);
            g2d.setRenderingHints(mapH);
            int lineHeight = 70;
            int lineTextLength = 19;
            if (content.length() <= lineTextLength) {
               g2d.drawString(content, padding_left, height - 350);
            } else {
               String text = "";
               int mod = content.length() % lineTextLength;
               if (mod == 0) {
                  text = content.substring(content.length() - lineTextLength, content.length());
                  content = content.substring(0, content.length() - lineTextLength);
               } else {
                  text = content.substring(content.length() - mod, content.length());
                  content = content.substring(0, content.length() - mod);
               }
               g2d.drawString(text, padding_left, height - 350);
               int i = 1;
               while (true) {
                  if (content.length() <= 17) {
                     g2d.drawString(content, padding_left, height - 350 - lineHeight * i);
                     break;
                  } else {
                     text = content.substring(content.length() - lineTextLength, content.length());
                     content = content.substring(0, content.length() - lineTextLength);
                     g2d.drawString(text, padding_left, height - 350 - lineHeight * i);
                     i++;
                  }
               }
            }
         } catch (Exception e) {
            e.printStackTrace();
         }
      }
      OutputStream out = new FileOutputStream(new File(targetPath));
      ImageIO.write(targetImg, "JPEG", out);
      out.flush();
      out.close();
   }
}
package com.yeshi.fanli.util;
import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.RenderingHints.Key;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.imageio.ImageIO;
import org.yeshi.utils.DateLunarUtil;
import org.yeshi.utils.HttpUtil;
import org.yeshi.utils.entity.DateInfo;
import com.yeshi.fanli.entity.bus.activity.RecommendActivityTaoBaoGoods;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.goods.CommonGoods;
import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.util.taobao.TaoBaoUtil;
import com.yeshi.fanli.vo.goods.GoodsDetailVO;
public class ImageUtil {
   // 画商品分享图
   public static InputStream drawGoodsShareXCX(InputStream qrcode, UserInfo user, GoodsDetailVO goods) {
      try {
         String fontPath = "/usr/share/fonts/PingFang_Medium.ttf";
         String os = System.getProperty("os.name");
         if (os.toLowerCase().startsWith("win")) {
            fontPath = "D:/PingFang_Medium.ttf";
         }
         String fontBoldPath = "/usr/share/fonts/PingFang_Heavy_0.ttf";
         if (os.toLowerCase().startsWith("win")) {
            fontBoldPath = "D:/PingFang_Heavy_0.ttf";
         }
         Font font24 = Font.createFont(Font.PLAIN, new File(fontPath)).deriveFont(24.0f);
         Font font26 = Font.createFont(Font.PLAIN, new File(fontPath)).deriveFont(26.0f);
         Font boldFont36 = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(36.0f);
         int px = 640; // 图片宽度
         int py = 1061; // 图片高度
         final BufferedImage targetImg = new BufferedImage(px, py, BufferedImage.TYPE_INT_RGB);
         HashMap<Key, Object> mapH = new HashMap<Key, Object>();
         mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
         mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
         final Graphics2D g2d = (Graphics2D) targetImg.getGraphics();
         g2d.setRenderingHints(mapH);
         g2d.setColor(Color.WHITE);
         g2d.fillRect(0, 0, px, py);
         int x = 640;
         int y = 640;
         int spacing = 20; // 右边距
         // 1、画商品主图
         InputStream picStream = HttpUtil.getAsInputStream(goods.getPicUrl().replace("https://", "http://"));
         g2d.drawImage(ImageIO.read(picStream), 0, 0, x, y, null);
         // 2、画来源图标
         int length = 10;
         int row1 = 260;
         int iconWidth = 72;
         String source = "";
         InputStream icon = null;
         int goodsType = goods.getGoodsType();
         if (goodsType == Constant.SOURCE_TYPE_TAOBAO) {
            source = "淘宝";
            if (goods.getShopType() == 10) {
               icon = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_tb.png");
            } else {
               icon = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_tm.png");
            }
         } else if (goodsType == Constant.SOURCE_TYPE_JD) {
            source = "京东";
            icon = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_jd.png");
         } else if (goodsType == Constant.SOURCE_TYPE_PDD) {
            source = "拼多多";
            length = 9;
            row1 = row1 - 26;
            iconWidth = iconWidth + 28;
            icon = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_pdd.png");
         } else {
            return null;
         }
         g2d.drawImage(ImageIO.read(icon), spacing, y + 20, iconWidth, 34, null);
         // 3、商品标题内容
         int row = 0;
         String title = goods.getTitle();
         length = ImageUtil.getTextLengthByWidth(g2d, font26, title, row1, length);
         g2d.setFont(font26);
         g2d.setColor(new Color(0, 0, 0));
         g2d.drawString(title.substring(0, length), spacing + iconWidth + 5, y + 45 + row * 36);
         title = title.substring(length);
         row++;
         // 判断标题内容是否画完,最多可画三行
         while (title.length() > 0 && row < 3) {
            length = ImageUtil.getTextLengthByWidth(g2d, font26, title, 320, 11);
            g2d.drawString(title.substring(0, length), spacing, y + 45 + row * 36);
            title = title.substring(length);
            row++;
         }
         if (!goods.isHasCoupon()) {
            // 无券
            g2d.setColor(new Color(229, 0, 92));
            g2d.drawString("¥ ", spacing, y + 175);
            g2d.setFont(boldFont36);
            g2d.drawString(MoneyBigDecimalUtil.getWithNoZera(goods.getZkPrice()).toString(), spacing + 21, y + 175);
         } else {
            // 券后价
            g2d.setFont(font26);
            g2d.setColor(new Color(229, 0, 92));
            g2d.drawString("券后价  ¥ ", spacing, y + 175);
            g2d.setFont(boldFont36);
            g2d.drawString(MoneyBigDecimalUtil.getWithNoZera(goods.getCouponPrice()).toString(), spacing + 116,
                  y + 175);
            // 渠道原价
            g2d.setColor(new Color(153, 153, 153));
            g2d.setFont(font24);
            g2d.drawString(goods.getPriceName() + " ¥ " + MoneyBigDecimalUtil.getWithNoZera(goods.getZkPrice()),
                  spacing, y + 210);
            // 券字
            InputStream quan = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_quan.png");
            g2d.drawImage(ImageIO.read(quan), spacing, y + 240, 47, 40, null);
            // 券面额
            String quanAmount = "¥ " + goods.getCouponInfo().getAmount();
            FontMetrics fm = g2d.getFontMetrics(font26);
            int textLength = fm.stringWidth(quanAmount);
            g2d.setFont(font26);
            g2d.setColor(new Color(229, 0, 92));
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.drawRoundRect(spacing + 42, y + 240, textLength + 20, 39, 10, 10);
            g2d.drawString(quanAmount, spacing + 55, y + 270);
         }
         // 自营 、包邮
         if (goods.getShopType() == 21) {
            InputStream ziying = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_ziying.png");
            g2d.drawImage(ImageIO.read(ziying), spacing + 300, y + 150, 60, 30, null);
         } else if (goods.isBaoyou()) {
            InputStream ziying = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_baoyou.png");
            g2d.drawImage(ImageIO.read(ziying), spacing + 300, y + 150, 60, 30, null);
         }
         // 销量
         String sale = null;
         int salesType = goods.getSalesType();
         if (salesType == 1) {
            sale = "月销";
         } else if (salesType == 2) {
            sale = "2小时销量";
         } else if (salesType == 3) {
            sale = "今日销量";
         } else if (salesType == 4) {
            sale = "总销量";
         } else {
            sale = "月销";
         }
         sale = sale + " " + goods.getSalesCount();
         FontMetrics fm = g2d.getFontMetrics(font24);
         int textLength = fm.stringWidth(sale);
         g2d.setFont(font24);
         g2d.setColor(new Color(153, 153, 153));
         g2d.drawString(sale, spacing + 360 - textLength, y + 210);
         // 二维码图框
         g2d.setColor(Color.WHITE);
         InputStream codeFrame = ImageUtil.class.getClassLoader()
               .getResourceAsStream("image/share/qr_code_frame_xcx.png");
         g2d.drawImage(ImageIO.read(codeFrame), spacing + 405, y + 20, 200, 220, null);
         // 画二维码
         int codeSize = 170;
         g2d.drawImage(ImageIO.read(qrcode), spacing + 420, y + 38, codeSize, codeSize, null);
         // 头像
         InputStream portraitStream = null;
         try {
            portraitStream = HttpUtil.getAsInputStream(user.getPortrait());
         } catch (Exception e) {
            e.printStackTrace();
         }
         if (portraitStream == null) {
            portraitStream = ImageUtil.class.getClassLoader()
                  .getResourceAsStream("image/official_default_head.jpg");
         }
         BufferedImage portraitImg = ImageIO.read(portraitStream);
         BufferedImage zoomInImage = ImageUtil.zoomInImage(portraitImg, 84, 84);
         BufferedImage roundImage = ImageUtil.roundImage(zoomInImage, 84);
         g2d.drawImage(roundImage, spacing, y + 310, 84, 84, null);
         g2d.setFont(font24);
         g2d.setColor(new Color(0, 0, 0));
         g2d.drawString(user.getNickName(), spacing + 84 + 17, y + 335);
         g2d.setFont(font24);
         g2d.setColor(new Color(153, 153, 153));
         g2d.drawString(source + "商品99%都有优惠或返利", spacing + 84 + 17, y + 385);
         g2d.dispose();
         ByteArrayOutputStream aos = new ByteArrayOutputStream();
         ImageIO.write(targetImg, "JPEG", aos);
         return new ByteArrayInputStream(aos.toByteArray());
      } catch (Exception e) {
         e.printStackTrace();
         try {
            LogHelper.errorDetailInfo(e);
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      }
      return null;
   }
   /**
    * 分析海报图
    * @param qrcode
    * @param portraitStream
    * @param goods
    * @return
    */
   public static InputStream drawGoodsPoster(InputStream qrcode, InputStream portraitStream, String inviteCode,
         String mainPic, GoodsDetailVO goods) {
      try {
         String fontPath = "/usr/share/fonts/PingFang_Medium.ttf";
         String os = System.getProperty("os.name");
         if (os.toLowerCase().startsWith("win")) {
            fontPath = "D:/PingFang_Medium.ttf";
         }
         String fontBoldPath = "/usr/share/fonts/PingFang_Heavy_0.ttf";
         if (os.toLowerCase().startsWith("win")) {
            fontBoldPath = "D:/PingFang_Heavy_0.ttf";
         }
         Font font24 = Font.createFont(Font.PLAIN, new File(fontPath)).deriveFont(24.0f);
         Font font26 = Font.createFont(Font.PLAIN, new File(fontPath)).deriveFont(26.0f);
         Font boldFont36 = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(36.0f);
         int px = 640; // 图片宽度
         // int py = 1154; // 图片高度 显示邀请码
         int py = 1060; // 图片高度
         final BufferedImage targetImg = new BufferedImage(px, py, BufferedImage.TYPE_INT_RGB);
         HashMap<Key, Object> mapH = new HashMap<Key, Object>();
         mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
         mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
         final Graphics2D g2d = (Graphics2D) targetImg.getGraphics();
         g2d.setRenderingHints(mapH);
         g2d.setColor(Color.WHITE);
         g2d.fillRect(0, 0, px, py);
         int x = 640;
         int y = 640;
         int spacing = 20; // 右边距
         // 1、画商品主图
         InputStream picStream = HttpUtil.getAsInputStream(mainPic);
         // InputStream picStream =
         // ImageUtil.class.getClassLoader().getResourceAsStream("image/share/test_pic1.jpg");
         g2d.drawImage(ImageIO.read(picStream), 0, 0, x, y, null);
         // 2、画来源图标
         int length = 10;
         int row1 = 450;
         int iconWidth = 72;
         String source = "";
         InputStream icon = null;
         int goodsType = goods.getGoodsType();
         if (goodsType == Constant.SOURCE_TYPE_TAOBAO) {
            source = "淘宝";
            if (goods.getShopType() == 10) {
               icon = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_tb.png");
            } else {
               icon = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_tm.png");
            }
         } else if (goodsType == Constant.SOURCE_TYPE_JD) {
            source = "京东";
            icon = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_jd.png");
         } else if (goodsType == Constant.SOURCE_TYPE_PDD) {
            source = "拼多多";
            length = 9;
            row1 = row1 - 26;
            iconWidth = iconWidth + 28;
            icon = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_pdd.png");
         } else {
            return null;
         }
         g2d.drawImage(ImageIO.read(icon), spacing, y + 20, iconWidth, 34, null);
         // 3、商品标题内容
         int row = 0;
         String title = goods.getTitle();
         length = ImageUtil.getTextLengthByWidth(g2d, font26, title, row1, length);
         g2d.setFont(font26);
         g2d.setColor(new Color(0, 0, 0));
         g2d.drawString(title.substring(0, length), spacing + iconWidth + 5, y + 45 + row * 36);
         row++;
         title = title.substring(length);
         int length2 = ImageUtil.getTextLengthByWidth(g2d, font26, title, 600, 11);
         if (length2 > 24) {
            g2d.drawString(title.substring(0, 21) + "...", spacing, y + 45 + row * 36);
         } else {
            g2d.drawString(title.substring(0, length2), spacing, y + 45 + row * 36);
         }
         int baoYouLength = spacing;
         if (!goods.isHasCoupon()) {
            // 无券
            g2d.setColor(new Color(229, 0, 92));
            g2d.drawString("¥ ", spacing, y + 125);
            g2d.setFont(boldFont36);
            g2d.drawString(MoneyBigDecimalUtil.getWithNoZera(goods.getZkPrice()).toString(), spacing + 21, y + 125);
         } else {
            // 券后价
            g2d.setFont(font26);
            g2d.setColor(new Color(229, 0, 92));
            g2d.drawString("券后价  ¥ ", spacing, y + 125);
            g2d.setFont(boldFont36);
            String couponPrice = MoneyBigDecimalUtil.getWithNoZera(goods.getCouponPrice()).toString();
            g2d.drawString(couponPrice, spacing + 116, y + 125);
            FontMetrics fm2 = g2d.getFontMetrics(boldFont36);
            int textLength1 = 116 + fm2.stringWidth(couponPrice);
            // 渠道原价
            g2d.setColor(new Color(153, 153, 153));
            g2d.setFont(font24);
            g2d.drawString(goods.getPriceName() + " ¥ " + MoneyBigDecimalUtil.getWithNoZera(goods.getZkPrice()),
                  spacing + textLength1 + 10, y + 125);
            // 券字
            InputStream quan = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_quan.png");
            g2d.drawImage(ImageIO.read(quan), spacing, y + 140, 47, 40, null);
            // 券面额
            String quanAmount = "¥ " + goods.getCouponInfo().getAmount();
            FontMetrics fm = g2d.getFontMetrics(font26);
            int textLength = fm.stringWidth(quanAmount);
            g2d.setFont(font26);
            g2d.setColor(new Color(229, 0, 92));
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.drawRoundRect(spacing + 42, y + 140, textLength + 20, 39, 10, 10);
            g2d.drawString(quanAmount, spacing + 55, y + 170);
            baoYouLength = spacing + 42 + textLength + 20 + 20;
         }
         // 自营 、包邮
         InputStream ziying = null;
         if (goods.getShopType() == 21) {
            ziying = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_ziying.png");
            g2d.drawImage(ImageIO.read(ziying), baoYouLength, y + 150, 60, 30, null);
         } else if (goods.isBaoyou()) {
            ziying = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_baoyou.png");
            g2d.drawImage(ImageIO.read(ziying), baoYouLength, y + 150, 60, 30, null);
         }
         // 销量
         String sale = null;
         int salesType = goods.getSalesType();
         if (salesType == 1) {
            sale = "月销";
         } else if (salesType == 2) {
            sale = "2小时销量";
         } else if (salesType == 3) {
            sale = "今日销量";
         } else if (salesType == 4) {
            sale = "总销量";
         } else {
            sale = "月销";
         }
         sale = sale + " " + goods.getSalesCount();
         FontMetrics fm = g2d.getFontMetrics(font24);
         int textLength = fm.stringWidth(sale);
         g2d.setFont(font24);
         g2d.setColor(new Color(153, 153, 153));
         g2d.drawString(sale, spacing + 605 - textLength, y + 125);
         // 下单提示
         InputStream downTip = null;
         if (goodsType == Constant.SOURCE_TYPE_TAOBAO) {
            downTip = ImageUtil.class.getClassLoader().getResourceAsStream("image/share/down_tip_tb.png");
         } else {
            downTip = ImageUtil.class.getClassLoader().getResourceAsStream("image/share/down_tip_jd_pdd.png");
         }
         g2d.drawImage(ImageIO.read(downTip), spacing, y + 200, 382, 203, null);
         // 二维码图框
         InputStream codeFrame = ImageUtil.class.getClassLoader()
               .getResourceAsStream("image/share/qr_code_frame01.png");
         g2d.drawImage(ImageIO.read(codeFrame), spacing + 405, y + 200, 200, 203, null);
         // 画二维码
         int codeSize = 170;
         int pX = spacing + 422;
         int pY = y + 217;
         g2d.drawImage(ImageIO.read(qrcode), pX, pY, codeSize, codeSize, null);
         int portraitSize = 200 * 5 / 23;
         int pPX = pX + codeSize / 2 - portraitSize / 2;
         int pPY = pY + codeSize / 2 - portraitSize / 2;
         // 头像白色边框
         g2d.setColor(Color.WHITE);
         g2d.fillRoundRect(pPX - 4, pPY - 4, portraitSize + 8, portraitSize + 8, 5, 5);
         g2d.setRenderingHints(mapH);
         // 画头像
         BufferedImage portraitImg = ImageIO.read(portraitStream);
         portraitImg = ImageUtil.zoomInImage(portraitImg, portraitSize, portraitSize);
         portraitImg = ImageUtil.roundImage(portraitImg, 10);
         g2d.drawImage(portraitImg, pPX, pPY, portraitSize, portraitSize, null);
         // g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
         // RenderingHints.VALUE_ANTIALIAS_ON);
         // g2d.setColor(new Color(255,231, 224));
         // g2d.fillRoundRect(spacing, y + 420, 607, 79, 10, 10);
         //
         // InputStream banliStream =
         // ImageUtil.class.getClassLoader().getResourceAsStream("image/banlikuaisheng.png");
         // g2d.drawImage(ImageIO.read(banliStream), spacing + 20, y + 440,
         // 170, 38, null);
         //
         // inviteCode = "邀请码:" + inviteCode;
         // Font font26d28 = Font.createFont(Font.PLAIN, new
         // File(fontPath)).deriveFont(26.28f);
         // FontMetrics fmcode = g2d.getFontMetrics(font26d28);
         // int codeLength = fmcode.stringWidth(inviteCode);
         // // 邀请码背景
         // g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
         // RenderingHints.VALUE_ANTIALIAS_ON);
         // g2d.setColor(new Color(229,71, 27));
         // g2d.fillRoundRect(spacing + (600 - (int)(codeLength * 1.1)), y +
         // 440, 10 + codeLength, 37, 10, 10);
         // // 邀请码文字
         // g2d.setFont(font26d28);
         // g2d.setColor(new Color(255, 255, 255));
         // g2d.drawString(inviteCode, spacing + (600 - (int)(codeLength *
         // 1.1) + 5), y + 468);
         g2d.dispose();
         ByteArrayOutputStream aos = new ByteArrayOutputStream();
         ImageIO.write(targetImg, "JPEG", aos);
         return new ByteArrayInputStream(aos.toByteArray());
      } catch (Exception e) {
         e.printStackTrace();
         try {
            LogHelper.errorDetailInfo(e);
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      }
      return null;
   }
   /**
    * 单个商品分享图
    *
    * @param qrcode   二维码流
    * @param portrait 头像流
    * @param goods    商品信息
    * @return
    */
   public static InputStream drawGoodsShareSingle(InputStream qrcode, InputStream portrait, GoodsDetailVO goods) {
      try {
         String fontPath = "/usr/share/fonts/PingFang_Medium.ttf";
         String os = System.getProperty("os.name");
         if (os.toLowerCase().startsWith("win")) {
            fontPath = "D:/PingFang_Medium.ttf";
         }
         String fontBoldPath = "/usr/share/fonts/PingFang_Heavy_0.ttf";
         if (os.toLowerCase().startsWith("win")) {
            fontBoldPath = "D:/PingFang_Heavy_0.ttf";
         }
         Font font24 = Font.createFont(Font.PLAIN, new File(fontPath)).deriveFont(24.0f);
         Font font26 = Font.createFont(Font.PLAIN, new File(fontPath)).deriveFont(26.0f);
         Font boldFont36 = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(36.0f);
         int px = 640; // 图片宽度
         int py = 1061; // 图片高度
         if (!goods.isHasCoupon()) {
            py = py - 131;
         }
         final BufferedImage targetImg = new BufferedImage(px, py, BufferedImage.TYPE_INT_RGB);
         HashMap<Key, Object> mapH = new HashMap<Key, Object>();
         mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
         mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
         final Graphics2D g2d = (Graphics2D) targetImg.getGraphics();
         g2d.setRenderingHints(mapH);
         g2d.setColor(Color.WHITE);
         g2d.fillRect(0, 0, px, py);
         int x = 640;
         int y = 640;
         int spacing = 20; // 右边距
         // 1、画商品主图
         InputStream picStream = HttpUtil.getAsInputStream(goods.getPicUrl().replace("https://", "http://"));
         g2d.drawImage(ImageIO.read(picStream), 0, 0, x, y, null);
         // 2、画来源图标
         int length = 10;
         int row1 = 260;
         int iconWidth = 72;
         InputStream icon = null;
         int goodsType = goods.getGoodsType();
         if (goodsType == Constant.SOURCE_TYPE_TAOBAO) {
            if (goods.getShopType() == 10) {
               icon = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_tb.png");
            } else {
               icon = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_tm.png");
            }
         } else if (goodsType == Constant.SOURCE_TYPE_JD) {
            icon = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_jd.png");
         } else if (goodsType == Constant.SOURCE_TYPE_PDD) {
            length = 9;
            row1 = row1 - 26;
            iconWidth = iconWidth + 28;
            icon = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_pdd.png");
         } else {
            return null;
         }
         g2d.drawImage(ImageIO.read(icon), spacing, y + 20, iconWidth, 34, null);
         // 3、商品标题内容
         int row = 0;
         String title = goods.getTitle();
         length = ImageUtil.getTextLengthByWidth(g2d, font26, title, row1, length);
         g2d.setFont(font26);
         g2d.setColor(new Color(0, 0, 0));
         g2d.drawString(title.substring(0, length), spacing + iconWidth + 5, y + 45 + row * 36);
         title = title.substring(length);
         row++;
         // 判断标题内容是否画完,最多可画三行
         while (title.length() > 0 && row < 3) {
            length = ImageUtil.getTextLengthByWidth(g2d, font26, title, 320, 11);
            g2d.drawString(title.substring(0, length), spacing, y + 45 + row * 36);
            title = title.substring(length);
            row++;
         }
         String code_frame = "image/share/qr_code_frame.png";
         if (!goods.isHasCoupon()) {
            // 无券
            code_frame = "image/share/qr_code_frame_no_coupon.png";
            g2d.setColor(new Color(229, 0, 92));
            g2d.drawString("¥ ", spacing, y + 175);
            g2d.setFont(boldFont36);
            g2d.drawString(MoneyBigDecimalUtil.getWithNoZera(goods.getZkPrice()).toString(), spacing + 21, y + 175);
         } else {
            // 券后价
            g2d.setFont(font26);
            g2d.setColor(new Color(229, 0, 92));
            g2d.drawString("券后价  ¥ ", spacing, y + 175);
            g2d.setFont(boldFont36);
            g2d.drawString(MoneyBigDecimalUtil.getWithNoZera(goods.getCouponPrice()).toString(), spacing + 116,
                  y + 175);
            // 渠道原价(在售价)
            g2d.setColor(new Color(153, 153, 153));
            g2d.setFont(font24);
            g2d.drawString(goods.getPriceName() + " ¥ " + MoneyBigDecimalUtil.getWithNoZera(goods.getZkPrice()),
                  spacing, y + 210);
            // 券字
            InputStream quan = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_quan.png");
            g2d.drawImage(ImageIO.read(quan), spacing, y + 240, 47, 40, null);
            // 券面额
            String quanAmount = "¥ " + goods.getCouponInfo().getAmount();
            FontMetrics fm = g2d.getFontMetrics(font26);
            int textLength = fm.stringWidth(quanAmount);
            g2d.setFont(font26);
            g2d.setColor(new Color(229, 0, 92));
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.drawRoundRect(spacing + 42, y + 240, textLength + 20, 39, 10, 10);
            g2d.drawString(quanAmount, spacing + 55, y + 270);
            // 提示语
            InputStream tipStream = ImageUtil.class.getClassLoader()
                  .getResourceAsStream("image/share/tip_angle.png");
            g2d.drawImage(ImageIO.read(tipStream), spacing, y + 300, 601, 101, null);
         }
         // 自营 、包邮
         if (goods.getShopType() == 21) {
            InputStream ziying = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_ziying.png");
            g2d.drawImage(ImageIO.read(ziying), spacing + 300, y + 150, 60, 30, null);
         } else if (goods.isBaoyou()) {
            InputStream ziying = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_baoyou.png");
            g2d.drawImage(ImageIO.read(ziying), spacing + 300, y + 150, 60, 30, null);
         }
         // 销量
         String sale = null;
         int salesType = goods.getSalesType();
         if (salesType == 1) {
            sale = "月销";
         } else if (salesType == 2) {
            sale = "2小时销量";
         } else if (salesType == 3) {
            sale = "今日销量";
         } else if (salesType == 4) {
            sale = "总销量";
         } else {
            sale = "月销";
         }
         sale = sale + " " + goods.getSalesCount();
         FontMetrics fm = g2d.getFontMetrics(font24);
         int textLength = fm.stringWidth(sale);
         g2d.setFont(font24);
         g2d.setColor(new Color(153, 153, 153));
         g2d.drawString(sale, spacing + 360 - textLength, y + 210);
         // 二维码图框
         g2d.setColor(Color.WHITE);
         InputStream codeFrame = ImageUtil.class.getClassLoader().getResourceAsStream(code_frame);
         g2d.drawImage(ImageIO.read(codeFrame), spacing + 405, y + 20, 200, 261, null);
         // 画 二维码
         int codeSize = 170;
         g2d.drawImage(ImageIO.read(qrcode), spacing + 420, y + 38, codeSize, codeSize, null);
         // 画二维码中 头像
         int portraitSize = 40;
         int pPX = spacing + 425 + codeSize / 2 + -portraitSize / 2;
         int pPY = y + 35 + codeSize / 2 - portraitSize / 2;
         BufferedImage portraitImg = ImageIO.read(portrait);
         portraitImg = ImageUtil.roundImage(portraitImg, 10);
         // 头像白色边框
         g2d.fillRoundRect(pPX - 4, pPY - 4, portraitSize + 8, portraitSize + 8, 10, 10);
         // 头像
         g2d.drawImage(portraitImg, pPX, pPY, portraitSize, portraitSize, null);
         // 结束
         g2d.dispose();
         ByteArrayOutputStream aos = new ByteArrayOutputStream();
         ImageIO.write(targetImg, "JPEG", aos);
         return new ByteArrayInputStream(aos.toByteArray());
      } catch (Exception e) {
         e.printStackTrace();
         try {
            LogHelper.errorDetailInfo(e);
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      }
      return null;
   }
   // 画商品分享图
   public static InputStream drawGoodsShareImg(InputStream qrcodeStream, InputStream portrait,
         TaoBaoGoodsBrief goods) {
      String fontPath = "/usr/share/fonts/PingFang_Medium.ttf";
      String os = System.getProperty("os.name");
      if (os.toLowerCase().startsWith("win")) {
         fontPath = "D:/PingFang_Medium.ttf";
      }
      String fontBoldPath = "/usr/share/fonts/PingFang_Heavy_0.ttf";
      if (os.toLowerCase().startsWith("win")) {
         fontBoldPath = "D:/PingFang_Heavy_0.ttf";
      }
      final BufferedImage targetImg = new BufferedImage(720, 1280, BufferedImage.TYPE_INT_RGB);
      HashMap<Key, Object> mapH = new HashMap<Key, Object>();
      mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
      mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
      final Graphics2D g2d = (Graphics2D) targetImg.getGraphics();
      g2d.setRenderingHints(mapH);
      g2d.setColor(Color.WHITE);
      g2d.fillRect(0, 0, 720, 1280);
      Font font = null;
      try {
         font = Font.createFont(Font.PLAIN, new File(fontPath)).deriveFont(30.0f);
      } catch (FontFormatException e1) {
         e1.printStackTrace();
      } catch (IOException e1) {
         e1.printStackTrace();
      }
      g2d.setFont(font);
      try {
         g2d.setColor(new Color(153, 153, 153));
         // 画来源图标
         InputStream userTypeIcon = null;
         if (goods.getUserType() == 0)// 淘宝
         {
            userTypeIcon = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_tb.png");
         } else {
            userTypeIcon = ImageUtil.class.getClassLoader().getResourceAsStream("image/icon_tm.png");
         }
         g2d.drawImage(ImageIO.read(userTypeIcon), 50, 88, null);
         // 商品标题
         String title = goods.getTitle();
         int row = 0;
         int length = 0;
         // 画第一排
         length = getTextLengthByWidth(g2d, font, title, 500, 10);
         g2d.drawString(title.substring(0, length), 50 + 65, 112 + row * 40);
         title = title.substring(length);
         row++;
         // 判断是否画完,最多画2排
         while (title.length() > 0 && row < 2) {
            length = getTextLengthByWidth(g2d, font, title, 335, 10);
            g2d.drawString(title.substring(0, length), 50, 112 + row * 40);
            title = title.substring(length);
            row++;
         }
         // 画商品主图
         InputStream goodsPicture = TaoBaoHttpUtil.getAsInputStream(goods.getPictUrl());
         BufferedImage picImage = ImageIO.read(goodsPicture);
         picImage = zoomInImage(picImage, 620, 620);
         g2d.drawImage(picImage, 50, 190, null);
         Font boldFont = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(50.0f);
         // 画价格
         // 有券
         if (!StringUtil.isNullOrEmpty(goods.getCouponInfo())) {
            BigDecimal finalPrice = goods.getZkPrice();
            if (goods.getCouponStartFee().compareTo(goods.getZkPrice()) <= 0
                  && goods.getZkPrice().compareTo(goods.getCouponAmount()) >= 0) {
               finalPrice = goods.getZkPrice().subtract(goods.getCouponAmount());
            }
            g2d.setColor(new Color(229, 0, 93));
            g2d.drawString("券后价  ¥", 57, 875);
            g2d.setColor(new Color(229, 0, 93));
            g2d.setFont(boldFont);
            g2d.drawString(finalPrice.toString(), 85 + 110, 875);
            // 画券右侧
            BufferedImage quanRight = ImageIO
                  .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_right.png"));
            g2d.setColor(new Color(241, 66, 66));
            g2d.drawImage(quanRight, 670 - quanRight.getWidth(), 852, null);
            // 画券的内容
            g2d.setColor(new Color(229, 0, 93));
            String quanString = " " + MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount()) + "元券 ";
            boldFont = boldFont.deriveFont(44.0f);
            g2d.setFont(boldFont);
            FontMetrics fm = g2d.getFontMetrics(boldFont);
            int textLength = fm.stringWidth(quanString);
            g2d.fillRect(670 - quanRight.getWidth() - textLength, 852, textLength, 80);
            g2d.setColor(Color.WHITE);
            g2d.setFont(boldFont);
            g2d.drawString(quanString, 670 - quanRight.getWidth() - textLength, 927 - 19);
            // 画券左侧
            BufferedImage quanLeft = ImageIO
                  .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_left.png"));
            g2d.drawImage(quanLeft, 670 - quanRight.getWidth() - textLength - quanLeft.getWidth(), 852, null);
            String zkPriceName = "";
            if (goods.getUserType() == 0)
               zkPriceName = "淘宝价  ¥ " + MoneyBigDecimalUtil.getWithNoZera(goods.getZkPrice());
            else
               zkPriceName = "天猫价  ¥ " + MoneyBigDecimalUtil.getWithNoZera(goods.getZkPrice());
            g2d.setColor(new Color(153, 153, 153));
            font = font.deriveFont(30.0f);
            g2d.setFont(font);
            g2d.drawString(zkPriceName, 56, 930);
         } else// 无券
         {
            g2d.setColor(new Color(229, 0, 93));
            g2d.drawString("¥", 60, 870);
            g2d.setColor(new Color(229, 0, 93));
            BigDecimal finalPrice = goods.getZkPrice();
            g2d.setFont(boldFont);
            g2d.drawString(finalPrice.toString(), 85, 870);
         }
         g2d.setColor(new Color(247, 247, 247));
         g2d.fillRect(56, 1015, 608, 204);
         // 画二维码
         BufferedImage qrcodeImage = ImageIO.read(qrcodeStream);
         qrcodeImage = zoomInImage(qrcodeImage, 170, 170);
         g2d.drawImage(qrcodeImage, 56 + 17, 1015 + 17, null);
         // 画头像
         if (portrait != null) {
            BufferedImage portraitImg = ImageIO.read(portrait);
            portraitImg = zoomInImage(portraitImg, 40, 40);
            g2d.drawImage(portraitImg, 56 + 17 + (qrcodeImage.getWidth() - portraitImg.getWidth()) / 2,
                  1015 + 17 + (qrcodeImage.getHeight() - portraitImg.getHeight()) / 2, null);
         }
         font = font.deriveFont(30.0f);
         g2d.setFont(font);
         g2d.setColor(new Color(229, 0, 93));
         g2d.setColor(new Color(102, 102, 102));
         g2d.drawString("长按识别二维码领取优惠券", 250 + 17, 1130 + 17);
         g2d.dispose();
         // OutputStream out = new ByteArrayOutputStream(); new
         // FileOutputStream(new File(targetPath));
         // ImageIO.write(targetImg, "JPEG", out);
         // out.flush();
         // out.close();
         ByteArrayOutputStream aos = new ByteArrayOutputStream();
         ImageIO.write(targetImg, "JPEG", aos);
         InputStream is = new ByteArrayInputStream(aos.toByteArray());
         return is;
      } catch (Exception e) {
         try {
            LogHelper.errorDetailInfo(e);
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      }
      return null;
   }
   /**
    * 绘制大的商品动态分享图
    *
    * @param qrcodeStream
    * @param portrait
    * @param goods
    * @return
    */
   public static InputStream drawActivityGoodsShareBigImg(InputStream qrcodeStream, InputStream portrait,
         List<RecommendActivityTaoBaoGoods> goodsList) {
      String fontPath = "/usr/share/fonts/PingFang_Medium.ttf";
      String os = System.getProperty("os.name");
      if (os.toLowerCase().startsWith("win")) {
         fontPath = "D:/PingFang_Medium.ttf";
      }
      String fontBoldPath = "/usr/share/fonts/PingFang_Heavy_0.ttf";
      if (os.toLowerCase().startsWith("win")) {
         fontBoldPath = "D:/PingFang_Heavy_0.ttf";
      }
      final BufferedImage targetImg = new BufferedImage(1420, 1334, BufferedImage.TYPE_INT_RGB);
      HashMap<Key, Object> mapH = new HashMap<Key, Object>();
      mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
      mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
      final Graphics2D g2d = (Graphics2D) targetImg.getGraphics();
      g2d.setRenderingHints(mapH);
      g2d.setColor(Color.WHITE);
      g2d.fillRect(0, 0, 1420, 1334);
      Font font = null;
      try {
         font = Font.createFont(Font.PLAIN, new File(fontPath)).deriveFont(30.0f);
      } catch (FontFormatException e1) {
         e1.printStackTrace();
      } catch (IOException e1) {
         e1.printStackTrace();
      }
      Font boldFont = null;
      try {
         boldFont = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(50.0f);
      } catch (FontFormatException e2) {
         e2.printStackTrace();
      } catch (IOException e2) {
         e2.printStackTrace();
      }
      g2d.setFont(font);
      try {
         g2d.setColor(new Color(153, 153, 153));
         // 画第一张
         for (int i = 0; i < goodsList.size(); i++) {
            RecommendActivityTaoBaoGoods goods = goodsList.get(i);
            // 第一张图需要有价格信息
            if (i == 0) {
               int topX = 50;
               int topY = 50;
               // 画大图 起始点坐标为(50,50)
               InputStream goodsPicture = TaoBaoHttpUtil
                     .getAsInputStream(goods.getPictUrl().replace("_.webp", "").replace("_220x220", ""));
               BufferedImage picImage = ImageIO.read(goodsPicture);
               picImage = zoomInImage(picImage, 650, 650);
               g2d.drawImage(picImage, topX, topX, null);
               g2d.setColor(new Color(224, 224, 224));
               // 画边框
               g2d.setStroke(new BasicStroke(1.0f));
               g2d.drawRect(topX - 1, topY - 1, 651, 651);
               // 画透明背景
               g2d.setColor(new Color(255, 255, 255, 210));
               g2d.fillRect(50, 600, 650, 100);
               // 画金额
               g2d.setColor(new Color(240, 0, 102));
               boldFont = boldFont.deriveFont(22.0f);
               g2d.setFont(boldFont);
               g2d.drawString("¥", 70, 650);
               boldFont = boldFont.deriveFont(42.0f);
               g2d.setFont(boldFont);
               g2d.drawString(goods.getQuanPrice(), 90, 650);
               // 画原价
               g2d.setColor(new Color(102, 102, 102));
               font = font.deriveFont(24.0f);
               g2d.setFont(font);
               String zkPrice = new BigDecimal(goods.getQuanPrice().replace("¥", "")).add(goods.getCouponAmount())
                     .toString();
               g2d.drawString("¥ " + zkPrice, 70, 650 + 33);
               FontMetrics fm = g2d.getFontMetrics(font);
               int textLength = fm.stringWidth(zkPrice);
               // 画删除线
               g2d.setStroke(new BasicStroke(2.0f));
               g2d.drawLine(70 + 20, 674, 90 + 10 + textLength, 674);
               // 画券右侧
               BufferedImage quanRight = ImageIO
                     .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_right.png"));
               quanRight = zoomInImage(quanRight, 12, 60);
               g2d.setColor(new Color(241, 66, 66));
               g2d.drawImage(quanRight, topX + 630 - quanRight.getWidth(), topY + 630 - quanRight.getHeight(),
                     null);
               // 画券的内容
               g2d.setColor(new Color(229, 0, 93));
               String quanString = " " + MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount()) + "元券 ";
               font = font.deriveFont(36.0f);
               g2d.setFont(font);
               fm = g2d.getFontMetrics(font);
               textLength = fm.stringWidth(quanString);
               g2d.fillRect(topX + 630 - quanRight.getWidth() - textLength, topY + 630 - quanRight.getHeight(),
                     textLength, quanRight.getHeight());
               g2d.setColor(Color.WHITE);
               g2d.drawString(quanString, topX + 630 - quanRight.getWidth() - textLength,
                     topY + 630 + 42 - quanRight.getHeight());
               // 画券左侧
               BufferedImage quanLeft = ImageIO
                     .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_left.png"));
               quanLeft = zoomInImage(quanLeft, 12, 60);
               g2d.drawImage(quanLeft, topX + 630 - quanRight.getWidth() - textLength - quanLeft.getWidth(),
                     topY + 630 - quanRight.getHeight(), null);
            } else {
               // 计算左上角坐标
               int topX = 0;
               int topY = 0;
               if (i == 1)
                  topX = 50 + (315 + 20) * 0;
               else if (i == 2 || i % 2 != 0)// 2,3,5,7
                  topX = 50 + (315 + 20) * (i % 2 + 1);
               else if (i % 2 == 0)// 4,6,8
                  topX = 50 + (315 + 20) * 3;
               if (i == 1 || i == 2)
                  topY = 50 + 650 + 20;
               else if (i == 3 || i == 4)
                  topY = 50;
               else if (i == 5 || i == 6)
                  topY = 50 + (315 + 20) * 1;
               else if (i == 7 || i == 8)
                  topY = 50 + (315 + 20) * 2;
               // 画大图
               InputStream goodsPicture = TaoBaoHttpUtil
                     .getAsInputStream(goods.getPictUrl().replace("_.webp", ""));
               BufferedImage picImage = ImageIO.read(goodsPicture);
               picImage = zoomInImage(picImage, 315, 315);
               g2d.drawImage(picImage, topX, topY, null);
               g2d.setColor(new Color(224, 224, 224));
               // 画边框
               g2d.setStroke(new BasicStroke(1.0f));
               g2d.drawRect(topX - 1, topY - 1, 316, 316);
               // 画券
               // 画券右侧
               BufferedImage quanRight = ImageIO
                     .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_right.png"));
               quanRight = zoomInImage(quanRight, 8, 40);
               g2d.setColor(new Color(241, 66, 66));
               g2d.drawImage(quanRight, topX + 315 - quanRight.getWidth(), topY + 315 - quanRight.getHeight(),
                     null);
               // 画券的内容
               g2d.setColor(new Color(229, 0, 93));
               String quanString = " " + MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount()) + "元券 ";
               font = font.deriveFont(24.0f);
               g2d.setFont(font);
               FontMetrics fm = g2d.getFontMetrics(font);
               int textLength = fm.stringWidth(quanString);
               g2d.fillRect(topX + 315 - quanRight.getWidth() - textLength, topY + 315 - quanRight.getHeight(),
                     textLength, quanRight.getHeight());
               g2d.setColor(Color.WHITE);
               g2d.setFont(font);
               g2d.drawString(quanString, topX + 315 - quanRight.getWidth() - textLength,
                     topY + 315 + 28 - quanRight.getHeight());
               // 画券左侧
               BufferedImage quanLeft = ImageIO
                     .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_left.png"));
               quanLeft = zoomInImage(quanLeft, 8, 40);
               g2d.drawImage(quanLeft, topX + 315 - quanRight.getWidth() - textLength - quanLeft.getWidth(),
                     topY + 315 - quanRight.getHeight(), null);
            }
         }
         g2d.setColor(new Color(247, 247, 247));
         g2d.fillRect(50, 1070, 1320, 214);
         // 画二维码
         BufferedImage qrcodeImage = ImageIO.read(qrcodeStream);
         qrcodeImage = zoomInImage(qrcodeImage, 170, 170);
         g2d.drawImage(qrcodeImage, 70, 1092, null);
         // 画头像
         if (portrait != null) {
            BufferedImage portraitImg = ImageIO.read(portrait);
            portraitImg = zoomInImage(portraitImg, 40, 40);
            g2d.drawImage(portraitImg, 70 + (qrcodeImage.getWidth() - portraitImg.getWidth()) / 2,
                  1092 + (qrcodeImage.getHeight() - portraitImg.getHeight()) / 2, null);
         }
         font = font.deriveFont(50.0f);
         g2d.setFont(font);
         g2d.setColor(new Color(229, 0, 93));
         g2d.setColor(new Color(102, 102, 102));
         g2d.drawString("长按识别二维码领取优惠券", 312, 1118 + 77);
         g2d.dispose();
         // OutputStream out = new ByteArrayOutputStream(); new
         // FileOutputStream(new File(targetPath));
         // ImageIO.write(targetImg, "JPEG", out);
         // out.flush();
         // out.close();
         ByteArrayOutputStream aos = new ByteArrayOutputStream();
         ImageIO.write(targetImg, "JPEG", aos);
         InputStream is = new ByteArrayInputStream(aos.toByteArray());
         return is;
      } catch (Exception e) {
         try {
            LogHelper.errorDetailInfo(e);
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      }
      return null;
   }
   /**
    * 绘制大的商品动态分享图
    *
    * @param qrcodeStream
    * @param portrait
    * @param goods
    * @return
    */
   public static InputStream drawGoodsShareBigImg(InputStream qrcodeStream, InputStream portrait,
         List<TaoBaoGoodsBrief> goodsList) {
      String fontPath = "/usr/share/fonts/PingFang_Medium.ttf";
      String os = System.getProperty("os.name");
      if (os.toLowerCase().startsWith("win")) {
         fontPath = "D:/PingFang_Medium.ttf";
      }
      String fontBoldPath = "/usr/share/fonts/PingFang_Heavy_0.ttf";
      if (os.toLowerCase().startsWith("win")) {
         fontBoldPath = "D:/PingFang_Heavy_0.ttf";
      }
      final BufferedImage targetImg = new BufferedImage(1420, 1334, BufferedImage.TYPE_INT_RGB);
      HashMap<Key, Object> mapH = new HashMap<Key, Object>();
      mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
      mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
      final Graphics2D g2d = (Graphics2D) targetImg.getGraphics();
      g2d.setRenderingHints(mapH);
      g2d.setColor(Color.WHITE);
      g2d.fillRect(0, 0, 1420, 1334);
      Font font = null;
      try {
         font = Font.createFont(Font.PLAIN, new File(fontPath)).deriveFont(30.0f);
      } catch (FontFormatException e1) {
         e1.printStackTrace();
      } catch (IOException e1) {
         e1.printStackTrace();
      }
      Font boldFont = null;
      try {
         boldFont = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(50.0f);
      } catch (FontFormatException e2) {
         e2.printStackTrace();
      } catch (IOException e2) {
         e2.printStackTrace();
      }
      g2d.setFont(font);
      try {
         // g2d.setColor(new Color(153, 153, 153));
         // 画第一张
         for (int i = 0; i < goodsList.size(); i++) {
            TaoBaoGoodsBrief goods = goodsList.get(i);
            BigDecimal couplePrice = TaoBaoUtil.getAfterUseCouplePrice(goods);
            // 第一张图需要有价格信息
            if (i == 0) {
               int topX = 50;
               int topY = 50;
               // 画大图 起始点坐标为(50,50)
               InputStream goodsPicture = TaoBaoHttpUtil
                     .getAsInputStream(goods.getPictUrl().replace("_.webp", "").replace("_220x220", ""));
               BufferedImage picImage = ImageIO.read(goodsPicture);
               picImage = zoomInImage(picImage, 650, 650);
               g2d.drawImage(picImage, topX, topX, null);
               g2d.setColor(new Color(224, 224, 224));
               // 画边框
               g2d.setStroke(new BasicStroke(1.0f));
               g2d.drawRect(topX - 1, topY - 1, 651, 651);
               // 画透明背景
               g2d.setColor(new Color(255, 255, 255, 210));
               g2d.fillRect(50, 600, 650, 100);
               // 画金额
               g2d.setColor(new Color(240, 0, 102));
               boldFont = boldFont.deriveFont(22.0f);
               g2d.setFont(boldFont);
               g2d.drawString("¥", 70, 650);
               boldFont = boldFont.deriveFont(42.0f);
               g2d.setFont(boldFont);
               g2d.drawString(couplePrice + "", 90, 650);
               // 画原价
               g2d.setColor(new Color(102, 102, 102));
               font = font.deriveFont(24.0f);
               g2d.setFont(font);
               String zkPrice = new BigDecimal((couplePrice + "").replace("¥", "")).add(goods.getCouponAmount())
                     .toString();
               g2d.drawString("¥ " + zkPrice, 70, 650 + 33);
               FontMetrics fm = g2d.getFontMetrics(font);
               int textLength = fm.stringWidth(zkPrice);
               // 画删除线
               g2d.setStroke(new BasicStroke(2.0f));
               g2d.drawLine(70 + 20, 674, 90 + 10 + textLength, 674);
               String quanString = "";
               BigDecimal withNoZera = MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount());
               if (!withNoZera.toString().endsWith("0")) {
                  // 画券右侧
                  BufferedImage quanRight = ImageIO.read(
                        ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_right.png"));
                  quanRight = zoomInImage(quanRight, 12, 60);
                  g2d.setColor(new Color(241, 66, 66));
                  g2d.drawImage(quanRight, topX + 630 - quanRight.getWidth(), topY + 630 - quanRight.getHeight(),
                        null);
                  // 画券的内容
                  g2d.setColor(new Color(229, 0, 93));
                  quanString = " " + withNoZera + "元券 ";
                  font = font.deriveFont(36.0f);
                  g2d.setFont(font);
                  fm = g2d.getFontMetrics(font);
                  textLength = fm.stringWidth(quanString);
                  g2d.fillRect(topX + 630 - quanRight.getWidth() - textLength, topY + 630 - quanRight.getHeight(),
                        textLength, quanRight.getHeight());
                  g2d.setColor(Color.WHITE);
                  g2d.drawString(quanString, topX + 630 - quanRight.getWidth() - textLength,
                        topY + 630 + 42 - quanRight.getHeight());
                  // 画券左侧
                  BufferedImage quanLeft = ImageIO.read(
                        ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_left.png"));
                  quanLeft = zoomInImage(quanLeft, 12, 60);
                  g2d.drawImage(quanLeft, topX + 630 - quanRight.getWidth() - textLength - quanLeft.getWidth(),
                        topY + 630 - quanRight.getHeight(), null);
               }
            } else {
               // 计算左上角坐标
               int topX = 0;
               int topY = 0;
               if (i == 1)
                  topX = 50 + (315 + 20) * 0;
               else if (i == 2 || i % 2 != 0)// 2,3,5,7
                  topX = 50 + (315 + 20) * (i % 2 + 1);
               else if (i % 2 == 0)// 4,6,8
                  topX = 50 + (315 + 20) * 3;
               if (i == 1 || i == 2)
                  topY = 50 + 650 + 20;
               else if (i == 3 || i == 4)
                  topY = 50;
               else if (i == 5 || i == 6)
                  topY = 50 + (315 + 20) * 1;
               else if (i == 7 || i == 8)
                  topY = 50 + (315 + 20) * 2;
               // 画大图
               InputStream goodsPicture = TaoBaoHttpUtil
                     .getAsInputStream(goods.getPictUrl().replace("_.webp", ""));
               BufferedImage picImage = ImageIO.read(goodsPicture);
               picImage = zoomInImage(picImage, 315, 315);
               g2d.drawImage(picImage, topX, topY, null);
               g2d.setColor(new Color(224, 224, 224));
               // 画边框
               g2d.setStroke(new BasicStroke(1.0f));
               g2d.drawRect(topX - 1, topY - 1, 316, 316);
               // 画券
               String quanString = "";
               BigDecimal withNoZera = MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount());
               if (!withNoZera.toString().endsWith("0")) {
                  // 画券右侧
                  BufferedImage quanRight = ImageIO.read(
                        ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_right.png"));
                  quanRight = zoomInImage(quanRight, 8, 40);
                  g2d.setColor(new Color(241, 66, 66));
                  g2d.drawImage(quanRight, topX + 315 - quanRight.getWidth(), topY + 315 - quanRight.getHeight(),
                        null);
                  // 画券的内容
                  g2d.setColor(new Color(229, 0, 93));
                  quanString = " " + withNoZera + "元券 ";
                  font = font.deriveFont(24.0f);
                  g2d.setFont(font);
                  FontMetrics fm = g2d.getFontMetrics(font);
                  int textLength = fm.stringWidth(quanString);
                  g2d.fillRect(topX + 315 - quanRight.getWidth() - textLength, topY + 315 - quanRight.getHeight(),
                        textLength, quanRight.getHeight());
                  g2d.setColor(Color.WHITE);
                  g2d.setFont(font);
                  g2d.drawString(quanString, topX + 315 - quanRight.getWidth() - textLength,
                        topY + 315 + 28 - quanRight.getHeight());
                  // 画券左侧
                  BufferedImage quanLeft = ImageIO.read(
                        ImageUtil.class.getClassLoader().getResourceAsStream("image/fanli_quan_left.png"));
                  quanLeft = zoomInImage(quanLeft, 8, 40);
                  g2d.drawImage(quanLeft, topX + 315 - quanRight.getWidth() - textLength - quanLeft.getWidth(),
                        topY + 315 - quanRight.getHeight(), null);
               }
            }
         }
         g2d.setColor(new Color(247, 247, 247));
         g2d.fillRect(50, 1070, 1320, 214);
         // 画二维码
         BufferedImage qrcodeImage = ImageIO.read(qrcodeStream);
         qrcodeImage = zoomInImage(qrcodeImage, 170, 170);
         g2d.drawImage(qrcodeImage, 70, 1092, null);
         // 画头像
         if (portrait != null) {
            BufferedImage portraitImg = ImageIO.read(portrait);
            // 放缩大小
            portraitImg = zoomInImage(portraitImg, 40, 40);
            // 圆角
            portraitImg = roundImage(portraitImg, 10);
            g2d.drawImage(portraitImg, 70 + (qrcodeImage.getWidth() - portraitImg.getWidth()) / 2,
                  1092 + (qrcodeImage.getHeight() - portraitImg.getHeight()) / 2, null);
         }
         font = font.deriveFont(50.0f);
         g2d.setFont(font);
         g2d.setColor(new Color(229, 0, 93));
         g2d.setColor(new Color(102, 102, 102));
         g2d.drawString("长按识别二维码免费领券", 312, 1150);
         g2d.setColor(new Color(102, 102, 102));
         g2d.drawString("共", 1000, 1150);
         g2d.setColor(new Color(229, 0, 93));
         g2d.drawString(goodsList.size() + "", 1055, 1150);
         g2d.setColor(new Color(102, 102, 102));
         g2d.drawString("个商品", 1090, 1150);
         // 提示语
         BufferedImage tips = ImageIO
               .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/share/tips1.png"));
         tips = zoomInImage(tips, 850, 65);
         g2d.drawImage(tips, 312, 1190, null);
         g2d.dispose();
         ByteArrayOutputStream aos = new ByteArrayOutputStream();
         ImageIO.write(targetImg, "JPEG", aos);
         InputStream is = new ByteArrayInputStream(aos.toByteArray());
         return is;
      } catch (Exception e) {
         try {
            LogHelper.errorDetailInfo(e);
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      }
      return null;
   }
   /**
    * 绘制大的商品动态分享图
    *
    * @param qrcodeStream
    * @param portrait
    * @param goods
    * @return
    */
   public static InputStream drawGoodsSharePicture(InputStream qrcodeStream, InputStream portrait,
         List<CommonGoods> goodsList) {
      String fontPath = "/usr/share/fonts/PingFang_Medium.ttf";
      String os = System.getProperty("os.name");
      if (os.toLowerCase().startsWith("win")) {
         fontPath = "D:/PingFang_Medium.ttf";
      }
      String fontBoldPath = "/usr/share/fonts/PingFang_Heavy_0.ttf";
      if (os.toLowerCase().startsWith("win")) {
         fontBoldPath = "D:/PingFang_Heavy_0.ttf";
      }
      final BufferedImage targetImg = new BufferedImage(1420, 1334, BufferedImage.TYPE_INT_RGB);
      HashMap<Key, Object> mapH = new HashMap<Key, Object>();
      mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
      mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
      final Graphics2D g2d = (Graphics2D) targetImg.getGraphics();
      g2d.setRenderingHints(mapH);
      g2d.setColor(Color.WHITE);
      g2d.fillRect(0, 0, 1420, 1334);
      Font font = null;
      try {
         font = Font.createFont(Font.PLAIN, new File(fontPath)).deriveFont(30.0f);
      } catch (FontFormatException e1) {
         e1.printStackTrace();
      } catch (IOException e1) {
         e1.printStackTrace();
      }
      Font boldFont = null;
      try {
         boldFont = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(50.0f);
      } catch (FontFormatException e2) {
         e2.printStackTrace();
      } catch (IOException e2) {
         e2.printStackTrace();
      }
      g2d.setFont(font);
      try {
         boolean index = true;
         // 画第一张
         for (int i = 0; i < goodsList.size(); i++) {
            CommonGoods goods = goodsList.get(i);
            BigDecimal couplePrice = CommonGoodsUtil.getAfterUseCouplePrice(goods);
            // 第一张图需要有价格信息
            if (i == 0 || index) {
               int topX = 50;
               int topY = 50;
               // 画大图 起始点坐标为(50,50)
               int widht = 650;
               int height = 650;
               InputStream goodsPicture = TaoBaoHttpUtil
                     .getAsInputStream(goods.getPicture().replace("_.webp", "").replace("_220x220", ""));
               if (goodsPicture == null)
                  continue;
               BufferedImage picImage = ImageIO.read(goodsPicture);
               picImage = ImageUtil.zoomInImage(picImage, widht, height);
               g2d.drawImage(picImage, topX, topX, null);
               // 画边框
               g2d.setColor(new Color(224, 224, 224));
               g2d.setStroke(new BasicStroke(1.0f));
               g2d.drawRect(topX - 1, topY - 1, widht + 1, widht + 1);
               // 画透明背景
               g2d.setColor(new Color(255, 255, 255, 210));
               g2d.fillRect(10, height - 50, widht + 40, 100);
               // 画券后价金额
               boldFont = boldFont.deriveFont(42.0f);
               g2d.setFont(boldFont);
               g2d.setColor(new Color(229, 0, 92));
               g2d.drawString("¥", 70 + 10, height);
               g2d.drawString(couplePrice + "", 70 + 45, height);
               // 画原价
               g2d.setColor(new Color(102, 102, 102));
               font = font.deriveFont(24.0f);
               g2d.setFont(font);
               String zkPrice = new BigDecimal((couplePrice + "").replace("¥", "")).add(goods.getCouponAmount())
                     .toString();
               g2d.drawString("¥ " + zkPrice, 70 + 15, height + 30);
               // 画删除线
               FontMetrics fm = g2d.getFontMetrics(font);
               int textLength = fm.stringWidth(zkPrice);
               g2d.setStroke(new BasicStroke(2.0f));
               g2d.drawLine(70 + 20, height + 21, 90 + 10 + textLength, height + 21);
               BigDecimal withNoZera = MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount());
               if (withNoZera != null && withNoZera.compareTo(new BigDecimal(0)) > 0) {
                  g2d.setRenderingHints(mapH);
                  // 券值得长度
                  int size = withNoZera.toString().length() * 22;
                  int place = withNoZera.toString().length() * 22;
                  // 券红色底部
                  int quanBGWidht = widht - 100 - place;
                  int quanBGHeight = height - 33;
                  g2d.setColor(new Color(229, 0, 92));
                  g2d.fillRoundRect(quanBGWidht, quanBGHeight, 130 + size, 70, 10, 10);
                  // 画券字
                  boldFont = boldFont.deriveFont(40.0f);
                  g2d.setFont(boldFont);
                  g2d.setColor(new Color(255, 255, 255));
                  g2d.drawString("券", quanBGWidht + 8, quanBGHeight + 48);
                  // 券白色底部
                  g2d.fillRoundRect(quanBGWidht + 55, quanBGHeight + 4, 70 + size, 62, 10, 10);
                  // 画券面值
                  g2d.setFont(boldFont);
                  g2d.setColor(new Color(229, 0, 92));
                  g2d.drawString("¥ " + withNoZera + "", quanBGWidht + 70, quanBGHeight + 48);
               }
               index = false;
            } else {
               // 计算左上角坐标
               int topX = 0;
               int topY = 0;
               if (i == 1)
                  topX = 50 + (315 + 20) * 0;
               else if (i == 2 || i % 2 != 0)// 2,3,5,7
                  topX = 50 + (315 + 20) * (i % 2 + 1);
               else if (i % 2 == 0)// 4,6,8
                  topX = 50 + (315 + 20) * 3;
               if (i == 1 || i == 2)
                  topY = 50 + 650 + 20;
               else if (i == 3 || i == 4)
                  topY = 50;
               else if (i == 5 || i == 6)
                  topY = 50 + (315 + 20) * 1;
               else if (i == 7 || i == 8)
                  topY = 50 + (315 + 20) * 2;
               // 画大图
               InputStream goodsPicture = TaoBaoHttpUtil
                     .getAsInputStream(goods.getPicture().replace("_.webp", ""));
               if (goodsPicture == null)
                  continue;
               BufferedImage picImage = ImageIO.read(goodsPicture);
               picImage = ImageUtil.zoomInImage(picImage, 315, 315);
               g2d.drawImage(picImage, topX, topY, null);
               g2d.setColor(new Color(224, 224, 224));
               // 画边框
               g2d.setStroke(new BasicStroke(1.0f));
               g2d.drawRect(topX - 1, topY - 1, 316, 316);
               // 画券
               BigDecimal withNoZera = MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount());
               if (withNoZera != null && withNoZera.compareTo(new BigDecimal(0)) > 0) {
                  // // 画透明背景
                  // g2d.setColor(new Color(255, 255, 255, 210));
                  // g2d.fillRect(topX + 8, topY + 240, 300, 65);
                  g2d.setRenderingHints(mapH);
                  // 券值得长度
                  int size = withNoZera.toString().length() * 22;
                  int place = withNoZera.toString().length() * 22;
                  // // 券红色底部
                  int quanBGWidht = topX + 170 - place;
                  int quanBGHeight = topY + 220;
                  g2d.setColor(new Color(229, 0, 92));
                  g2d.fillRoundRect(quanBGWidht, quanBGHeight, 130 + size, 70, 10, 10);
                  // 画券字
                  boldFont = boldFont.deriveFont(40.0f);
                  g2d.setFont(boldFont);
                  g2d.setColor(new Color(255, 255, 255));
                  g2d.drawString("券", quanBGWidht + 8, quanBGHeight + 48);
                  // 券白色底部
                  g2d.fillRoundRect(quanBGWidht + 55, quanBGHeight + 4, 70 + size, 62, 10, 10);
                  // 画券面值
                  g2d.setFont(boldFont);
                  g2d.setColor(new Color(229, 0, 92));
                  g2d.drawString("¥ " + withNoZera + "", quanBGWidht + 70, quanBGHeight + 48);
               }
            }
         }
         g2d.setColor(new Color(247, 247, 247));
         g2d.fillRect(50, 1070, 1320, 214);
         // 画二维码
         BufferedImage qrcodeImage = ImageIO.read(qrcodeStream);
         qrcodeImage = ImageUtil.zoomInImage(qrcodeImage, 170, 170);
         g2d.drawImage(qrcodeImage, 70, 1092, null);
         // 画头像
         if (portrait != null) {
            BufferedImage portraitImg = ImageIO.read(portrait);
            // 放缩大小
            portraitImg = ImageUtil.zoomInImage(portraitImg, 40, 40);
            // 圆角
            portraitImg = ImageUtil.roundImage(portraitImg, 10);
            g2d.drawImage(portraitImg, 70 + (qrcodeImage.getWidth() - portraitImg.getWidth()) / 2,
                  1092 + (qrcodeImage.getHeight() - portraitImg.getHeight()) / 2, null);
         }
         font = font.deriveFont(50.0f);
         g2d.setFont(font);
         g2d.setColor(new Color(229, 0, 93));
         g2d.setColor(new Color(102, 102, 102));
         g2d.drawString("长按识别二维码免费领券", 312, 1150);
         g2d.setColor(new Color(102, 102, 102));
         g2d.drawString("共", 1000, 1150);
         g2d.setColor(new Color(229, 0, 93));
         g2d.drawString(goodsList.size() + "", 1055, 1150);
         g2d.setColor(new Color(102, 102, 102));
         g2d.drawString("个商品", 1090, 1150);
         // 提示语
         BufferedImage tips = ImageIO
               .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/share/tips1.png"));
         tips = ImageUtil.zoomInImage(tips, 850, 65);
         g2d.drawImage(tips, 312, 1190, null);
         g2d.dispose();
         ByteArrayOutputStream aos = new ByteArrayOutputStream();
         ImageIO.write(targetImg, "JPEG", aos);
         InputStream is = new ByteArrayInputStream(aos.toByteArray());
         return is;
      } catch (Exception e) {
         try {
            LogHelper.errorDetailInfo(e);
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      }
      return null;
   }
   // 画商品分享图
   public static InputStream drawGoodsShareImgHCJ(InputStream qrcodeStream, InputStream portrait,
         TaoBaoGoodsBrief goods) throws Exception {
      String fontPath = "/usr/share/fonts/PingFang_Medium.ttf";
      String os = System.getProperty("os.name");
      if (os.toLowerCase().startsWith("win")) {
         fontPath = "D:/PingFang_Medium.ttf";
      }
      String fontBoldPath = "/usr/share/fonts/PingFang_Heavy_0.ttf";
      if (os.toLowerCase().startsWith("win")) {
         fontBoldPath = "D:/PingFang_Heavy_0.ttf";
      }
      Font font = null;
      Font boldFont = null;
      font = Font.createFont(Font.PLAIN, new File(fontPath)).deriveFont(28.0f);
      boldFont = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(28.0f);
      final BufferedImage targetImg = new BufferedImage(720, 1280, BufferedImage.TYPE_INT_RGB);
      HashMap<Key, Object> mapH = new HashMap<Key, Object>();
      mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
      mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
      final Graphics2D g2d = (Graphics2D) targetImg.getGraphics();
      g2d.setRenderingHints(mapH);
      g2d.setColor(Color.WHITE);
      g2d.fillRect(0, 0, 720, 1280);
      g2d.setFont(font.deriveFont(28.0f));
      // 画广告语
      InputStream adTitle = ImageUtil.class.getClassLoader().getResourceAsStream("image/hcj_share_title_icon.png");
      if (adTitle != null) {
         BufferedImage adTitleImage = ImageIO.read(adTitle);
         g2d.drawImage(adTitleImage, 192, 101, null);
      }
      // 画商品主图
      InputStream goodsPicture = TaoBaoHttpUtil.getAsInputStream(goods.getPictUrl().replace("https://", "http://"));
      BufferedImage picImage = ImageIO.read(goodsPicture);
      picImage = zoomInImage(picImage, 620, 620);
      g2d.drawImage(picImage, 50, 207, null);
      // 画价格
      BigDecimal money = TaoBaoUtil.getAfterUseCouplePrice(goods);
      money = MoneyBigDecimalUtil.getWithNoZera(money);
      g2d.setColor(new Color(240, 66, 66));
      g2d.setFont(boldFont.deriveFont(30.0f));
      g2d.drawString("¥", 62, 900);
      g2d.setFont(boldFont.deriveFont(56.0f));
      g2d.drawString(money.toString(), 90, 900);
      g2d.setFont(font.deriveFont(56.0f));
      g2d.setColor(new Color(153, 153, 153));
      if (!StringUtil.isNullOrEmpty(goods.getCouponInfo())) {
         // 画天猫价或者淘宝价
         String zkPriceName = "";
         if (goods.getUserType() == 0)
            zkPriceName = "淘宝价  ¥ " + MoneyBigDecimalUtil.getWithNoZera(goods.getZkPrice());
         else
            zkPriceName = "天猫价  ¥ " + MoneyBigDecimalUtil.getWithNoZera(goods.getZkPrice());
         font = font.deriveFont(30.0f);
         g2d.setFont(font);
         g2d.drawString(zkPriceName, 56, 955);
         // 画券右侧
         BufferedImage quanRight = ImageIO
               .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/hcj_quan_right.png"));
         g2d.setColor(new Color(241, 66, 66));
         g2d.drawImage(quanRight, 670 - quanRight.getWidth(), 867, null);
         // 画券的内容
         g2d.setColor(new Color(241, 66, 66));
         String quanString = " ¥ " + MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount()) + " 券 ";
         font = font.deriveFont(44.0f);
         g2d.setFont(font);
         FontMetrics fm = g2d.getFontMetrics(font);
         int textLength = fm.stringWidth(quanString);
         g2d.fillRect(670 - quanRight.getWidth() - textLength, 872, textLength, 80);
         g2d.setColor(Color.WHITE);
         g2d.setFont(font);
         g2d.drawString(quanString, 670 - quanRight.getWidth() - textLength, 927);
         // 画券左侧
         BufferedImage quanLeft = ImageIO
               .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/hcj_quan_left.png"));
         g2d.drawImage(quanLeft, 670 - quanRight.getWidth() - textLength - quanLeft.getWidth(), 867, null);
      }
      InputStream userTypeIcon;
      if (goods.getUserType() == 0)// 淘宝
      {
         userTypeIcon = ImageUtil.class.getClassLoader().getResourceAsStream("image/hcj_icon_tb.png");
      } else {
         userTypeIcon = ImageUtil.class.getClassLoader().getResourceAsStream("image/hcj_icon_tm.png");
      }
      g2d.drawImage(ImageIO.read(userTypeIcon), 63, 1022, null);
      String title = goods.getTitle();
      // 商品标题
      font = font.deriveFont(30.0f);
      g2d.setFont(font);
      int length = getTextLengthByWidth(g2d, font, title, 290, 8);
      g2d.setColor(new Color(153, 153, 153));
      int row = 0;
      // 画第一排
      g2d.drawString(title.substring(0, length), 20 + 50 + 46, 1044 + row * 40);
      if (length < title.length())
         title = title.substring(length);
      else
         title = "";
      // 判断是否画完
      row++;
      while (title.length() > 0) {
         length = getTextLengthByWidth(g2d, font, title, 330, 10);
         g2d.drawString(title.substring(0, length), 63, 1044 + row * 40);
         title = title.substring(length);
         row++;
      }
      // 画边框
      InputStream erCodeSide = ImageUtil.class.getClassLoader().getResourceAsStream("image/hcj_ercode_side.png");
      BufferedImage erCodeSideImage = ImageIO.read(erCodeSide);
      erCodeSideImage = zoomInImage(erCodeSideImage, 200, 200);
      g2d.drawImage(erCodeSideImage, 466, 986, null);
      // 画二维码
      BufferedImage qrcodeImage = ImageIO.read(qrcodeStream);
      qrcodeImage = zoomInImage(qrcodeImage, 170, 170);
      g2d.drawImage(qrcodeImage, 481, 1000, null);
      // 画头像
      if (portrait != null) {
         BufferedImage portraitImg = ImageIO.read(portrait);
         portraitImg = zoomInImage(portraitImg, 30, 30);
         g2d.drawImage(portraitImg, 481 + (qrcodeImage.getWidth() - portraitImg.getWidth()) / 2,
               1000 + (qrcodeImage.getHeight() - portraitImg.getHeight()) / 2, null);
      }
      font = font.deriveFont(22.0f);
      g2d.setFont(font);
      g2d.setColor(new Color(241, 66, 66));
      FontMetrics fm = g2d.getFontMetrics(font);
      int textLength = fm.stringWidth("海草街提醒您");
      g2d.drawString("海草街提醒您", 481 + (qrcodeImage.getWidth() - textLength) / 2, 1220);
      g2d.setColor(new Color(102, 102, 102));
      fm = g2d.getFontMetrics(font);
      textLength = fm.stringWidth("长按识别二维码");
      g2d.drawString("长按识别二维码", 481 + (qrcodeImage.getWidth() - textLength) / 2, 1255);
      g2d.dispose();
      ByteArrayOutputStream aos = new ByteArrayOutputStream();
      ImageIO.write(targetImg, "JPEG", aos);
      InputStream is = new ByteArrayInputStream(aos.toByteArray());
      return is;
   }
   private static int[] computeCropPosition(BufferedImage source, int width, int height) {
      int[] cropParams = new int[4];
      int owidth = source.getWidth();
      int oheight = source.getHeight();
      if (oheight * width - owidth * height > 0) {
         cropParams[0] = 0;
         cropParams[1] = (oheight - height) / 2;
         cropParams[2] = owidth;
         cropParams[3] = cropParams[2] * height / width;
      } else {
         cropParams[0] = (owidth - width) / 2;
         cropParams[1] = 0;
         cropParams[3] = oheight;
         cropParams[2] = cropParams[3] * width / height;
      }
      return cropParams;
   }
   public static BufferedImage crop(BufferedImage source, int startX, int startY, int w, int h) {
      int width = source.getWidth();
      int height = source.getHeight();
      if (startX <= -1) {
         startX = 0;
      }
      if (startY <= -1) {
         startY = 0;
      }
      if (w <= -1) {
         w = width - 1;
      }
      if (h <= -1) {
         h = height - 1;
      }
      BufferedImage result = new BufferedImage(w, h, source.getType());
      for (int y = startY; y < h + startY; y++) {
         for (int x = startX; x < w + startX; x++) {
            int rgb = source.getRGB(x, y);
            result.setRGB(x - startX, y - startY, rgb);
         }
      }
      return result;
   }
   public static BufferedImage zoomInImage(BufferedImage originalImage, int width, int height) {
      int type = originalImage.getType();
      if (type == 0)
         type = 5;
      BufferedImage newImage = new BufferedImage(width, height, type);
      Graphics g = newImage.getGraphics();
      g.drawImage(originalImage, 0, 0, width, height, null);
      g.dispose();
      return newImage;
   }
   // 邀请好友图片
   public static void inviteFriendImg(InputStream urlInputStream, InputStream portraitInputStream,
         InputStream erCodeInputStream, String targetPath, String inviteCode) throws IOException {
      inviteFriendImg(urlInputStream, portraitInputStream, erCodeInputStream, targetPath, 260, 908, 230, inviteCode);
   }
   /**
    *
    * @param urlInputStream
    * @param portraitInputStream
    * @param erCodeInputStream
    * @param targetPath
    * @param pX                  -二维码的横坐标
    * @param pY                  -二维码的纵坐标
    * @param size                -二维码的尺寸
    * @param inviteCode          -邀请码
    * @throws IOException
    */
   // 邀请好友图片
   public static void inviteFriendImg(InputStream urlInputStream, InputStream portraitInputStream,
         InputStream erCodeInputStream, String targetPath, int pX, int pY, int size, String inviteCode)
         throws IOException {
      BufferedImage bgImage = ImageIO.read(urlInputStream);
      final BufferedImage targetImg = new BufferedImage(bgImage.getWidth(), bgImage.getHeight(),
            BufferedImage.TYPE_INT_RGB);
      HashMap<Key, Object> mapH = new HashMap<Key, Object>();
      mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
      mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
      // 画 背景图片
      final Graphics2D g2d = targetImg.createGraphics();
      g2d.drawImage(bgImage, 0, 0, bgImage.getWidth(), bgImage.getHeight(), null);
      // 画 二维码
      BufferedImage qrCodeImage = ImageIO.read(erCodeInputStream);
      qrCodeImage = ImageUtil.qrCodeImage(g2d, qrCodeImage, pX, pY, size, size); // 二维码长宽
      // 230*230
      // 画 头像
      BufferedImage portraitImg = ImageIO.read(portraitInputStream);
      int portraitSize = size * 5 / 23;
      int pPX = pX + size / 2 - portraitSize / 2;
      int pPY = pY + size / 2 - portraitSize / 2;
      portraitImg = ImageUtil.portraitImg(g2d, portraitImg, pPX, pPY, portraitSize, portraitSize);// 头像长宽
      // 画邀请码(邀请码的大小与字体固定)
      if (!StringUtil.isNullOrEmpty(inviteCode)) {
         String st = "邀请码:" + inviteCode;
         int width = bgImage.getWidth();
         String os = System.getProperty("os.name");
         String fontBoldPath = "/usr/share/fonts/PingFang_Medium.ttf";
         if (os.toLowerCase().startsWith("win")) {
            fontBoldPath = "D:/PingFang_Medium.ttf";
         }
         Font boldFont = null;
         try {
            boldFont = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(36.0f);
         } catch (FontFormatException e) {
            e.printStackTrace();
         }
         g2d.setFont(boldFont);
         g2d.setColor(new Color(0, 0, 0));
         FontMetrics fm = g2d.getFontMetrics(boldFont);
         int textLength = fm.stringWidth(st);
         int ax = (width - textLength) / 2;
         int ay = bgImage.getHeight() - 92 + boldFont.getSize() / 2 - 5;
         g2d.setColor(new Color(0, 0, 0));
         g2d.drawString(st, ax, ay);
      }
      OutputStream out = new FileOutputStream(new File(targetPath));
      ImageIO.write(targetImg, "JPEG", out);
      out.flush();
      out.close();
   }
   // 二维码
   public static BufferedImage qrCodeImage(Graphics2D g2d, BufferedImage originalImage, int pX, int pY, int width,
         int height) {
      g2d.drawImage(originalImage, pX, pY, width, height, null);
      return originalImage;
   }
   // 头像
   public static BufferedImage portraitImg(Graphics2D g2d, BufferedImage originalImage, int pX, int pY, int width,
         int height) {
      g2d.drawImage(originalImage, pX, pY, width, height, null);
      return originalImage;
   }
   public static BufferedImage roundImage(BufferedImage srcImage, int cornerRadius) { // 半径
      int width = srcImage.getWidth();
      int height = srcImage.getHeight();
      BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
      Graphics2D gs = image.createGraphics();
      HashMap<Key, Object> mapH = new HashMap<Key, Object>();
      mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
      mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
      gs.setRenderingHints(mapH);
      gs.setClip(new RoundRectangle2D.Double(0, 0, width, height, cornerRadius, cornerRadius));
      gs.drawImage(srcImage, 0, 0, null);
      gs.dispose();
      return image;
   }
   public static int saveToImgByInputStream(InputStream inputStream, String imgPath, String imgName) {
      int stateInt = 1;
      try {
         File file = new File(imgPath, imgName);// 可以是任何图片格式.jpg,.png等
         FileOutputStream fos = new FileOutputStream(file);
         FileInputStream fis = (FileInputStream) inputStream;
         byte[] b = new byte[1024];
         int nRead = 0;
         while ((nRead = fis.read(b)) != -1) {
            fos.write(b, 0, nRead);
         }
         fos.flush();
         fos.close();
         fis.close();
      } catch (Exception e) {
         stateInt = 0;
         e.printStackTrace();
      } finally {
      }
      return stateInt;
   }
   public static int getTextLengthByWidth(Graphics2D g2d, Font font, String content, int maxWidth, int startPos) {
      FontMetrics fm = g2d.getFontMetrics(font);
      for (int i = startPos; i < content.length(); i++) {
         if (fm.stringWidth(content.substring(0, i)) >= maxWidth)
            return i + 1;
      }
      return content.length();
   }
   public static int[] getImgWidthAndHeight(String imgUrl) throws MalformedURLException, IOException {
      if (StringUtil.isNullOrEmpty(imgUrl))
         return new int[] { 0, 0 };
      if (imgUrl.toLowerCase().endsWith("webp"))
         return getImgWidthAndHeightWithWebp(imgUrl);
      else
         return getImgWidthAndHeightWithPngAndJpg(imgUrl);
   }
   public static int[] getImgWidthAndHeightWithPngAndJpg(String imgUrl) throws MalformedURLException, IOException {
      InputStream murl = new URL(imgUrl).openStream();
      BufferedImage sourceImg = ImageIO.read(murl);
      int width = sourceImg.getWidth();
      int height = sourceImg.getHeight();
      return new int[] { width, height };
   }
   public static int[] getImgWidthAndHeightWithWebp(String imgUrl) throws MalformedURLException, IOException {
      String cacheFile = FileUtil.getCacheDir();
      String targetPath = cacheFile + "/CACHE_DOWNLOAD_IMG_" + System.currentTimeMillis() + "_"
            + (long) (Math.random() * 1000000000L);
      HttpUtil.downloadFile(imgUrl, targetPath);
      FileInputStream file = new FileInputStream(targetPath);
      byte[] bytes = new byte[30];
      file.read(bytes, 0, bytes.length);
      int width = ((int) bytes[27] & 0xff) << 8 | ((int) bytes[26] & 0xff);
      int height = ((int) bytes[29] & 0xff) << 8 | ((int) bytes[28] & 0xff);
      file.close();
      return new int[] { width, height };
   }
   /**
    * 头像加白底图 邀请好友图片
    *
    * @param urlInputStream
    * @param portraitInputStream
    * @param erCodeInputStream
    * @param targetPath
    * @param inviteCode
    * @throws IOException
    */
   public static void inviteFriendImgWhite(InputStream urlInputStream, InputStream portraitInputStream,
         InputStream erCodeInputStream, String targetPath, String inviteCode) throws IOException {
      inviteFriendImgWhite(urlInputStream, portraitInputStream, erCodeInputStream, targetPath, 260, 908, 230,
            inviteCode);
   }
   /**
    * 头像加白底图 邀请好友图片 -自定义二维码位置
    *
    * @param urlInputStream
    * @param portraitInputStream
    * @param erCodeInputStream
    * @param targetPath
    * @param inviteCode
    * @throws IOException
    */
   public static void inviteFriendImgWhitecustom(InputStream urlInputStream, InputStream portraitInputStream,
         InputStream erCodeInputStream, String targetPath, Integer pX, Integer pY, Integer size, String inviteCode)
         throws IOException {
      inviteFriendImgWhite(urlInputStream, portraitInputStream, erCodeInputStream, targetPath, pX, pY, size,
            inviteCode);
   }
   /**
    * 邀请好友图片加上头像加上白底
    */
   public static void inviteFriendImgWhite(InputStream urlInputStream, InputStream portraitInputStream,
         InputStream erCodeInputStream, String targetPath, Integer pX, Integer pY, Integer size, String inviteCode)
         throws IOException {
      if (pX == null) {
         pX = 260;
      }
      if (pY == null) {
         pY = 908;
      }
      if (size == null) {
         size = 230;
      }
      BufferedImage bgImage = ImageIO.read(urlInputStream);
      final BufferedImage targetImg = new BufferedImage(bgImage.getWidth(), bgImage.getHeight(),
            BufferedImage.TYPE_INT_RGB);
      HashMap<Key, Object> mapH = new HashMap<Key, Object>();
      mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
      mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
      // 画 背景图片
      final Graphics2D g2d = targetImg.createGraphics();
      g2d.drawImage(bgImage, 0, 0, bgImage.getWidth(), bgImage.getHeight(), null);
      g2d.setRenderingHints(mapH);
      // 画 二维码
      BufferedImage qrCodeImage = ImageIO.read(erCodeInputStream);
      qrCodeImage = ImageUtil.qrCodeImage(g2d, qrCodeImage, pX, pY, size, size);
      int portraitSize = size * 5 / 23;
      int pPX = pX + size / 2 - portraitSize / 2;
      int pPY = pY + size / 2 - portraitSize / 2;
      // 头像白色边框
      g2d.fillRoundRect(pPX - 4, pPY - 4, portraitSize + 8, portraitSize + 8, 5, 5);
      g2d.setRenderingHints(mapH);
      // 画 头像
      BufferedImage portraitImg = ImageIO.read(portraitInputStream);
      portraitImg = ImageUtil.zoomInImage(portraitImg, portraitSize, portraitSize);
      portraitImg = ImageUtil.roundImage(portraitImg, 10);
      g2d.drawImage(portraitImg, pPX, pPY, portraitSize, portraitSize, null);
      // 画邀请码(邀请码的大小与字体固定)
      if (!StringUtil.isNullOrEmpty(inviteCode)) {
         int ax = pX - (inviteCode.length() - 4) * 13;
         int ay = pY + size + 118;
         int width_diap = 235 + (int) (24.6 * (inviteCode.length() - 4));
         g2d.setColor(Color.white);
         // 画出一个矩形
         g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.65f)); // 透明度
         g2d.fillRect(ax, ay - 38, width_diap, 50);
         // 前半圆
         g2d.fillArc(ax - 25, ay - 38, 50, 50, 90, 180);
         // 后半圆
         g2d.fillArc(ax + width_diap - 25, ay - 38, 50, 50, 270, 180);
         g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR, 1f));
         String st = "邀请码:" + inviteCode;
         String os = System.getProperty("os.name");
         String fontBoldPath = "/usr/share/fonts/PingFang_Medium.ttf";
         if (os.toLowerCase().startsWith("win")) {
            fontBoldPath = "C:/PingFang_Medium.ttf";
         }
         Font boldFont = null;
         try {
            boldFont = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(36.0f);
         } catch (FontFormatException e) {
            e.printStackTrace();
         }
         g2d.setFont(boldFont);
         g2d.getFontMetrics(boldFont);
         g2d.setColor(new Color(0, 0, 0));
         g2d.setColor(new Color(0, 0, 0));
         g2d.drawString(st, ax, ay);
      }
      OutputStream out = new FileOutputStream(new File(targetPath));
      ImageIO.write(targetImg, "JPEG", out);
      out.flush();
      out.close();
   }
   /**
    * 绘制邀请问候图
    *
    * @param bgPigInStream    背景图
    * @param portraitInStream 用户头像
    * @param erCodeInStream   二维码
    * @param targetPath       路径
    * @param inviteCode       邀请码
    * @param content          文字内容
    * @param date             显示日历
    * @throws IOException
    */
   public static void drawInviteToGreet(InputStream bgPigInStream, InputStream portraitInStream,
         InputStream erCodeInStream, String targetPath, String inviteCode, String content, Date date)
         throws IOException {
      // 背景图片
      BufferedImage bgImage = ImageIO.read(bgPigInStream);
      final BufferedImage targetImg = new BufferedImage(bgImage.getWidth(), bgImage.getHeight(),
            BufferedImage.TYPE_INT_RGB);
      HashMap<Key, Object> mapH = new HashMap<Key, Object>();
      mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
      mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
      // 画 背景图片
      final Graphics2D g2d = targetImg.createGraphics();
      g2d.drawImage(bgImage, 0, 0, bgImage.getWidth(), bgImage.getHeight(), null);
      g2d.setRenderingHints(mapH);
      g2d.setBackground(Color.WHITE);
      // 画 蒙层
      BufferedImage mengCeng = ImageIO
            .read(ImageUtil.class.getClassLoader().getResourceAsStream("image/invite/mc.png"));
      g2d.drawImage(mengCeng, 0, bgImage.getHeight() / 2, bgImage.getWidth(), bgImage.getHeight() / 2, null);
      int width = bgImage.getWidth();
      int height = bgImage.getHeight();
      int pX = width - 250;
      int pY = height - 290; // 320
      int size = 210; // 230
      // 画 二维码
      BufferedImage qrCodeImage = ImageIO.read(erCodeInStream);
      qrCodeImage = qrCodeImage(g2d, qrCodeImage, pX, pY, size, size); // 二维码长宽
      // 230*230
      // 画 头像
      int portraitSize = size * 5 / 23;
      int pPX = pX + size / 2 - portraitSize / 2;
      int pPY = pY + size / 2 - portraitSize / 2;
      // 头像白色边框
      g2d.fillRoundRect(pPX - 4, pPY - 4, portraitSize + 8, portraitSize + 8, 5, 5);
      g2d.setRenderingHints(mapH);
      BufferedImage portraitImg = ImageIO.read(portraitInStream);
      portraitImg = ImageUtil.zoomInImage(portraitImg, portraitSize, portraitSize);
      portraitImg = ImageUtil.roundImage(portraitImg, 10);
      g2d.drawImage(portraitImg, pPX, pPY, portraitSize, portraitSize, null);
      // 字体白色
      Color color = new Color(255, 255, 255);
      String os = System.getProperty("os.name");
      String fontBoldPath = "/usr/share/fonts/yahei.ttf";
      if (os.toLowerCase().startsWith("win")) {
         fontBoldPath = "C:/yahei.ttf";
      }
      Font boldFont = null;
      // 画邀请码(邀请码的大小与字体固定)
      if (!StringUtil.isNullOrEmpty(inviteCode)) {
         String st = "邀请码:" + inviteCode;
         try {
            boldFont = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(32.0f);
         } catch (FontFormatException e) {
            e.printStackTrace();
         }
         g2d.setFont(boldFont);
         g2d.setColor(new Color(255, 255, 255));
         FontMetrics fm = g2d.getFontMetrics(boldFont);
         int textLength = fm.stringWidth(st);
         int ax = (width - textLength) - 30;
         int ay = bgImage.getHeight() - 50 + boldFont.getSize() / 2 - 5;
         g2d.setColor(new Color(255, 255, 255));
         g2d.drawString(st, ax, ay);
      }
      // 左边距
      int padding_left = 30;
      // 日历
      try {
         if (date == null) {
            date = new Date();
         }
         boldFont = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(36.0f);
         g2d.setFont(boldFont);
         g2d.setColor(color);
         g2d.setRenderingHints(mapH);
         DateInfo dateInfo = DateLunarUtil.getDateInfo(date);
         // 农历
         g2d.drawString(dateInfo.getLunar_month() + dateInfo.getLunar_day(), padding_left, height - 80);
         // 天干地支
         g2d.drawString(dateInfo.getAgenary_month() + " " + dateInfo.getAgenary_day(), padding_left, height - 140);
         // 当前日期
         Font boldFontMax = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(100.0f);
         g2d.setFont(boldFontMax);
         if (dateInfo.getDay() < 10) {
            g2d.drawString("0" + dateInfo.getDay().toString(), padding_left, height - 200);
         } else {
            g2d.drawString(dateInfo.getDay().toString(), padding_left, height - 200);
         }
         String theDate = "";
         if (dateInfo.getMonth() < 10) {
            theDate = "/0";
         } else {
            theDate = "/";
         }
         theDate += dateInfo.getMonth() + "/" + dateInfo.getYear() + " " + dateInfo.getWeekDay();
         g2d.setFont(boldFont);
         g2d.drawString(theDate, padding_left + boldFontMax.getSize() + 15, height - 200);
      } catch (Exception e) {
         e.printStackTrace();
      }
      if (!StringUtil.isNullOrEmpty(content)) {
         // 文字内容
         try {
            boldFont = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(36.0f);
            g2d.setFont(boldFont);
            g2d.setColor(color);
            g2d.setRenderingHints(mapH);
            int lineHeight = 70;
            int lineTextLength = 19;
            if (content.length() <= lineTextLength) {
               g2d.drawString(content, padding_left, height - 350);
            } else {
               String text = "";
               int mod = content.length() % lineTextLength;
               if (mod == 0) {
                  text = content.substring(content.length() - lineTextLength, content.length());
                  content = content.substring(0, content.length() - lineTextLength);
               } else {
                  text = content.substring(content.length() - mod, content.length());
                  content = content.substring(0, content.length() - mod);
               }
               g2d.drawString(text, padding_left, height - 350);
               int i = 1;
               while (true) {
                  if (content.length() <= 17) {
                     g2d.drawString(content, padding_left, height - 350 - lineHeight * i);
                     break;
                  } else {
                     text = content.substring(content.length() - lineTextLength, content.length());
                     content = content.substring(0, content.length() - lineTextLength);
                     g2d.drawString(text, padding_left, height - 350 - lineHeight * i);
                     i++;
                  }
               }
            }
         } catch (Exception e) {
            e.printStackTrace();
         }
      }
      OutputStream out = new FileOutputStream(new File(targetPath));
      ImageIO.write(targetImg, "JPEG", out);
      out.flush();
      out.close();
   }
   public static InputStream drawAlipayImage(InputStream bg, String recieveTime, String money, String orderNo,
         String ttf) {
      try {
         String fontPath = "/usr/share/fonts/PingFang_Medium.ttf";
         String os = System.getProperty("os.name");
         if (os.toLowerCase().startsWith("win")) {
            fontPath = ttf;
         }
         String fontBoldPath = "/usr/share/fonts/PingFang_Heavy_0.ttf";
         if (os.toLowerCase().startsWith("win")) {
            fontBoldPath = "D:/PingFang_Heavy_0.ttf";
         }
         int px = 1080; // 图片宽度
         int py = 2340; // 图片高度
         final BufferedImage targetImg = new BufferedImage(px, py, BufferedImage.TYPE_INT_RGB);
         HashMap<Key, Object> mapH = new HashMap<Key, Object>();
         mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
         mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
         final Graphics2D g2d = (Graphics2D) targetImg.getGraphics();
         g2d.setRenderingHints(mapH);
         g2d.setColor(Color.decode("#333333"));
         g2d.fillRect(0, 0, px, py);
         BufferedImage bgImage = ImageIO.read(bg);
         g2d.drawImage(bgImage, null, 0, 0);
         Font font = Font.createFont(Font.PLAIN, new File(fontPath)).deriveFont(87.0f);
         g2d.setFont(font);
         // 画金额
         FontMetrics fm = g2d.getFontMetrics(font);
         fm.stringWidth(money);
         g2d.drawString(money, (px - fm.stringWidth(money)) / 2, 359 + 65);
         // 画创建时间
         // 画订单
         g2d.dispose();
         ByteArrayOutputStream aos = new ByteArrayOutputStream();
         ImageIO.write(targetImg, "JPEG", aos);
         return new ByteArrayInputStream(aos.toByteArray());
      } catch (Exception e) {
         e.printStackTrace();
         try {
            LogHelper.errorDetailInfo(e);
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      }
      return null;
   }
   public static InputStream drawSimpleImage(InputStream bg, int width, int height, InputStream imgStream,
         int imgWidth, int imgHeight, int px, int py) {
      try {
         final BufferedImage targetImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
         HashMap<Key, Object> mapH = new HashMap<Key, Object>();
         mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
         mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
         final Graphics2D g2d = (Graphics2D) targetImg.getGraphics();
         g2d.setRenderingHints(mapH);
         g2d.setColor(Color.decode("#333333"));
         g2d.fillRect(0, 0, px, py);
         BufferedImage bgImage = ImageIO.read(bg);
         g2d.drawImage(bgImage, null, 0, 0);
         BufferedImage img = zoomInImage(ImageIO.read(imgStream), imgWidth, imgHeight);
         g2d.drawImage(img, px, py, null);
         g2d.dispose();
         ByteArrayOutputStream aos = new ByteArrayOutputStream();
         ImageIO.write(targetImg, "JPEG", aos);
         return new ByteArrayInputStream(aos.toByteArray());
      } catch (Exception e) {
         e.printStackTrace();
         try {
            LogHelper.errorDetailInfo(e);
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      }
      return null;
   }
   public static InputStream drawActivityShareImg(InputStream banner, float bannerRate, String title, String desc,
         InputStream erCode) {
      // 计算高度
      int width = 750;
      int height = 116;
      int bannerWidth = 640;
      int bannerHeight = (int) (bannerWidth / bannerRate);
      height += bannerHeight;
      height += 524;
      try {
         final BufferedImage targetImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
         HashMap<Key, Object> mapH = new HashMap<Key, Object>();
         mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
         mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
         final Graphics2D g2d = (Graphics2D) targetImg.getGraphics();
         g2d.setRenderingHints(mapH);
         g2d.setColor(Color.decode("#FF6940"));
         g2d.fillRect(0, 0, width, height);
         // 画logo
         g2d.drawImage(zoomInImage(
               ImageIO.read(ImageUtil.class.getClassLoader().getResource("image/activityShare/icon_logo.png")), 59,
               59), 346, 17, null);
         // 画banner背景
         g2d.setColor(Color.decode("#FFFFFF"));
         g2d.fillRect(30, 94, 692, bannerHeight + 22);
         // 画banner
         g2d.drawImage(roundImage( zoomInImage(ImageIO.read(banner), bannerWidth, bannerHeight),20), 55, 116, null);
         // 画二维码背景
         g2d.drawImage(
               ImageIO.read(
                     ImageUtil.class.getClassLoader().getResource("image/activityShare/qrcode_content_bg.png")),
               27, bannerHeight + 116, null);
         // 画二维码
         g2d.drawImage(zoomInImage(ImageIO.read(erCode), 230, 230), 260, 116 + bannerHeight + 171, null);
         // 画文字
         g2d.setColor(Color.decode("#F03143"));
         String fontBoldPath = "/usr/share/fonts/yahei_bold.ttf";
         String os = System.getProperty("os.name");
         if (os.toLowerCase().startsWith("win")) {
            fontBoldPath = "C:/Users/Administrator/Desktop/fonts/yahei_bold.ttf";
         }
         String fontPath = "/usr/share/fonts/yahei.ttf";
         if (os.toLowerCase().startsWith("win")) {
            fontPath = "C:/Users/Administrator/Desktop/fonts/yahei.ttf";
         }
         Font boldFont = Font.createFont(Font.PLAIN, new File(fontBoldPath)).deriveFont(48.0f);
         g2d.setFont(boldFont);
         FontMetrics fm = g2d.getFontMetrics(boldFont);
         int textLength = fm.stringWidth(title);
         g2d.drawString(title, (width - textLength) / 2, 116 + bannerHeight + 50 + 45);
         textLength = fm.stringWidth(desc);
         g2d.drawString(desc, (width - textLength) / 2, 116 + bannerHeight + 50 + 50 + 45);
         Font font = Font.createFont(Font.PLAIN, new File(fontPath)).deriveFont(24.0f);
         g2d.setFont(font);
         g2d.setColor(Color.decode("#666666"));
         fm = g2d.getFontMetrics(font);
         textLength = fm.stringWidth("长按识别二维码 查看详情");
         g2d.drawString("长按识别二维码 查看详情", (width - textLength) / 2, 116 + bannerHeight + 428+10);
         g2d.dispose();
         ByteArrayOutputStream aos = new ByteArrayOutputStream();
         ImageIO.write(targetImg, "JPEG", aos);
         return new ByteArrayInputStream(aos.toByteArray());
      } catch (Exception e) {
         e.printStackTrace();
         try {
            LogHelper.errorDetailInfo(e);
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      }
      return null;
   }
   /**
    * 安卓-支付宝画图
    * @param money
    * @param orderNo
    * @param time
    * @param targetPath
    * @return
    * @throws IOException
    */
   public static InputStream drawAlipayAndroid(BigDecimal money, String orderNo, String time) throws IOException {
      String bgpic = "image/alipay/android.png";
      BufferedImage bgImage = ImageIO.read(ImageUtil.class.getClassLoader().getResourceAsStream(bgpic));
      final BufferedImage targetImg = new BufferedImage(bgImage.getWidth(), bgImage.getHeight(), BufferedImage.TYPE_INT_RGB);
      HashMap<Key, Object> mapH = new HashMap<Key, Object>();
      mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
      mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
      // 画 背景图片
      final Graphics2D g2d = targetImg.createGraphics();
      g2d.setRenderingHints(mapH);
      g2d.drawImage(bgImage, 0, 0, bgImage.getWidth(), bgImage.getHeight(), null);
      g2d.setBackground(Color.BLACK);
      // 字体
      String os = System.getProperty("os.name");
      String fontRob0to = "/usr/share/fonts/ROBOTO-REGULAR.TTF";
      String fontBahnschrift = "/usr/share/fonts/BAHNSCHRIFT.TTF";
      if (os.toLowerCase().startsWith("win")) {
         fontRob0to = "D:/ROBOTO-REGULAR.TTF";
         fontBahnschrift = "D:/BAHNSCHRIFT.TTF";
      }
      // 字体大小
      Font font40 = null;
      Font font42 = null;
      Font font86 = null;
      try {
         font40 = Font.createFont(Font.PLAIN, new File(fontRob0to)).deriveFont(40.00f);
         font42 = Font.createFont(Font.PLAIN, new File(fontBahnschrift)).deriveFont(42.00f);
         font86 = Font.createFont(Font.PLAIN, new File(fontRob0to)).deriveFont(86.68f);
      } catch (FontFormatException e) {
         e.printStackTrace();
      }
      /*  时间信息   */
      g2d.setFont(font42);
      g2d.setColor(new Color(247, 247, 247));
      g2d.drawString(TimeUtil.formatHHMM_12H(new Date()), 134, 67);
      /*  资金信息   */
      String moneyInfo = "+" + money.setScale(2);
      // 计算长度
      FontMetrics fm = g2d.getFontMetrics(font86);
      int textLength = fm.stringWidth(moneyInfo);
      // 居中位置
      int x_money =  (bgImage.getWidth() - textLength) / 2 ;
      // 画金额
      g2d.setFont(font86);
      g2d.setColor(new Color(51, 51, 51));
      g2d.drawString(moneyInfo, x_money, 420);
      /*  创建时间信息   */
      FontMetrics fm2 = g2d.getFontMetrics(font40);
      int l_time = fm2.stringWidth(time);
      int x_time =  bgImage.getWidth() - l_time -41  ;
      g2d.setFont(font40);
      g2d.setColor(new Color(51, 51, 51));
      g2d.drawString(time, x_time, 972);
      /*  创建时间信息   */
      int l_order = fm2.stringWidth(orderNo);
      int x_order =  bgImage.getWidth() - l_order -41  ;
      g2d.setFont(font40);
      g2d.setColor(new Color(51, 51, 51));
      g2d.drawString(orderNo, x_order, 1072);
      g2d.dispose();
      ByteArrayOutputStream aos = new ByteArrayOutputStream();
      ImageIO.write(targetImg, "png", aos);
      return new ByteArrayInputStream(aos.toByteArray());
   }
   /**
    * IOS 支付宝画图
    * @param money
    * @param orderNo
    * @param time
    * @param targetPath
    * @return
    * @throws IOException
    */
   public static InputStream drawAlipayIOS(BigDecimal money, String orderNo, String time)
         throws IOException {
      String bgpic = "image/alipay/ios.png";
      BufferedImage bgImage = ImageIO.read(ImageUtil.class.getClassLoader().getResourceAsStream(bgpic));
      final BufferedImage targetImg = new BufferedImage(bgImage.getWidth(), bgImage.getHeight(),
            BufferedImage.TYPE_INT_RGB);
      HashMap<Key, Object> mapH = new HashMap<Key, Object>();
      mapH.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 (抗锯齿总开关)  
      mapH.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);// 文字抗锯齿 
      // 画 背景图片
      final Graphics2D g2d = targetImg.createGraphics();
      g2d.setRenderingHints(mapH);
      g2d.drawImage(bgImage, 0, 0, bgImage.getWidth(), bgImage.getHeight(), null);
      g2d.setBackground(Color.BLACK);
      // 字体
      String os = System.getProperty("os.name");
      String fontHeiTi = "/usr/share/fonts/AdobeHeiTiStd.otf";
      String fontSquare = "/usr/share/fonts/SquareHeitiStd.TTF";
      if (os.toLowerCase().startsWith("win")) {
         fontHeiTi = "D:/AdobeHeiTiStd.otf";
         fontSquare = "D:/SquareHeitiStd.TTF";
      }
      // 字体大小
      Font font40 = null;
      Font font44 = null;
      Font font92 = null;
      try {
         font44 = Font.createFont(Font.PLAIN, new File(fontHeiTi)).deriveFont(44.18f);
         font40 = Font.createFont(Font.PLAIN, new File(fontSquare)).deriveFont(40.00f);
         font92 = Font.createFont(Font.PLAIN, new File(fontSquare)).deriveFont(92.03f);
      } catch (FontFormatException e) {
         e.printStackTrace();
      }
      /* 时间信息 */
      g2d.setFont(font44);
      g2d.setColor(new Color(16, 16, 16));
      MyDrawString(TimeUtil.formatHHMM_12H(new Date()), 82, 82, font44, g2d);
      /* 资金信息 */
      String moneyInfo = "+" + money.setScale(2);
      // 计算长度
      FontMetrics fm = g2d.getFontMetrics(font92);
      int textLength = fm.stringWidth(moneyInfo);
      // 居中位置
      int x_money = (bgImage.getWidth() - textLength) / 2;
      // 画金额
      g2d.setFont(font92);
      g2d.setColor(new Color(51, 51, 51));
      g2d.drawString(moneyInfo, x_money, 480);
      /* 创建时间信息 */
      FontMetrics fm2 = g2d.getFontMetrics(font40);
      int l_time = fm2.stringWidth(time);
      int x_time = bgImage.getWidth() - l_time - 41;
      g2d.setFont(font40);
      g2d.setColor(new Color(51, 51, 51));
      g2d.drawString(time, x_time, 1052);
      /* 创建时间信息 */
      int l_order = fm2.stringWidth(orderNo);
      int x_order = bgImage.getWidth() - l_order - 41;
      g2d.setFont(font40);
      g2d.setColor(new Color(51, 51, 51));
      g2d.drawString(orderNo, x_order, 1160);
      g2d.dispose();
      ByteArrayOutputStream aos = new ByteArrayOutputStream();
      ImageIO.write(targetImg, "png", aos);
      return new ByteArrayInputStream(aos.toByteArray());
   }
   public static void MyDrawString(String str,int x,int y, Font font40, Graphics2D g2d){
      int i = 0;
      int x_next = x;
      String tempStr= null;
      while(str.length()>0)
      {
         tempStr=str.substring(0, 1);
         str=str.substring(1, str.length());
         g2d.drawString(tempStr, x_next, y);
         if (i == 1) {
            x_next += 3 +  22;
         } else if (i == 2) {
            x_next += 10;
         } else {
            x_next += 0 + 22;
         }
         i++;
      }
   }
}