java实现图片的组合(二) java实现图片的组合(一)

本篇文章是续接上篇文章的 ,是对上篇文章做了一些优化,所以如果你没看过上篇文章的话,可以移步到

java实现图片的组合(一)

具体优化点主要包括:

1、不使用JPEG,这样就可以把pom文件里的rt.jar去掉

<build>
        <filters>
            <filter>../build/${env}.properties</filter>
        </filters>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.0.0</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.6.1</version>
                    <configuration>
                        <source>${java.version}</source>
                        <target>${java.version}</target>
                        <!-- 解决jdk1.6以上不识别JPEGCodec问题-->
                        <!--<compilerArguments>
                            <verbose />
                            <bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar</bootclasspath>
                        </compilerArguments>-->
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.eclipse.jetty</groupId>
                    <artifactId>jetty-maven-plugin</artifactId>
                    <version>9.3.6.v20151106</version>
                    <configuration>
                        <scanIntervalSeconds>0</scanIntervalSeconds>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

2、上篇文章是把处理好的图片写进服务器,然后读出来上传到OSS里,返回路径;这里是不把图片写进服务器里,直接上传到OSS上。所以锁也用不到了。

3、上篇文章可以看到我的头像是被裁减成了圆形,但是四个角还是白色,没能改成透明的,效果不好看,

所以这里直接改成方形的。然后课程名称较长的时候换行也被产品砍掉了,用 ...  三个点来代替

4、有个bug,我的昵称、课程名称在开发环境测试是OK的,测试人员反馈测试环境里中文乱码变成方框,

绘制文字的时候,用byte数组写进去。

g.drawString(lessonName, lessonWidthX, 342 * 2 + 30 + 20 + 5 + 5);

改为

g.drawString(new String(nickname.getBytes(),"utf-8"),nickWidthX,285 * 2 + 30 + 30);

先看一下效果图吧


后续会用 谷歌开源的 thumbnailator 这个来试下,

用这个的话,思路就是 以打水印的方式来进行图片的组合。

本次优化代码如下:

package com.ywwl.nmedia.api.biz.util;

import org.apache.commons.lang3.StringUtils;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

/**
 * @Author whb
 * @Date 21:30 2018/7/9
 **/
public class ImageUtil {

    //推送消息,模板图片
    //http://xxx:8082/store/lesson/qrcode/2018/07/89670065122466.jpg
    private static final String ORIGINAL_IMG_PATH = "lesson/qrcode/2018/07/89670065122466.jpg";

