java生成微信小程序分享海报(一)

生成微信小程序分享海报有两种方式,一种是利用H5的canvas,另外一种是通过服务端合并图像生成。我要介绍的是如何通过合并图像生成分享海报。
定义了两个类,分别是SharedImageUtil、PosterInfoUtil。SharedImageUtil是分享朋友圈类;PosterInfoUtil是海报信息类。
两个类的源码如下:

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;



import javax.imageio.*;
import javax.imageio.stream.ImageInputStream;
import java.awt.*;
import java.awt.geom.Area;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
* 分享朋友圈工具类
*/
public class SharedImageUtil {
 private SharedImageUtil() {
     throw new IllegalStateException("Utility class");
 }

 /* 要放置的二维码寬度 */
 public static final int QRCODE_WIDTH = 230;
 /* 要放置的二维码長度 */
 public static final int QRCODE_LENGTH = 230;
 /* 要放置的二维码Y位置 往下为大值,往上为小值 */
 public static final int QRCODE_Y = 1070;
 /*要放置的二维码X位置 往下为大值,往上为小值 */
 public static final int QRCODE_X = 740;
 /* 要放置的头像半径 */
 public static final int PROFILE_RADIUS = 80;
 /* 要放置的头像y坐标 */
 public static final int PROFILE_Y = 1056;
 /* 要放置的头像X坐标 */
 public static final int PROFILE_X = 90;
 /* 昵称的Y位置 */
 public static final int FONT_Y = 1110;
 /*昵称的X位置*/
 public static final int FONT_X = 190;
 /* 推广文案的Y位置 */
 public static final int COPYWRITER_Y = 1200;
 /* 推广文案的X位置 */
 public static final int COPYWRITER_X = 150;
 /* 商店图案Y位置 */
 public static final int SHOP_PIC_Y = 70;
 /*商店图案位置*/
 public static final int SHOP_PIC_X = 93;
 /* 商店图案寬度 */
 public static final int SHOP_PIC_WIDTH = 900;
 /* 商店图案長度 */
 public static final int SHOP_PIC_LENGTH = 950;





 /**
  * 裁剪图片
  *
  * @param img          the img
  * @param originWidth  the origin width
  * @param originHeight the origin height
  * @return the buffered image
  * @throws Exception the exception
  */
 public static BufferedImage cutPicture(BufferedImage img, int originWidth, int originHeight) throws IOException {
     int width = img.getWidth();  // 原图的宽度
     int height = img.getHeight();  //原图的高度

     int newImageX = 0; // 要截图的坐标
     int newImageY = 0; // 要截图的坐标
     if (width > originWidth) {
         newImageX = (width - originWidth) / 2;
     }
     if (height > originHeight) {
         newImageY = height - originHeight;
     }
     return cutJPG(img, newImageX, newImageY, originWidth, originHeight);
 }

 /**
  * 图片拉伸
  *
  * @param originalImage the original image
  * @param originWidth   the origin width
  * @param originHeight  the origin height
  * @return the buffered image
  * @throws Exception the exception
  */
 public static BufferedImage zoomPicture(String originalImage, int originWidth, int originHeight) {

     BufferedImage img = null;
     BufferedImage bufferedImage = null;
     try {
         // 原来的图片
         img = ImageIO.read(new File(originalImage));
         int width = img.getWidth();  // 原图的宽度
         int height = img.getHeight();  //原图的高度

         int scaledWidth = width;
         int scaledHeight = height;
         // 如果不是正方形
         if (width == height) {
             // 按照originHeight进行缩放
             scaledWidth = originHeight;
             scaledHeight = originHeight;
         } else {
             if (width > height) {
                 // 按照originHeight进行缩放
                 scaledWidth = (scaledWidth * originHeight) / scaledHeight;
                 scaledHeight = originHeight;
             } else {
                 // 宽高比例
                 int originPercent = (originHeight * 100) / originWidth;
                 int newPercent = (height * 100) / width;
                 if (newPercent >= originPercent) {
                     // 按照originWidth进行缩放
                     scaledWidth = originWidth;
                     scaledHeight = (originHeight * scaledWidth) / scaledWidth;
                 } else {
                     // 按照originHeight进行缩放
                     scaledWidth = (scaledWidth * originHeight) / scaledHeight;
                     scaledHeight = originHeight;
                 }
             }
         }
         Image schedImage = img.getScaledInstance(scaledWidth, scaledHeight, Image.SCALE_SMOOTH);
         // 新的图片
         bufferedImage = new BufferedImage(scaledWidth, scaledHeight, img.getType());
         Graphics2D g = bufferedImage.createGraphics();
         // 绘制
         g.drawImage(schedImage, 0, 0, null);
         g.dispose();
     } catch (IOException e) {
         e.printStackTrace();
     }

     return bufferedImage;
 }

