此文章首发于 https://www.jianshu.com/p/394f9b0357b3

最近有个需求,需要App实现群头像仿微信九宫格排列,由于让客户端生成头像显示会比较慢,因此只能用服务端实现这个需求,但是网上找都不是很符合要求,于是自己动手改了下实现了该功能:

public final class ImageUtil {/*** 图片的间隙*/private static final int SIDE = 6;/*** 画板尺寸*/private static final int CANVANS_W = 112;private static final int CANVANS_H = 112;/*** 尺寸1 (小)*/private static final int ONE_IMAGE_SIZE = CANVANS_H - (2 * SIDE);/*** 尺寸2 (中)*/private static final int TWO_IMAGE_SIZE = (CANVANS_H - (3 * SIDE)) / 2;/*** 尺寸3 (大)*/private static final int FIVE_IMAGE_SIZE = (CANVANS_H - (4 * SIDE)) / 3;private ImageUtil() {}/*** 生成群组头像** @param paths   图片链接* @param dir     输出路径* @param groupId 群编号* @return* @throws IOException*/public static boolean getCombinationOfhead(List<String> paths, String dir, String groupId)throws IOException {List<BufferedImage> bufferedImages = new ArrayList<BufferedImage>();int imageSize = 0;if (paths.size() <= 1) {//若为一张图片imageSize = ONE_IMAGE_SIZE;} else if (paths.size() > 1 && paths.size() < 5) {//若为2-4张图片imageSize = TWO_IMAGE_SIZE;} else {//若>=5张图片imageSize = FIVE_IMAGE_SIZE;}for (int i = 0; i < paths.size(); i++) {BufferedImage resize2 = ImageUtil.resize2(paths.get(i), imageSize, imageSize, true);bufferedImages.add(resize2);}BufferedImage outImage = new BufferedImage(CANVANS_W, CANVANS_H, BufferedImage.TYPE_INT_RGB);// 生成画布Graphics g = outImage.getGraphics();Graphics2D g2d = (Graphics2D) g;// 设置背景色g2d.setBackground(new Color(231, 231, 231));// 通过使用当前绘图表面的背景色进行填充来清除指定的矩形。g2d.clearRect(0, 0, CANVANS_W, CANVANS_H);// 开始拼凑 根据图片的数量判断该生成那种样式的组合头像目前为九种for (int i = 1; i <= bufferedImages.size(); i++) {Integer size = bufferedImages.size();switch (size) {case 1:g2d.drawImage(bufferedImages.get(i - 1), SIDE, SIDE, null);break;case 2:if (i == 1) {g2d.drawImage(bufferedImages.get(i - 1), SIDE, (CANVANS_W - imageSize) / 2, null);} else {g2d.drawImage(bufferedImages.get(i - 1), 2 * SIDE + imageSize, (CANVANS_W - imageSize) / 2, null);}break;case 3:if (i == 1) {g2d.drawImage(bufferedImages.get(i - 1), (CANVANS_W - imageSize) / 2, SIDE, null);} else {g2d.drawImage(bufferedImages.get(i - 1), (i - 1) * SIDE + (i - 2) * imageSize, imageSize + (2 * SIDE), null);}break;case 4:if (i <= 2) {g2d.drawImage(bufferedImages.get(i - 1), i * SIDE + (i - 1) * imageSize, SIDE, null);} else {g2d.drawImage(bufferedImages.get(i - 1), (i - 2) * SIDE + (i - 3) * imageSize, imageSize + 2 * SIDE, null);}break;case 5:if (i <= 2) {g2d.drawImage(bufferedImages.get(i - 1), (CANVANS_W - 2 * imageSize - SIDE) / 2 + (i - 1) * imageSize + (i - 1) * SIDE, (CANVANS_W - 2 * imageSize - SIDE) / 2, null);} else {g2d.drawImage(bufferedImages.get(i - 1), (i - 2) * SIDE + (i - 3) * imageSize, ((CANVANS_W - 2 * imageSize - SIDE) / 2) + imageSize + SIDE, null);}
//break;case 6:if (i <= 3) {g2d.drawImage(bufferedImages.get(i - 1), SIDE * i + imageSize * (i - 1), (CANVANS_W - 2 * imageSize - SIDE) / 2, null);} else {g2d.drawImage(bufferedImages.get(i - 1), ((i - 3) * SIDE) + ((i - 4) * imageSize), ((CANVANS_W - 2 * imageSize - SIDE) / 2) + imageSize + SIDE, null);}break;case 7:if (i <= 1) {g2d.drawImage(bufferedImages.get(i - 1), 2 * SIDE + imageSize, SIDE, null);}if (i <= 4 && i > 1) {g2d.drawImage(bufferedImages.get(i - 1), ((i - 1) * SIDE) + ((i - 2) * imageSize), 2 * SIDE + imageSize, null);}if (i <= 7 && i > 4) {g2d.drawImage(bufferedImages.get(i - 1), ((i - 4) * SIDE) + ((i - 5) * imageSize), 3 * SIDE + 2 * imageSize, null);}break;case 8:if (i <= 2) {g2d.drawImage(bufferedImages.get(i - 1), (CANVANS_W - 2 * imageSize - SIDE) / 2 + (i - 1) * imageSize + (i - 1) * SIDE, SIDE, null);}if (i <= 5 && i > 2) {g2d.drawImage(bufferedImages.get(i - 1), ((i - 2) * SIDE) + ((i - 3) * imageSize), 2 * SIDE + imageSize, null);}if (i <= 8 && i > 5) {g2d.drawImage(bufferedImages.get(i - 1), ((i - 5) * SIDE) + ((i - 6) * imageSize), 3 * SIDE + 2 * imageSize, null);}break;case 9:if (i <= 3) {g2d.drawImage(bufferedImages.get(i - 1), (i * SIDE) + ((i - 1) * imageSize), SIDE, null);}if (i <= 6 && i > 3) {g2d.drawImage(bufferedImages.get(i - 1), ((i - 3) * SIDE) + ((i - 4) * imageSize), 2 * SIDE + imageSize, null);}if (i <= 9 && i > 6) {g2d.drawImage(bufferedImages.get(i - 1), ((i - 6) * SIDE) + ((i - 7) * imageSize), 3 * SIDE + 2 * imageSize, null);}break;default:break;}}StringBuffer outPath = new StringBuffer().append(dir).append(File.separatorChar).append("GP-" + groupId).append(".jpg");String format = "JPG";File file = new File(outPath.toString());if (!file.exists()) {file.mkdirs();}return ImageIO.write(outImage, format, file);}/*** 图片缩放** @param filePath 图片路径* @param height   高度* @param width    宽度* @param bb       比例不对时是否需要补白*/public static BufferedImage resize2(String filePath, int height, int width,boolean bb) {try {double ratio = 0; // 缩放比例
//            System.out.println("图片缩放"+filePath);BufferedImage bi = null;if (filePath.indexOf("http://") == 0) {bi = ImageIO.read(new URL(filePath));} else {bi = ImageIO.read(new File(filePath));}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;}/*** 删除文件* @param path* @param filename*/public void delFile(String path, String filename) {File file = new File(path + "/" + filename);if (file.exists() && file.isFile()) {file.delete();}}/*** 可依次生成九种情况的群头像** @param args* @throws IOException*/public static void main(String[] args) throws IOException {Integer groupId = 0;for (int i = 1; i < 10; i++) {List<String> list = new ArrayList<>();for (int j = 0; j < i; j++) {//本地图片路径或者网络图片路径list.add("/Users/Basil/Desktop/1.jpg");}File file = new File("");//生成目录String path = file.getCanonicalPath() + "/src/main/webapp/temp/";groupId++;ImageUtil.getCombinationOfhead(list, path, groupId.toString());}}

生成的效果图:

详细效果图:

JAVA-仿微信九宫格头像相关推荐