    /**
     *
     * <p>
     * 绘制图片
     *
     * @param headImg    用户头像
     *                   
     * @param nickname   用户昵称
     * @param lessonName 课程名称
     * @param qrcode     讲师二维码
     * @param cover      课程封面图 lesson/icon/2018/01/359819524709343.jpg
     * @return 绘制后的图片在OSS里的地址
     */
    public String drawImg(String headImg, String nickname, String lessonName, String qrcode, String cover) {
        try {
            BufferedImage buffImg = ImageIO.read(new URL(OssFileUtil.getUploadFilePath(ORIGINAL_IMG_PATH)));
            Graphics g = buffImg.getGraphics();//得到画笔对象
            if (StringUtils.isNotBlank(cover)) {
                BufferedImage imgCover = ImageUtil.getBufferedImage(OssFileUtil.getUploadFilePath(cover), 341 * 2, 255 * 2);
                g.drawImage(imgCover, 0 + 30 + 4, 0 + 30 + 3, null);//将封面图绘到大图片上。50,200 .表示你的小图片在大图片上的位置。
                g.setColor(Color.BLACK);
            }
            if (StringUtils.isNotBlank(headImg)) {
                BufferedImage img = ImageUtil.getBufferedImage(headImg, 100, 100);
                g.drawImage(img, 146 * 2 + 30 + 5, 229 * 2 + 30 + 5, null);//将用户头像绘到大图片上。146*2+30+5 * 229*2+30+5 .表示你的小图片在大图片上的位置。
                g.setColor(new Color(255, 255, 255, 0));
            }

            Font f = new Font("宋体", Font.BOLD, 25);
            Color myColor = Color.BLACK;
            g.setColor(myColor);
            g.setFont(f);
            if (StringUtils.isNotBlank(nickname)) {
                FontMetrics fmNick = g.getFontMetrics(f);//昵称居中设置
                int nickWidth = fmNick.stringWidth(nickname);
                int nickWidthX = (730 - nickWidth) / 2;//156*2+30+20
                //g.drawString(nickname, nickWidthX, 285 * 2 + 30 + 30); //绘制文字
                g.drawString(new String(nickname.getBytes(),"utf-8"),nickWidthX,285 * 2 + 30 + 30);

            }
            if (StringUtils.isNotBlank(lessonName)) {
                if (lessonName.length() >= 15) {
                    lessonName = lessonName.substring(0, 15) + "...";
                }
                FontMetrics fmLesson = g.getFontMetrics(f);//课程名称居中设置
                int lessonWidth = fmLesson.stringWidth(lessonName);
                int lessonWidthX = (730 - lessonWidth) / 2;
                //g.drawString(lessonName, lessonWidthX, 342 * 2 + 30 + 20 + 5 + 5);
                g.drawString(new String(lessonName.getBytes(),"utf-8"),lessonWidthX,342 * 2 + 30 + 20 + 5 + 5);
            }
            BufferedImage imgQrcode = ImageUtil.getBufferedImage(OssFileUtil.getUploadFilePath(qrcode), 90 * 2 + 10, 90 * 2 + 10);
            g.drawImage(imgQrcode, 126 * 2 + 30 + 5, 448 * 2 + 30 + 5, null);//将讲师二维码绘到大图片上。126*2+30+5 * 448*2+30+5 .表示你的小图片在大图片上的位置。
            g.setColor(Color.BLACK);
            g.dispose();
            String uploadPathReal = OssFileUtil.getUploadPath("lesson/qrcode", ".jpg");
            return OssFileUtil.uploadFile(buffImg, uploadPathReal) ? uploadPathReal : "";
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }


    /**
     * 改变图片尺寸
     *
     * @param imgUrl 图片的路径 domail + path
     * @param width  修改后的宽度
     * @param height 修改后的高度
     * @return BufferedImage对象
     */
    public static BufferedImage getBufferedImage(String imgUrl, int width, int height) {
        if (StringUtils.isBlank(imgUrl)) {
            return null;
        }
        try {
            BufferedImage bi = ImageIO.read(new URL(imgUrl));
            BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            tag.getGraphics().drawImage(bi, 0, 0, width, height, null);

            ByteArrayOutputStream bs = new ByteArrayOutputStream();
            ImageOutputStream imOut = ImageIO.createImageOutputStream(bs);
            ImageIO.write(tag, "jpg", imOut);
            InputStream is = new ByteArrayInputStream(bs.toByteArray());
            BufferedImage buffImg = ImageIO.read(is);
            return buffImg;

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 把头像裁剪成圆形
     * @param headImg doamin + path
     * @return
     */
    public static BufferedImage roundImg(String headImg) {
        if (StringUtils.isBlank(headImg)) {
            return null;
        }
        try {
            BufferedImage bi1 = ImageIO.read(new URL(headImg));
            BufferedImage bi2 = new BufferedImage(bi1.getWidth(), bi1.getHeight(),
                    BufferedImage.TYPE_INT_RGB);
            Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, bi1.getWidth(), bi1
                    .getHeight());
            Graphics2D g2 = bi2.createGraphics();
            g2.setBackground(Color.WHITE);
            g2.fill(new Rectangle(bi2.getWidth(), bi2.getHeight()));
            g2.setClip(shape);
            // 使用 setRenderingHint 设置抗锯齿
            g2.drawImage(bi1, 0, 0, null);
            g2.dispose();

            ByteArrayOutputStream bs = new ByteArrayOutputStream();
            ImageOutputStream imOut = ImageIO.createImageOutputStream(bs);
            ImageIO.write(bi2, "jpg", imOut);
            InputStream is = new ByteArrayInputStream(bs.toByteArray());
            BufferedImage buffImg = ImageIO.read(is);
            return buffImg;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

}

猜你喜欢

转载自blog.csdn.net/qq_33101675/article/details/81021790