JAVA海报制作

JAVA海报制作

前言

最近一直在忙着做小程序的分享盆友圈,分享朋友和群,好物推荐,好物圈等等推广方面的事情。有大概一个礼拜没有更博客了。就想着写一篇关于海报制作方面的博客。关于分享朋友圈这个功能,我刚开始的想法是后台用代码画一张海报出来,然后上传到云服务器返回url,我就想着图片url都有了,微信应该有提供接口可以把这张图分享到盆友圈吧,可是后面海报画出来了,却查不到微信有提供这个接口,大多数的做法是前端canvas画一张海报,然后保存到手机,然后用户自己去发朋友圈,我觉得这样很鸡肋,如果我是用户我是绝对不会去发的,除非是集赞活动之类的。
本文不会涉及小程序前端,虽然最后这些分享功能做出来后,后台一行代码没写,全部都是前端实现的,可是我个人是非常拒绝写前端的,无奈~~。本文主要是用后台代码生成一张自适应的海报。

效果图

1920*1080 高清无码

在这里插入图片描述
720*1280
在这里插入图片描述

代码

Poster实体类

public class Poster implements Serializable {
    private int width;//海报的宽(像素为单位)
    private int height;//海报的高
    //头像
    private String avatarUrl;//头像url
    private int avatarX;//头像左上角横坐标
    private int avatarY;//头像左上角纵坐标
    private int avatarWidth;//头像宽
    private int avatarHeight;//头像高
    private boolean isCircle;//是否圆形头像
    //名字
    private String name;
    private Font nameFont;
    private Color nameColor;
    private int nameX;
    private int nameY;
    //商品
    private String goodsUrl;
    private int goodsX;
    private int goodsY;
    private int goodsWidth;
    private int goodsHeight;
    //商品描述
    private String desc;
    private Font descFont;
    private Color descColor;
    private int descX;
    private int descY;
    //商品价格
    private String price;
    private Font priceFont;
    private Color priceColor;
    private int priceX;
    private int priceY;
    //小程序码
    private String qrCodeUrl;
    private int qrCodeX;
    private int qrCodeY;
    private int qrCodeWidth;
    private int qrCodeHeight;
    //提示1
    private String tip1;
    private Font tip1Font;
    private Color tip1Color;
    private int tip1X;
    private int tip1Y;
    //提示2
    private String tip2;
    private Font tip2Font;
    private Color tip2Color;
    private int tip2X;
    private int tip2Y;
    //底部栏
    private Color footerColor;
    private int footerWidth;
    private int footerHeight;
    private int footerX;
    private int footerY;
    //底部栏提示字
    private String footerTip;
    private Font footerTipFont;
    private Color footerTipColor;
    private int footerTipX;
    private int footerTipY;

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public String getAvatarUrl() {
        return avatarUrl;
    }

    public void setAvatarUrl(String avatarUrl) {
        this.avatarUrl = avatarUrl;
    }

    public int getAvatarX() {
        return avatarX;
    }

    public void setAvatarX(int avatarX) {
        this.avatarX = avatarX;
    }

    public int getAvatarY() {
        return avatarY;
    }

    public void setAvatarY(int avatarY) {
        this.avatarY = avatarY;
    }

    public int getAvatarWidth() {
        return avatarWidth;
    }

    public void setAvatarWidth(int avatarWidth) {
        this.avatarWidth = avatarWidth;
    }

    public int getAvatarHeight() {
        return avatarHeight;
    }

    public void setAvatarHeight(int avatarHeight) {
        this.avatarHeight = avatarHeight;
    }

    public boolean isCircle() {
        return isCircle;
    }