  1. java工具类-java仿微信九宫格头像

    创建Utils类 ImageUtil package com.mrd.utils;import javax.imageio.ImageIO; import java.awt.Color; import ...

  2. java 头像 微信群_仿微信群头像九宫格控件 LQRNineGridImageView

    软件介绍 仿微信群头像九宫格控件 一.简介: 参照Android 仿微信群聊头像文章学习开发的一个仿微信群头像九宫格控件,感谢博主Loften_93663469. 效果如下: 二.使用: 1.在自己项 ...

  3. java 头像 微信群_JAVA-仿微信九宫格头像

    最近有个需求,需要App实现群头像仿微信九宫格排列,由于让客户端生成头像显示会比较慢,因此只能用服务端实现这个需求,但是网上找都不是很符合要求,于是自己动手改了下实现了该功能: public fina ...

  4. php 合成微信头像,PHP 图片合成、仿微信群头像的方法示例

    搜索热词 本文实例讲述了PHP 图片合成.仿微信群头像的方法.分享给大家供大家参考,具体如下: 参考文章: 作者:凯歌~,PHP图片合成方法(多张图片合成一张)https://www.jb51.net ...

  5. Android显示九宫图(自定义圆角,仿微信九宫格图)

    详细解析Android显示九宫图(自定义圆角,仿微信九宫格图) 这是一个自定义九宫格图片框架,里面有设置圆角大小,还有当图片一张的时候控件自定义的大小,图片的间隔,四张图片的时候图片自定义为两行两列等 ...

