Graphics2D进行后台绘图

       Graphics2D ,Graphics 类,提供了对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。它是用于在 Java(tm) 平台上呈现二维形状、文本和图像的基础类。

接到一个需求,需要后台生成一张图片,需要ui给出的多张图片合在一起,前端本来是画好的,但是因为小程序的问题,不能正常保存到相册,所以就由后台来画了,就和我介绍的一样,根据Graphics2D进行后台图片合成,绘制,我们一起来看一下吧。

基础方法:

颜色相关设置
public void setColor(int color) 
public void setAlpha(int a) 
public void setARGB(int a, int r, int g, int b)  

public void setStyle(Style style)  设置填充样式
public void setStrokeWidth(float width)  设置画笔宽度
public void setAntiAlias(boolean aa)  抗锯齿功能
public void reset()   重置画笔

文本相关设置
public void setTextSize(float textSize)  文本字体大小
public void setTextAlign(Align align)  文本对齐方式
public void setTextScaleX(float scaleX)  文本沿X轴水平缩放
public void setTextSkewX(float skewX)   设置文本倾斜程度
public void setUnderlineText(boolean underlineText)  下划线
public void setFakeBoldText(boolean fakeBoldText)  粗体设置
public void setStrikeThruText(boolean strikeThruText)  添加删除线

Paint方法:

setStrokeJoin 线条连接处样式
setStrokeMiter 线条连接处倾斜程度
setStrokeCap 线冒风格
setPathEffect 设置路径效果

