仿微信群头像九宫格

package com.hssmartcity.common.utils;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;

/**
 * 微信群聊头像,暂时只能拼接jpg和jpeg格式的图片
 *
 * @author syh
 */
@Component
public final class ImageUtil {

    // 图片存放路径   D:/SmartCityFile/group/Img/
    @Value("${file.group.image.savepath}")
    private  String groupSavePath;

    // 图片读取路径  /group/Img/**
    @Value("${file.group.image.readpath}")
    private  String groupReadPath;

    // 数据库存放的图片路径,最终生成格式  /group/Img/c70d58eb-9816-4ca2-81d8-049b64012650/c70d58eb-9816-4ca2-81d8-049b64012650.jpg

    /** 图片格式 */
//    private static final String PICTRUE_FORMATE_JPG = "jpg";
//    private static final String PICTRUE_FORMATE_JPEG = "jpeg";
//    private static final String PICTRUE_FORMATE_GIF = "gif";
//    private static final String PICTRUE_FORMATE_PNG = "png";

    /**
     * 生成组合头像
     *
     * @param paths
     *            用户图像录像集合
     * @param groupId
     *            拼接后图片的名称
     * @throws IOException
     */
    public  String getCombinationOfhead(List<String> paths, String groupId) throws IOException {
        // 画板的高度和宽度(如果想放大,按照56的倍数增加,当然下面图像拼接大小需要重新计算)
        int height = 336;
        int width = 336;

        // 图片的高度和宽度
        int pictureHeight = 0;
        int pictureWidth = 0;
        if (paths.size() == 1) {
            pictureHeight = height;
            pictureWidth = width;
        } else if (paths.size() == 2 || paths.size() == 3 || paths.size() == 4){
            // 168
            pictureHeight = height / 2 - 6;
            pictureWidth = width / 2 - 6;
        } else if (paths.size() == 5 || paths.size() == 6 || paths.size() == 7 || paths.size() == 8 || paths.size() == 9) {
            // 112
            pictureHeight = height / 3 - 6;
            pictureWidth = width / 3 - 6;
        }
        List<BufferedImage> bufferedImages = new ArrayList<BufferedImage>();
        // 压缩图片所有的图片生成尺寸同意的 为 50x50
        for (int i = 0; i < paths.size(); i++) {
            bufferedImages.add(ImageUtil.resize2(paths.get(i), pictureHeight, pictureWidth, true));
        }

        // BufferedImage.TYPE_INT_RGB可以自己定义可查看API
        BufferedImage outImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        // 生成画布
        Graphics g = outImage.getGraphics();
        Graphics2D g2d = (Graphics2D) g;
        // 设置背景色
        g2d.setBackground(new Color(231,231,231));
        // 通过使用当前绘图表面的背景色进行填充来清除指定的矩形。
        g2d.clearRect(0, 0, width, height);

        // 开始拼凑 根据图片的数量判断该生成那种样式的组合头像目前为4中
        int j = 1;
        for (int i = 1; i <= bufferedImages.size(); i++) {
            if (bufferedImages.size() == 9) {
                if (i <= 3) {
                    g2d.drawImage(bufferedImages.get(i - 1), 112 * (j - 1) + 1,1, null);
                    j ++;
                    if (i == 3) {
                        j = 1;
                    }
                } else if (i > 3 && i <= 6){
                    g2d.drawImage(bufferedImages.get(i - 1), 112 * (j - 1) + 1,112 + 1, null);
                    j++;
                    if (i == 6) {
                        j = 1;
                    }
                } else {
                    g2d.drawImage(bufferedImages.get(i - 1), 112 * (j - 1) + 1,224 + 1, null);
                    j++;
                }
            } else if (bufferedImages.size() == 8) {
                if (i <= 2) {
                    g2d.drawImage(bufferedImages.get(i - 1), 56 + (i - 1) * 112 + 1,1, null);
                } else if (i > 2 && i <= 5){
                    g2d.drawImage(bufferedImages.get(i - 1), 112 * (j - 1) + 1,112 + 1, null);
                    j++;
                    if (i == 5) {
                        j = 1;
                    }
                } else {
                    g2d.drawImage(bufferedImages.get(i - 1), 112 * (j - 1) + 1,224 + 1, null);
                    j++;
                }
            } else if (bufferedImages.size() == 7) {
                if (i == 1) {
                    g2d.drawImage(bufferedImages.get(i - 1), 112 + 2,2, null);
                } else if (i > 1 && i <= 4){
                    g2d.drawImage(bufferedImages.get(i - 1), 112 * (j - 1) + 1,112 + 1, null);
                    j++;
                    if (i == 4) {
                        j = 1;
                    }
                } else {
                    g2d.drawImage(bufferedImages.get(i - 1), 112 * (j - 1) + 1,224 + 1, null);
                    j++;
                }
            } else if (bufferedImages.size() == 6) {
                if (i <= 3) {
                    g2d.drawImage(bufferedImages.get(i - 1), 112 * (i - 1) + 1,56 + 2, null);
                } else {
                    g2d.drawImage(bufferedImages.get(i - 1), 112 * (j - 1) + 1,168 + 2, null);
                    j++;
                }
            } else if (bufferedImages.size() == 5) {
                if (i <= 2) {
                    g2d.drawImage(bufferedImages.get(i - 1), 56 + (i - 1) * 112 + 2, 56, null);
                } else {
                    g2d.drawImage(bufferedImages.get(i - 1), 112 * (j - 1) + 1,168 + 2, null);
                    j++;
                }
            } else if (bufferedImages.size() == 4) {
                if (i <= 2) {
                    g2d.drawImage(bufferedImages.get(i - 1), 168 * (i - 1) + 2, 2, null);
                } else {
                    g2d.drawImage(bufferedImages.get(i - 1), 168 * (j - 1) + 2,168 + 2, null);
                    j++;
                }
            } else if (bufferedImages.size() == 3) {
                if (i <= 1) {
                    g2d.drawImage(bufferedImages.get(i - 1), 84, 2, null);
                } else {
                    g2d.drawImage(bufferedImages.get(i - 1), 168 * (j - 1) + 2,168 + 2, null);
                    j++;
                }
            } else if (bufferedImages.size() == 2) {
                g2d.drawImage(bufferedImages.get(i - 1), 168 * (j - 1) + 2,84 + 2, null);
                j++;
            } else if (bufferedImages.size() == 1) {
                g2d.drawImage(bufferedImages.get(i - 1), 0, 0, null);
            }
            // 需要改变颜色的话在这里绘上颜色。可能会用到AlphaComposite类
        }

        // 创建图像
        // 群头像名称
        String fileName = groupId + ".jpg";
        // 群头像储存路径
        File fileFolder = new File(groupSavePath + groupId);
        // 网络路径
        String route = groupReadPath.substring(0, groupReadPath.length() - 3) + "/" + groupId + "/" + fileName;
        // 本地路径不存在创建
        if (!fileFolder.exists()) {
            fileFolder.mkdirs();
        }
        String outPath = fileFolder.getPath() +  "/" + fileName;
        String format = "JPG";
        ImageIO.write(outImage, format, new File(outPath));
        return route;
    }