  6. Java仿微信时间显示

    Java仿微信时间显示 需求 代码实现 1.dto类设计 2.controller层 3.service层 4.时间格式化(service层) 4.分组函数(service层) 总结 需求 微信聊天消 ...

  7. 仿微信换头像(旋转、还原、裁剪、缩放等)

    突然来个需求应用里的头像上传要仿微信的,拖动和放大的是图片,裁剪框不动,可以90℃旋转还原啥的.开始还以为会百度一堆demo出来呢.没想到,并没有一样的.要么只有旋转,要么只要裁剪缩放没有旋转的.没有 ...

  8. 仿微信九宫格群聊view

    效果如下: 自定义view的源码 public class NineGridImageView<T> extends ViewGroup {private int mRowCount;// ...

  9. java 头像 微信群_仿微信群头像css布局

    css ul,li{ list-style: none; margin: 0; padding: 0; background-color: #eee; } ul{ width: 240px; heig ...

最新文章

  1. 8岁上海小学生B站教编程惊动苹果CEO,库克亲送生日祝福
  2. _DataStructure_C_Impl:SeqListBasedSort
  3. python的__get__、__set__、__delete__(1)
  4. java中IO流用到了哪种设计模式
  5. 电子计算机的大脑核心是什么,戴君惕《人脑与电脑》初中说明文阅读题及答案...
  6. php与mysql列表_PHP+Mysql+jQuery实现的查询和列表框选择
  7. 使用before、after伪类制作三角形
  8. 小学奥数 7649 我家的门牌号 python
  9. asp.net绑定checkboxlist--------jquery绑定click事件,获取checkbox的value和显示值
  10. 小程序利用云函数获取手机号码
  11. Python学习笔记——python基础之Python实现名片管理系统
  12. 【vscode】vscode插件学习(五)
  13. 第二工业大学计算机应用大专录取分,上海第二工业大学2017年分省分专业录取分数线...
  14. Android开发-模拟器推荐
  15. from_unixtime()与UNIX_TIMESTAMP
  16. Ansys electronics desktop 2020R1安装之后出现了很大的问题
  17. obs 推 rtsp 流
  18. RTOS IPV6笔记
  19. 产品经理待遇有多少?揭秘产品经理真实收入
  20. 二进制兼容ABI-C++库注意事项

热门文章

  1. 【AIS学习】08:6比特ASCII码表
  2. 软件开发过程中的各种文档
  3. uos软件打包注意事项
  4. android framework-zygote进程
  5. 模糊查询和sql语句的拼接
  6. 达芬奇系列教程1——安装及屏幕显示字体太小问题解决
  7. OpenCV 图片去水印(不需要自己做水印模板)
  8. 串口的使用–蓝牙模块
  9. FILETIME to DateTime
  10. 算法总结 — 并查集