 /**
  * 进行裁剪操作
  *
  * @param originalImage the original image
  * @param x             the x
  * @param y             the y
  * @param width         the width
  * @param height        the height
  * @return the buffered image
  * @throws IOException the io exception
  */
 public static BufferedImage cutJPG(BufferedImage originalImage, int x, int y, int width, int height) throws IOException {
     Iterator<ImageReader> iterator = ImageIO.getImageReadersByFormatName("jpg");
     ImageReader reader = iterator.next();
     // 转换成字节流
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
     // writeToJPEG(1080,originalImage,0.5f,outputStream);
     ImageIO.write(originalImage, "jpg", outputStream);
     InputStream is = new ByteArrayInputStream(outputStream.toByteArray());
     ImageInputStream iis = ImageIO.createImageInputStream(is);
     reader.setInput(iis, true);
     ImageReadParam param = reader.getDefaultReadParam();
     Rectangle rect = new Rectangle(x, y, width, height);
     param.setSourceRegion(rect);
     return reader.read(0, param);
 }

 public static BufferedImage mergePicture(BufferedImage baseLayer,
                                          BufferedImage topLayer,
                                          String nickName,
                                          Integer locationX,
                                          Integer locationY,
                                          Integer size) throws IOException {

     return  mergePicture(baseLayer,topLayer,nickName,locationX,locationY,size,size);
 }
 /**
  * 合并头像和昵称
  *
  * @param baseLayer
  * @param topLayer
  * @param nickName
  * @param locationX
  * @param locationY
  * @param locationWidth
  * @param locationLength
  * @return
  * @throws IOException
  */
 public static BufferedImage mergePicture(BufferedImage baseLayer,
                                          BufferedImage topLayer,
                                          String nickName,
                                          int locationX,
                                          int locationY,
                                          int locationWidth,
                                          int locationLength) throws IOException {




     int width = baseLayer.getWidth(null); //底图的宽度
     int height = baseLayer.getHeight(null); //底图的高度
     // 按照底图的宽高生成新的图片
     BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
     Graphics g = image.createGraphics();
     g.drawImage(baseLayer, 0, 0, width, height, null);

     //int smallWidth = topLayer.getWidth(null);   // 上层图片的宽度
     // 设置上层图片放置的位置的坐标及大小
     g.drawImage(topLayer, locationX, locationY, locationWidth, locationLength, null);
     if (nickName != null) {
         // 普通字体(ps:字体是微软雅黑,linux不具备有,需要安装,)
         Font font = new Font("微软雅黑", Font.PLAIN, 35);
         g.setFont(font);
         g.setColor(new Color(129, 129, 129));
         FontMetrics fm = g.getFontMetrics(font);
         // 字体放置的位置
         //int textWidth = fm.stringWidth(nickName);
         g.drawString(nickName, locationX + 100, 1110);
     }

     g.dispose();

     return image;
 }


 /**
  * 按指定的字节数截取字符串(一个中文字符占3个字节,一个英文字符或数字占1个字节)
  *
  * @param sourceString 源字符串
  * @param cutBytes     要截取的字节数
  * @return
  */
 public static String cutString(String sourceString, int cutBytes) {
     if (sourceString == null || "".equals(sourceString.trim())) {
         return "";
     }
     int lastIndex = 0;
     boolean stopFlag = false;
     int totalBytes = 0;
     for (int i = 0; i < sourceString.length(); i++) {
         String s = Integer.toBinaryString(sourceString.charAt(i));
         if (s.length() > 8) {
             totalBytes += 3;
         } else {
             totalBytes += 1;
         }
         if (!stopFlag) {
             if (totalBytes == cutBytes) {
                 lastIndex = i;
                 stopFlag = true;
             } else if (totalBytes > cutBytes) {
                 lastIndex = i - 1;
                 stopFlag = true;
             }
         }
     }
     if (!stopFlag) {
         return sourceString;
     } else {
         return sourceString.substring(0, lastIndex + 1);
     }
 }