我自己写的方法:

  /**
     * 首页分享合成图片
     * 
     * @param userId
     * @param projectId
     * @return
     * @throws IOException
     */
    public String overlapImageUrl(Long userId, Long projectId) throws IOException {
        String bosUrlIndex = "";
        try {
            int width = 598;
            int height = 852;
            // 背景图片
            String backgroundPath = "";
            String qeCodePath = "";
            // 获取二维码分享地址
            String appletXiaoMiDic = getAppletXiaoMiDic();
            // 二维码图片
            String qrCodePath = appletXiaoMiDic;
            // 设置图片大小
            BufferedImage background = resizeImage(599, 852, ImageIO.read(new URL(backgroundPath)));
            BufferedImage qrCode = resizeImage(142, 142, ImageIO.read(new URL(qrCodePath)));

            // 这里小女孩图片
            BufferedImage qeCode = resizeImage(228, 345, ImageIO.read(new URL(qeCodePath)));
            // 在背景图片中添加入需要写入的信息
            Graphics2D mainGrapics = background.createGraphics();
            // 消除文字和图片锯齿
            mainGrapics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            mainGrapics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            // 用户分享数据
            Map donateRecord = donateRecord(userId, projectId);
            // 文案1
            Graphics2D mainGrapics01 = background.createGraphics();
            // 消除文字锯齿
            mainGrapics01.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            String wenan = "********";
            String keshu = donateRecord.get("totalStock").toString() + "g";
            Font font = getDefinedFont(Font.PLAIN, 26);
            Font numberFont = font.deriveFont(26f);
            FontMetrics fm = mainGrapics.getFontMetrics(font);
            FontMetrics numberFfm = mainGrapics.getFontMetrics(numberFont);
            mainGrapics01.setColor(new Color(212, 99, 17));
            mainGrapics01.setFont(font);
            int stringWidth = numberFfm.stringWidth(keshu);
            int stringWidth2 = fm.stringWidth(wenan);
            mainGrapics01.drawString(wenan, width / 2 - stringWidth / 2 - stringWidth2 - 10 + 156, 225);
            mainGrapics01.setColor(new Color(130, 177, 95));
            mainGrapics01.setFont(numberFont);
            mainGrapics01.drawString(keshu, width / 2 - stringWidth / 2 + 150, 225);
            mainGrapics01.dispose();

            // 文案2
            Graphics2D mainGrapics02 = background.createGraphics();
            // 消除文字锯齿
            mainGrapics02.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            String wenan1 = "******";
            String cishu = donateRecord.get("donationCount").toString() + "次";
            Font font1 = getDefinedFont(Font.PLAIN, 26);
            Font numberFont1 = font1.deriveFont(26f);
            FontMetrics fm1 = mainGrapics.getFontMetrics(font1);
            FontMetrics numberFfm1 = mainGrapics.getFontMetrics(numberFont1);
            mainGrapics02.setColor(new Color(212, 99, 17));
            mainGrapics02.setFont(font1);
            int stringWidth1 = numberFfm1.stringWidth(cishu);
            int stringWidth21 = fm1.stringWidth(wenan1);
            mainGrapics02.drawString(wenan1, width / 2 - stringWidth1 / 2 - stringWidth21 - 10 + 173, 260);
            mainGrapics02.setColor(new Color(130, 177, 95));
            mainGrapics02.setFont(numberFont1);
            mainGrapics02.drawString(cishu, width / 2 - stringWidth1 / 2 + 170, 260);
            mainGrapics02.dispose();

            // 将上善若水,大爱无疆文案画到上下文上
            String message02 = "******";
            Graphics2D mainGrapics1 = background.createGraphics();
            // 消除文字锯齿
            mainGrapics1.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            mainGrapics1.setFont(getDefinedFont(Font.BOLD, 34));
            mainGrapics1.setColor(new Color(212, 99, 17));
            mainGrapics1.drawString(message02, 134, 580);
            mainGrapics1.dispose();

            // // 感谢你文案
            String message03 = "*****";
            Graphics2D mainGrapics2 = background.createGraphics();
            // 消除文字锯齿
            mainGrapics2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            mainGrapics2.setColor(new Color(212, 99, 17));
            mainGrapics2.setFont(getDefinedFont(Font.BOLD, 36));
            mainGrapics2.drawString(message03, 238, 105);
            mainGrapics2.dispose();

            // // 用户名称
            Graphics2D mainGrapics4 = background.createGraphics();
            // 消除文字锯齿
            mainGrapics4.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            mainGrapics4.setColor(new Color(144, 80, 56));
            mainGrapics4.setFont(getDefinedFont(Font.BOLD, 22));
            mainGrapics4.drawString(donateRecord.get("name").toString(), 360, 100);
            mainGrapics4.dispose();
            Graphics2D g2 = background.createGraphics();
            // 画头像到上下文
            String photo = donateRecord.get("photo").toString();
            BufferedImage convertCircular = convertCircular(photo);
            // g2.drawImage(convertCircular, 151, 58, 68, 68, null);
            g2.drawImage(convertCircular.getScaledInstance(68, 68, Image.SCALE_AREA_AVERAGING), 151, 58, null);
            g2.setColor(Color.ORANGE);
            g2.dispose();

            // 文案2
            Graphics2D mainGrapics11 = background.createGraphics();
            // 消除文字锯齿
            mainGrapics11.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            String wenan2 = "**";
            String canyu = "****";
            String rens = donateRecord.get("number").toString() + "人";
            Font font2 = getDefinedFont(Font.PLAIN, 22);
            Font numberFont2 = font2.deriveFont(22f);
            FontMetrics fm2 = mainGrapics.getFontMetrics(font2);
            FontMetrics numberFfm2 = mainGrapics.getFontMetrics(numberFont2);
            mainGrapics11.setColor(new Color(198, 160, 130));
            mainGrapics11.setFont(font2);
            int stringWidth23 = numberFfm2.stringWidth(rens);
            int stringWidth22 = fm2.stringWidth(wenan2);
            mainGrapics11.drawString(wenan2, width / 2 - stringWidth23 / 2 - stringWidth22 - 30, 800);
            mainGrapics11.setColor(new Color(211, 99, 17));
            mainGrapics11.setFont(numberFont2);
            mainGrapics11.drawString(rens, width / 2 - stringWidth23 / 2 - 23, 800);
            mainGrapics11.setColor(new Color(198, 160, 130));
            mainGrapics11.setFont(font2);
            mainGrapics11.drawString(canyu, width / 2 + stringWidth23 / 2 - 19, 800);
            mainGrapics11.dispose();

            Graphics2D mainGrapics0 = background.createGraphics();
            // 添加小女孩图片
            mainGrapics0.drawImage(qeCode.getScaledInstance(345, 228, Image.SCALE_AREA_AVERAGING), 125, 300, null);
            // 在背景图片上添加二维码图片
            mainGrapics0.drawImage(qrCode.getScaledInstance(142, 145, Image.SCALE_AREA_AVERAGING), 232, 620, null);
            mainGrapics0.dispose();
            // 上传图片到bos
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            ImageIO.write(background, "jpg", output);
            String fileName = "XIAODUNONGZHUANG" + UUID.randomUUID() + ".jpg";
            bosService.putImageByBytes(output.toByteArray(), fileName, "jpg");
            bosUrlIndex = bosService.getDisplayBcsPath(fileName);
            // ImageIO.write(background, "jpg", new File(outPutPath));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bosUrlIndex;
    }

这是一张图片的绘制方法,值得注意的是你要涉及到用户头像的时候,推荐你一个方法,可以画圆头像

 /**
     * 传入的图像必须是正方形的 才会 圆形 如果是长方形的比例则会变成椭圆的
     *
     * @param url 用户头像地址
     * @return
     * @throws IOException
     */
    public static BufferedImage convertCircular(String url) throws IOException {
        BufferedImage bi1 = ImageIO.read(new URL(url));
        // 透明底的图片
        BufferedImage bi2 = new BufferedImage(bi1.getWidth(), bi1.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
        Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, bi1.getWidth(), bi1.getHeight());
        Graphics2D g2 = bi2.createGraphics();
        g2.setClip(shape);
        g2.drawImage(bi1, 0, 0, null);
        g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.dispose();
        return bi2;
    }

基本用java绘制图片的方法就是这样,可以参考一下我的写法,这个东西不太难,多去看他的API文档,一点点扒出来

你可能感兴趣的:(Java)