    public void setCircle(boolean circle) {
        isCircle = circle;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Font getNameFont() {
        return nameFont;
    }

    public void setNameFont(Font nameFont) {
        this.nameFont = nameFont;
    }

    public Color getNameColor() {
        return nameColor;
    }

    public void setNameColor(Color nameColor) {
        this.nameColor = nameColor;
    }

    public int getNameX() {
        return nameX;
    }

    public void setNameX(int nameX) {
        this.nameX = nameX;
    }

    public int getNameY() {
        return nameY;
    }

    public void setNameY(int nameY) {
        this.nameY = nameY;
    }

    public String getGoodsUrl() {
        return goodsUrl;
    }

    public void setGoodsUrl(String goodsUrl) {
        this.goodsUrl = goodsUrl;
    }

    public int getGoodsX() {
        return goodsX;
    }

    public void setGoodsX(int goodsX) {
        this.goodsX = goodsX;
    }

    public int getGoodsY() {
        return goodsY;
    }

    public void setGoodsY(int goodsY) {
        this.goodsY = goodsY;
    }

    public int getGoodsWidth() {
        return goodsWidth;
    }

    public void setGoodsWidth(int goodsWidth) {
        this.goodsWidth = goodsWidth;
    }

    public int getGoodsHeight() {
        return goodsHeight;
    }

    public void setGoodsHeight(int goodsHeight) {
        this.goodsHeight = goodsHeight;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public Font getDescFont() {
        return descFont;
    }

    public void setDescFont(Font descFont) {
        this.descFont = descFont;
    }

    public Color getDescColor() {
        return descColor;
    }

    public void setDescColor(Color descColor) {
        this.descColor = descColor;
    }

    public int getDescX() {
        return descX;
    }

    public void setDescX(int descX) {
        this.descX = descX;
    }

    public int getDescY() {
        return descY;
    }

    public void setDescY(int descY) {
        this.descY = descY;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public Font getPriceFont() {
        return priceFont;
    }

    public void setPriceFont(Font priceFont) {
        this.priceFont = priceFont;
    }

    public Color getPriceColor() {
        return priceColor;
    }

    public void setPriceColor(Color priceColor) {
        this.priceColor = priceColor;
    }

    public int getPriceX() {
        return priceX;
    }

    public void setPriceX(int priceX) {
        this.priceX = priceX;
    }

    public int getPriceY() {
        return priceY;
    }

    public void setPriceY(int priceY) {
        this.priceY = priceY;
    }

    public String getQrCodeUrl() {
        return qrCodeUrl;
    }

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

    public int getQrCodeX() {
        return qrCodeX;
    }

    public void setQrCodeX(int qrCodeX) {
        this.qrCodeX = qrCodeX;
    }

    public int getQrCodeY() {
        return qrCodeY;
    }

    public void setQrCodeY(int qrCodeY) {
        this.qrCodeY = qrCodeY;
    }

    public int getQrCodeWidth() {
        return qrCodeWidth;
    }

    public void setQrCodeWidth(int qrCodeWidth) {
        this.qrCodeWidth = qrCodeWidth;
    }

    public int getQrCodeHeight() {
        return qrCodeHeight;
    }

    public void setQrCodeHeight(int qrCodeHeight) {
        this.qrCodeHeight = qrCodeHeight;
    }

    public String getTip1() {
        return tip1;
    }

    public void setTip1(String tip1) {
        this.tip1 = tip1;
    }

    public Font getTip1Font() {
        return tip1Font;
    }

    public void setTip1Font(Font tip1Font) {
        this.tip1Font = tip1Font;
    }

    public Color getTip1Color() {
        return tip1Color;
    }

    public void setTip1Color(Color tip1Color) {
        this.tip1Color = tip1Color;
    }

    public int getTip1X() {
        return tip1X;
    }

    public void setTip1X(int tip1X) {
        this.tip1X = tip1X;
    }

    public int getTip1Y() {
        return tip1Y;
    }

    public void setTip1Y(int tip1Y) {
        this.tip1Y = tip1Y;
    }

    public String getTip2() {
        return tip2;
    }

    public void setTip2(String tip2) {
        this.tip2 = tip2;
    }

    public Font getTip2Font() {
        return tip2Font;
    }

    public void setTip2Font(Font tip2Font) {
        this.tip2Font = tip2Font;
    }

    public Color getTip2Color() {
        return tip2Color;
    }

    public void setTip2Color(Color tip2Color) {
        this.tip2Color = tip2Color;
    }

    public int getTip2X() {
        return tip2X;
    }

    public void setTip2X(int tip2X) {
        this.tip2X = tip2X;
    }

    public int getTip2Y() {
        return tip2Y;
    }

    public void setTip2Y(int tip2Y) {
        this.tip2Y = tip2Y;
    }

    public Color getFooterColor() {
        return footerColor;
    }

    public void setFooterColor(Color footerColor) {
        this.footerColor = footerColor;
    }

    public int getFooterWidth() {
        return footerWidth;
    }

    public void setFooterWidth(int footerWidth) {
        this.footerWidth = footerWidth;
    }

    public int getFooterHeight() {
        return footerHeight;
    }

    public void setFooterHeight(int footerHeight) {
        this.footerHeight = footerHeight;
    }

    public int getFooterX() {
        return footerX;
    }

    public void setFooterX(int footerX) {
        this.footerX = footerX;
    }

    public int getFooterY() {
        return footerY;
    }

    public void setFooterY(int footerY) {
        this.footerY = footerY;
    }

    public String getFooterTip() {
        return footerTip;
    }

    public void setFooterTip(String footerTip) {
        this.footerTip = footerTip;
    }

    public Font getFooterTipFont() {
        return footerTipFont;
    }

    public void setFooterTipFont(Font footerTipFont) {
        this.footerTipFont = footerTipFont;
    }

    public Color getFooterTipColor() {
        return footerTipColor;
    }

    public void setFooterTipColor(Color footerTipColor) {
        this.footerTipColor = footerTipColor;
    }

    public int getFooterTipX() {
        return footerTipX;
    }

    public void setFooterTipX(int footerTipX) {
        this.footerTipX = footerTipX;
    }

    public int getFooterTipY() {
        return footerTipY;
    }

    public void setFooterTipY(int footerTipY) {
        this.footerTipY = footerTipY;
    }
}

海报工具类

public class PosterUtil {
	 private static Poster initPoster(int width, int height, String avatarUrl, String qrCodeUrl, String goodsUrl, String name, String desc, String price) {
        Poster poster = new Poster();
        //画布
        poster.setWidth(width);
        poster.setHeight(height);
        //头像
        poster.setAvatarUrl(avatarUrl);
        poster.setCircle(true);
        poster.setAvatarX((int)(width/11.5));
        poster.setAvatarY(height/28);
        poster.setAvatarWidth(width/6);
        poster.setAvatarHeight(width/6);
        //名字
        poster.setName(name);
        poster.setNameFont(new Font("宋体",Font.PLAIN,width/24));
        poster.setNameColor(new Color(33,33,33));
        poster.setNameX(poster.getAvatarX()+poster.getAvatarWidth()+20);
        poster.setNameY(poster.getAvatarY()+poster.getAvatarHeight()/2+15);
        //商品
        poster.setGoodsUrl(goodsUrl);
        poster.setGoodsWidth((int)(width/1.35));
        poster.setGoodsHeight((int)(height/3.4));
        poster.setGoodsX((width-poster.getGoodsWidth())/2);
        poster.setGoodsY(poster.getAvatarY()+poster.getAvatarHeight()+100);
        //商品详情
        poster.setDesc(desc);
        poster.setDescColor(Color.BLACK);
        int size = width/17;
        poster.setDescFont(new Font("宋体",Font.BOLD,size));
        poster.setDescX((width-desc.length()*size)/2);
        poster.setDescY(poster.getGoodsY()+poster.getGoodsHeight()+(int)(height/21.3));
        //价格
        poster.setPrice(price);
        poster.setPriceColor(Color.RED);
        poster.setDescFont(new Font("宋体",Font.BOLD,size));
        poster.setPriceX((width-price.length()*size)/2);
        poster.setPriceY(poster.getGoodsY()+poster.getGoodsHeight()+(int)(height/10.6));
        //小程序码
        poster.setQrCodeUrl(qrCodeUrl);
        poster.setQrCodeWidth((int)(width/2.85));
        poster.setQrCodeHeight((int)(width/2.85));
        poster.setQrCodeX((int)(width/11.5));
        poster.setQrCodeY(height-poster.getQrCodeHeight()-(int)(height/7.68));
        //tips1
        poster.setTip1("长按识别小程序码");
        poster.setTip1Color(Color.BLACK);
        poster.setTip1Font(new Font("宋体",Font.BOLD,width/21));
        poster.setTip1X(poster.getQrCodeX()+poster.getQrCodeWidth()+20);
        poster.setTip1Y(poster.getQrCodeY()+poster.getQrCodeHeight()/2+10);
        //tips2
        poster.setTip2("好物与好友一起分享");
        poster.setTip2Color(Color.GRAY);
        poster.setTip2Font(new Font("宋体",Font.PLAIN,width/27));
        poster.setTip2X(poster.getQrCodeX()+poster.getQrCodeWidth()+25);
        poster.setTip2Y(poster.getQrCodeY()+poster.getQrCodeHeight()/2+60);
        //footer
        poster.setFooterColor(new Color(241,112,25));
        poster.setFooterWidth(width);
        poster.setFooterHeight(height/13);
        poster.setFooterX(0);
        poster.setFooterY(height-poster.getFooterHeight());
        //footer tips
        poster.setFooterTip("帮您处理买菜这点事");
        poster.setFooterTipColor(Color.WHITE);
        poster.setFooterTipFont(new Font("宋体",Font.BOLD,width/21));
        poster.setFooterTipX((width-(poster.getFooterTip().length()*width/21))/2);
        poster.setFooterTipY(height-poster.getFooterHeight()/3);
        return poster;
    }

    private static void drawPoster(Poster poster) throws Exception {
        long startTime = System.currentTimeMillis();
        String qrCodeUrl = poster.getQrCodeUrl();
        String goodsUrl = poster.getGoodsUrl();
        String avatarUrl = poster.getAvatarUrl();
        BufferedImage qrCodeImage = ImageIO.read(new URL(qrCodeUrl));
        BufferedImage goodsImage = ImageIO.read(new URL(goodsUrl));
        int width = poster.getWidth();
        int height = poster.getHeight();
        //画布
        BufferedImage canvas = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        Graphics2D g = (Graphics2D) canvas.getGraphics();
        g.setBackground(Color.WHITE);//设置背景色
        g.clearRect(0, 0, width, height);

        // 设置文字抗锯齿
        g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        //圆形头像
        BufferedImage newAvatar = circle(avatarUrl,poster.getAvatarWidth());
        //画头像
        g.drawImage(newAvatar.getScaledInstance(newAvatar.getWidth(), newAvatar.getHeight(), Image.SCALE_SMOOTH), poster.getAvatarX(), poster.getAvatarY(), null);
        // 4. 写字(昵称)
        g.setColor(poster.getNameColor());
        g.setFont(poster.getNameFont());
        g.drawString(poster.getName(), poster.getNameX(), poster.getNameY());
        //画商品
//        g.drawImage(Thumbnails.of(goodsImage).size(poster.getGoodsWidth(), poster.getGoodsHeight()).asBufferedImage(), poster.getGoodsX(), poster.getGoodsY(), null);
        g.drawImage(goodsImage.getScaledInstance(poster.getGoodsWidth(), poster.getGoodsHeight(), Image.SCALE_SMOOTH), poster.getGoodsX(), poster.getGoodsY(), null);
        //画商品详情
        g.setColor(poster.getDescColor());
        g.setFont(poster.getDescFont());
        g.drawString(poster.getDesc(), poster.getDescX(), poster.getDescY());
        //画价格
        g.setColor(poster.getPriceColor());
        g.setFont(poster.getPriceFont());
        g.drawString(poster.getPrice(), poster.getPriceX(), poster.getPriceY());
        //画小程序码
        g.drawImage(qrCodeImage.getScaledInstance(poster.getQrCodeWidth(), poster.getQrCodeHeight(), Image.SCALE_SMOOTH),
                poster.getQrCodeX(), poster.getQrCodeY(), null);
        //画tips1
        g.setColor(poster.getTip1Color());
        g.setFont(poster.getTip1Font());
        g.drawString(poster.getTip1(), poster.getTip1X(), poster.getTip1Y());
        //画tips2
        g.setColor(poster.getTip2Color());
        g.setFont(poster.getTip2Font());
        g.drawString(poster.getTip2(), poster.getTip2X(), poster.getTip2Y());
        //画底部栏
        g.setColor(poster.getFooterColor());
        g.fillRect(poster.getFooterX(),poster.getFooterY(),poster.getFooterWidth(),poster.getFooterHeight());
        //画底部栏提示
        g.setColor(poster.getFooterTipColor());
        g.setFont(poster.getFooterTipFont());
        g.drawString(poster.getFooterTip(), poster.getFooterTipX(), poster.getFooterTipY());
        g.dispose();
        File resultImg = new File("D:\\demo.png");
        ImageIO.write(canvas, "png", resultImg);
        //上传服务器代码
		//ByteArrayOutputStream bs = new ByteArrayOutputStream();
        //ImageOutputStream imgOut = ImageIO.createImageOutputStream(bs);
        //ImageIO.write(canvas, "png", imgOut);
        //InputStream inSteam = new ByteArrayInputStream(bs.toByteArray());
        //String url = OSSFactory.build().upload(inSteam, UUID.randomUUID().toString()+".png");
        System.out.println("生成成功!");
        System.out.println("耗时: " + (System.currentTimeMillis()-startTime)/1000.0 + "s");
        System.out.println("生成文件路径: " + resultImg.getAbsolutePath());
    }


    private static BufferedImage circle(String avatar_img,int width) throws Exception {
        BufferedImage avatar = ImageIO.read(new URL(avatar_img));
        BufferedImage newAvatar = new BufferedImage(width, width, BufferedImage.TYPE_INT_ARGB);
        Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, width, width);
        Graphics2D g2 = newAvatar.createGraphics();
        newAvatar = g2.getDeviceConfiguration().createCompatibleImage(width, width, Transparency.TRANSLUCENT);
        g2 = newAvatar.createGraphics();
        g2.setComposite(AlphaComposite.Clear);
        g2.fill(new Rectangle(newAvatar.getWidth(), newAvatar.getHeight()));
        g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, 1.0f));
        g2.setClip(shape);
        // 使用 setRenderingHint 设置抗锯齿
        g2 = newAvatar.createGraphics();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.fillRoundRect(0, 0,width, width, width, width);
        g2.setComposite(AlphaComposite.SrcIn);
        g2.drawImage(avatar, 0, 0, width, width, null);
        g2.dispose();
        return newAvatar;
    }
}

测试代码

public static void main(String[] args) throws Exception {
        String qrCodeUrl = "https://images.xiaogemaicai.cn/StoreQRCodes/201001.jpg";
        String goodsUrl = "https://images.xiaogemaicai.cn/20180531/11341589679d15.jpg";
        String avatarUrl = "https://wx.qlogo.cn/mmopen/vi_32/bvlq2OnCCSQxpfyJkgvSn3AvHaqB5UFFTasHWZD4ibeHb7b5wW6bVkqbdtTiaEw45GfLYibudiaORHBrRsy9tKgabA/132";
        int width = 1440;
        int height = 2560;
        String name = "会飞的鱼";
        String desc = "新鲜玉米 250g";
        String price = "¥6.99";
        Poster poster = PosterUtil.initPoster(width, height,avatarUrl,qrCodeUrl,goodsUrl,name,desc,price);
        PosterUtil.drawPoster(poster);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值