 /**
  * 合并二维码附带使用说明
  *
  * @param baseImage
  * @param qrcodeBufferImage
  * @param text
  * @param locationX
  * @param locationY
  * @param locationWidth
  * @param locationLength
  * @return
  * @throws IOException
  */
 public static BufferedImage mergeQrcode(BufferedImage baseImage,
                                         BufferedImage qrcodeBufferImage,
                                         String text,
                                         int locationX,
                                         int locationY,
                                         int locationWidth,
                                         int locationLength) throws IOException {


     // BufferedImage qrcodeBufferImage = ImageIO.read(qrcodeFile);

     int width = baseImage.getWidth(null); //底图的宽度
     int height = baseImage.getHeight(null); //底图的高度

     // 按照底图的宽高生成新的图片
     BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
     Graphics g = image.createGraphics();
     g.drawImage(baseImage, 0, 0, width, height, null);

     // 设置上层图片放置的位置的坐标及大小,坐标居中
     g.drawImage(qrcodeBufferImage, locationX, locationY, locationWidth, locationLength, null);
     if (text != null) {
         // 普通字体
         Font font = new Font("微软雅黑", Font.PLAIN, 25);
         g.setFont(font);
         g.setColor(new Color(129, 129, 129));
         FontMetrics fm = g.getFontMetrics(font);
         // 字体放置的位置
         //int textWidth = fm.stringWidth(nickName);
         g.drawString(text, 748, 1330);
     }
     g.dispose();
     return image;
 }

 /**
  * 图片上添加文字
  *
  * @param src        the src
  * @param copywriter the copywriter
  * @return the buffered image
  * @throws Exception the exception
  */
 public static BufferedImage drawTextInImage(BufferedImage src, String copywriter) {
     int width = src.getWidth(null);
     int height = src.getHeight(null);
     BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
     Graphics2D g = image.createGraphics();
     g.drawImage(src, 0, 0, width, height, null);

     // 长度和位置
     Font font = new Font("微软雅黑", Font.PLAIN, 35);
     g.setFont(font);
     FontMetrics fm = g.getFontMetrics(font);
     int textWidth = fm.stringWidth(copywriter);
     g.setColor(new Color(47, 47, 47));
     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
     // 先按字节来换行,英文单词空格问题暂时未考虑
     if (copywriter.getBytes().length > 63) {
         String firstLine = cutString(copywriter, 63);
         String secondLine = copywriter.substring(firstLine.length(), copywriter.length());
         g.drawString(firstLine, (width - fm.stringWidth(firstLine)) / 2, COPYWRITER_Y);
         g.drawString(secondLine, (width - fm.stringWidth(secondLine)) / 2, COPYWRITER_Y + 35);
     } else {
         g.drawString(copywriter, COPYWRITER_X, COPYWRITER_Y);
     }
     g.dispose();

     return image;
 }

 public static BufferedImage drawTextInImage(BufferedImage src, String copywriter, int x, int y) {
     int width = src.getWidth(null);
     int height = src.getHeight(null);
     BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
     Graphics2D g = image.createGraphics();
     g.drawImage(src, 0, 0, width, height, null);

     // 长度和位置
     Font font = new Font("微软雅黑", Font.PLAIN, 35);
     g.setFont(font);
     FontMetrics fm = g.getFontMetrics(font);
     int textWidth = fm.stringWidth(copywriter);
     g.setColor(new Color(62, 62, 62));
     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
     g.drawString(copywriter, x, y);
     g.dispose();

     return image;
 }

 /**
  * 方形转为圆形
  *
  * @param img    the img
  * @param radius the radius 半径
  * @return the buffered image
  * @throws Exception the exception
  */
 public static BufferedImage convertRoundedImage(BufferedImage img, int radius) {
     BufferedImage result = new BufferedImage(radius, radius, BufferedImage.TYPE_INT_ARGB);
     Graphics2D g = result.createGraphics();
     //在适当的位置画图
     g.drawImage(img, (radius - img.getWidth(null)) / 2, (radius - img.getHeight(null)) / 2, null);

     //圆角
     RoundRectangle2D round = new RoundRectangle2D.Double(0, 0, radius, radius, radius * 2, radius * 2);
     Area clear = new Area(new Rectangle(0, 0, radius, radius));
     clear.subtract(new Area(round));
     g.setComposite(AlphaComposite.Clear);

     //抗锯齿
     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
     g.fill(clear);
     g.dispose();

     return result;
 }