    /**
     * 图片缩放
     *
     * @param filePath
     *            图片路径
     * @param height
     *            高度
     * @param width
     *            宽度
     * @param bb
     *            比例不对时是否需要补白
     */
    public static BufferedImage resize2(String filePath, int height, int width, boolean bb) {
        try {
            double ratio = 0; // 缩放比例
            File f = new File(filePath);
            BufferedImage bi = ImageIO.read(f);
            Image itemp = bi.getScaledInstance(width, height,
                    Image.SCALE_SMOOTH);
            // 计算比例
            if ((bi.getHeight() > height) || (bi.getWidth() > width)) {
                if (bi.getHeight() > bi.getWidth()) {
                    ratio = (new Integer(height)).doubleValue() / bi.getHeight();
                } else {
                    ratio = (new Integer(width)).doubleValue() / bi.getWidth();
                }
                AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(ratio, ratio), null);
                itemp = op.filter(bi, null);
            }
            if (bb) {
                BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
                Graphics2D g = image.createGraphics();
                g.setColor(Color.white);
                g.fillRect(0, 0, width, height);
                if (width == itemp.getWidth(null))
                    g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2,
                            itemp.getWidth(null), itemp.getHeight(null),
                            Color.white, null);
                else
                    g.drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0,
                            itemp.getWidth(null), itemp.getHeight(null),
                            Color.white, null);
                g.dispose();
                itemp = image;
            }
            return (BufferedImage) itemp;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

S Y H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值