 /**
  * 图像等比例缩放
  *
  * @param img     the img
  * @param maxSize the max size
  * @param type    the type
  * @return the scaled image
  */
 private static BufferedImage getScaledImage(BufferedImage img, int maxSize, int type) {
     int w0 = img.getWidth();
     int h0 = img.getHeight();
     int w = w0;
     int h = h0;
     // 头像如果是长方形:
     // 1:高度与宽度的最大值为maxSize进行等比缩放,
     // 2:高度与宽度的最小值为maxSize进行等比缩放
     if (type == 1) {
         w = w0 > h0 ? maxSize : (maxSize * w0 / h0);
         h = w0 > h0 ? (maxSize * h0 / w0) : maxSize;
     } else if (type == 2) {
         w = w0 > h0 ? (maxSize * w0 / h0) : maxSize;
         h = w0 > h0 ? maxSize : (maxSize * h0 / w0);
     }
     Image schedImage = img.getScaledInstance(w, h, Image.SCALE_SMOOTH);
     BufferedImage bufferedImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
     Graphics2D g = bufferedImage.createGraphics();
     g.drawImage(schedImage, 0, 0, null);
     return bufferedImage;
 }

 /**
  * 对头像处理
  *
  * @param in   of  the image
  * @param radius the radius
  * @return the buffered image
  * @throws Exception the exception
  */
 public static BufferedImage createRoundedImage(InputStream in, int radius) {
     BufferedImage img = null;
     BufferedImage fixedImg = null;
     BufferedImage bufferedImage = null;
     try {
         img = ImageIO.read(in);
         // 1. 按原比例缩减
         fixedImg = getScaledImage(img, radius, 2);
         // 2. 居中裁剪
         fixedImg = cutPicture(fixedImg, radius, radius);
         // 3. 把正方形生成圆形
         bufferedImage = convertRoundedImage(fixedImg, radius);
     } catch (IOException e) {
         e.printStackTrace();
     }
     return bufferedImage;
 }

 /**
  * 对头像处理
  * @param img
  * @param radius
  * @return
  */
 public static BufferedImage createRoundedImage(BufferedImage img , int radius) {
     BufferedImage fixedImg = null;
     BufferedImage bufferedImage = null;
     try {
         // 1. 按原比例缩减
         fixedImg = getScaledImage(img, radius, 2);
         // 2. 居中裁剪
         fixedImg = cutPicture(fixedImg, radius, radius);
         // 3. 把正方形生成圆形
         bufferedImage = convertRoundedImage(fixedImg, radius);
     } catch (IOException e) {
         e.printStackTrace();
     }
     return bufferedImage;
 }

 /**
  * 获取远程网络图片信息
  * @param imageURL
  * @return
  */
 public static BufferedImage getRemoteBufferedImage(String imageURL) {
     URL url = null;
     InputStream is = null;
     BufferedImage bufferedImage = null;
     try {
         url = new URL(imageURL);
         is = url.openStream();
         bufferedImage = ImageIO.read(is);
     } catch (MalformedURLException e) {
         e.printStackTrace();
         System.out.println("imageURL: " + imageURL + ",无效!");
         return null;
     } catch (IOException e) {
         e.printStackTrace();
         System.out.println("imageURL: " + imageURL + ",读取失败!");
         return null;
     } finally {
         try {
             if (is!=null) {
                 is.close();
             }
         } catch (IOException e) {
             e.printStackTrace();
             System.out.println("imageURL: " + imageURL + ",流关闭异常!");
             return null;
         }
     }
     return bufferedImage;
 }

 /**
  * 生成海报
  * @param posterInfo
  */
 public static void makePoster(PosterInfoUtil posterInfo){

     try {
         BufferedImage backgroundImage = SharedImageUtil.getRemoteBufferedImage(posterInfo.getBackgroundUrl());
         BufferedImage avastarImage = SharedImageUtil.getRemoteBufferedImage(posterInfo.getAvastarUrl());
         BufferedImage qrCodeImage = SharedImageUtil.getRemoteBufferedImage(posterInfo.getQrCodeUrl());

         // 生成头像圆角
         avastarImage = createRoundedImage(avastarImage,posterInfo.getAvastarSize());
         // 获取背景图宽高
         int width = backgroundImage.getWidth(null); //底图的宽度
         int height = backgroundImage.getHeight(null); //底图的高度

         // 按照底图的宽高生成新的图片
         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
         Graphics g = image.createGraphics();
         g.drawImage(backgroundImage, 0, 0, width, height, null);
         // 设置头像放置的位置的坐标及大小,坐标居中
         g.drawImage(avastarImage, posterInfo.getAvastarLocationX(), posterInfo.getAvastarLocationY(), posterInfo.getAvastarSize(), posterInfo.getAvastarSize(), null);
         // 设置二维码放置的位置的坐标及大小,坐标居中
         g.drawImage(qrCodeImage, posterInfo.getQrCodeLocationX(), posterInfo.getQrCodeLocationY(), posterInfo.getQrCodeSize(), posterInfo.getQrCodeSize(), null);

         // 字体颜色
         List<Integer> fontColors = posterInfo.getFontColors();
         // 设置文字
         if (posterInfo.getNickName() != null || posterInfo.getOtherText() != null){
             // 普通字体
             Font font = new Font("微软雅黑", Font.PLAIN, posterInfo.getNickNameFontSize());
             g.setFont(font);
             g.setColor(new Color(fontColors.get(0), fontColors.get(1), fontColors.get(2)));
             FontMetrics fm = g.getFontMetrics(font);
             // 字体放置的位置
             g.drawString(posterInfo.getNickName(), posterInfo.getNickNameLocationX(), posterInfo.getNickNameLocationY());
         }

         if (posterInfo.getOtherText() != null){
             // 普通字体
             Font font = new Font("微软雅黑", Font.PLAIN, posterInfo.getOtherTextFontSize());
             g.setFont(font);
             g.setColor(new Color(fontColors.get(0), fontColors.get(1), fontColors.get(2)));
             FontMetrics fm = g.getFontMetrics(font);
             // 字体放置的位置
             g.drawString(posterInfo.getOtherText(), posterInfo.getOtherTextLocationX(), posterInfo.getOtherTextLocationY());
         }
         g.dispose();
         ImageIO.write(image, "jpg", new File(posterInfo.getSavePath()));


     }catch (Exception e){
         e.printStackTrace();
     }

 }


}



import java.util.List;

/**
 * 海报信息
 */
public class PosterInfoUtil {
    private String qrCodeUrl  = "";
    private String backgroundUrl   = "";
    private String avastarUrl  = "";

    private Integer qrCodeSize  = 0;
    private Integer avastarSize  = 0;

    private Integer qrCodeLocationX  = 0;
    private Integer qrCodeLocationY  = 0;

    private Integer avastarLocationX  = 0;
    private Integer avastarLocationY  = 0;


    private String nickName  = "";
    private String otherText  = "";


    private Integer nickNameLocationX  = 0;
    private Integer nickNameLocationY  = 0;

    private Integer otherTextLocationX  = 0;
    private Integer otherTextLocationY  = 0;

    private Integer nickNameFontSize = 0;
    private Integer otherTextFontSize = 0;

    private String savePath  = "";

    public List<Integer> getFontColors() {
        return fontColors;
    }

    public void setFontColors(List<Integer> fontColors) {
        this.fontColors = fontColors;
    }

    private List<Integer> fontColors;
    public Integer getNickNameFontSize() {
        return nickNameFontSize;
    }

    public void setNickNameFontSize(Integer nickNameFontSize) {
        this.nickNameFontSize = nickNameFontSize;
    }

    public Integer getOtherTextFontSize() {
        return otherTextFontSize;
    }

    public void setOtherTextFontSize(Integer otherTextFontSize) {
        this.otherTextFontSize = otherTextFontSize;
    }




    public String getSavePath() {
        return savePath;
    }

    public void setSavePath(String savePath) {
        this.savePath = savePath;
    }

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public String getOtherText() {
        return otherText;
    }

    public void setOtherText(String otherText) {
        this.otherText = otherText;
    }

    public Integer getNickNameLocationX() {
        return nickNameLocationX;
    }

    public void setNickNameLocationX(Integer nickNameLocationX) {
        this.nickNameLocationX = nickNameLocationX;
    }

    public Integer getNickNameLocationY() {
        return nickNameLocationY;
    }

    public void setNickNameLocationY(Integer nickNameLocationY) {
        this.nickNameLocationY = nickNameLocationY;
    }

    public Integer getOtherTextLocationX() {
        return otherTextLocationX;
    }

    public void setOtherTextLocationX(Integer otherTextLocationX) {
        this.otherTextLocationX = otherTextLocationX;
    }

    public Integer getOtherTextLocationY() {
        return otherTextLocationY;
    }

    public void setOtherTextLocationY(Integer otherTextLocationY) {
        this.otherTextLocationY = otherTextLocationY;
    }




    public String getQrCodeUrl() {
        return qrCodeUrl;
    }

    public void setQrCodeUrl(String qrCodeUrl) {
        this.qrCodeUrl = qrCodeUrl;
    }

    public String getBackgroundUrl() {
        return backgroundUrl;
    }

    public void setBackgroundUrl(String backgroundUrl) {
        this.backgroundUrl = backgroundUrl;
    }

    public String getAvastarUrl() {
        return avastarUrl;
    }

    public void setAvastarUrl(String avastarUrl) {
        this.avastarUrl = avastarUrl;
    }

    public Integer getQrCodeSize() {
        return qrCodeSize;
    }

    public void setQrCodeSize(Integer qrCodeSize) {
        this.qrCodeSize = qrCodeSize;
    }

    public Integer getAvastarSize() {
        return avastarSize;
    }

    public void setAvastarSize(Integer avastarSize) {
        this.avastarSize = avastarSize;
    }

    public Integer getQrCodeLocationX() {
        return qrCodeLocationX;
    }

    public void setQrCodeLocationX(Integer qrCodeLocationX) {
        this.qrCodeLocationX = qrCodeLocationX;
    }

    public Integer getQrCodeLocationY() {
        return qrCodeLocationY;
    }

    public void setQrCodeLocationY(Integer qrCodeLocationY) {
        this.qrCodeLocationY = qrCodeLocationY;
    }

    public Integer getAvastarLocationX() {
        return avastarLocationX;
    }

    public void setAvastarLocationX(Integer avastarLocationX) {
        this.avastarLocationX = avastarLocationX;
    }

    public Integer getAvastarLocationY() {
        return avastarLocationY;
    }

    public void setAvastarLocationY(Integer avastarLocationY) {
        this.avastarLocationY = avastarLocationY;
    }
}

测试案例源码如下:

      PosterInfoUtil posterInfoUtil = new PosterInfoUtil();
      List<Integer> colors = new ArrayList<>();
      colors.add(40);
      colors.add(40);
      colors.add(40);
      posterInfoUtil.setAvastarUrl("XXXXXX");
      posterInfoUtil.setQrCodeUrl("XXXXXXX");
      posterInfoUtil.setBackgroundUrl("XXXXXXXX");
      posterInfoUtil.setNickName("XXXXX");
      posterInfoUtil.setOtherText("XXXXX");
      posterInfoUtil.setNickNameFontSize(28);
      posterInfoUtil.setOtherTextFontSize(36);
      posterInfoUtil.setQrCodeSize(220);
      posterInfoUtil.setAvastarSize(80);
      posterInfoUtil.setQrCodeLocationX(640);
      posterInfoUtil.setQrCodeLocationY(1250);
      posterInfoUtil.setAvastarLocationX(50);
      posterInfoUtil.setAvastarLocationY(1320);
      posterInfoUtil.setNickNameLocationX(140);
      posterInfoUtil.setNickNameLocationY(1380);
      posterInfoUtil.setOtherTextLocationX(50);
      posterInfoUtil.setOtherTextLocationY(1460);
      posterInfoUtil.setSavePath("D:\\result.jpg");
      posterInfoUtil.setFontColors(colors);
      SharedImageUtil.makePoster(posterInfoUtil);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355