`
dreamoftch
  • 浏览: 498023 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java生成群头像

 
阅读更多

 

参考:http://www.2cto.com/weixin/201503/382943.html

 

通过java生成类似微信的群头像:

 

package com.tch.test.common.image;
 
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.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
 
/**
 * 图片处理类
 */
public final class ImageUtil {
	
    /** 图片格式:JPG */
    private static final String PICTRUE_FORMATE_JPG = "JPG";
    private static final int PIC_WIDTH = 400; // 这是画板的宽高
    private static final int PIC_HEIGHT = 400; // 这是画板的高度
 
    private ImageUtil() {
    }
    
    public static void main(String[] args) throws IOException {
    	String destPath = "/media/tch/disk1/study/temp/folder/";
    	List<String> sourcePics = new ArrayList<>();
    	sourcePics.add("http://h.hiphotos.baidu.com/zhidao/pic/item/eac4b74543a9822628850ccc8c82b9014b90eb91.jpg");
    	sourcePics.add("http://h.hiphotos.baidu.com/zhidao/pic/item/3812b31bb051f81991b9d8dbdcb44aed2f73e787.jpg");
    	sourcePics.add("http://cdn.duitang.com/uploads/item/201412/19/20141219154459_3P4G2.jpeg");
    	sourcePics.add("http://img4.duitang.com/uploads/item/201603/12/20160312211255_nB5mQ.thumb.700_0.jpeg");
    	sourcePics.add("http://h.hiphotos.baidu.com/zhidao/pic/item/c8177f3e6709c93d0f5f00e79b3df8dcd1005474.jpg");
    	sourcePics.add("http://ww1.sinaimg.cn/crop.7.22.1192.1192.1024/5c6defebjw8epti0r9noaj20xc0y1n0x.jpg");
    	sourcePics.add("http://ww1.sinaimg.cn/crop.0.0.800.800.1024/735510dbjw8eoo1nn6h22j20m80m8t9t.jpg");
    	sourcePics.add("http://ww2.sinaimg.cn/crop.0.0.1242.1242.1024/005EWUXPjw8eto7cdd42wj30yi0yiabz.jpg");
    	sourcePics.add("http://ww2.sinaimg.cn/crop.0.0.1080.1080.1024/d773ebfajw8eum57eobkwj20u00u075w.jpg");
    	for(int i = 1; i <= sourcePics.size(); i++){
    		getGroupAvatar(sourcePics.subList(0, i), destPath + "out" + i + ".jpg");
    	}
	}
    
    /**
     * 生成群头像
     * @param userAvatars 用户头像
     * @throws IOException
     */
    public static void getGroupAvatar(List<String> userAvatars, String destPath) throws IOException {
    	int totalPicNum = userAvatars.size();
    	PicInfo picInfo = getPicInfo(totalPicNum);
        List<BufferedImage> bufferedImages = new ArrayList<BufferedImage>();
        // 压缩图片所有的图片生成尺寸
        for (int i = 0; i < totalPicNum; i++) {
            bufferedImages.add(resizeNetWorkImage(userAvatars.get(i), picInfo.getPerPicWith(), picInfo.getPerPicHeight(), true));
        }
        BufferedImage outImage = new BufferedImage(PIC_WIDTH, PIC_HEIGHT, BufferedImage.TYPE_INT_RGB);
        // 生成画布
        Graphics graphics = outImage.getGraphics();
        Graphics2D graphics2d = (Graphics2D) graphics;
        graphics2d.setBackground(new Color(231,231,231));
        graphics2d.clearRect(0, 0, PIC_WIDTH, PIC_HEIGHT);
        //开始将单个图片逐个画到画布上
        for (int picIndex = 0; picIndex < bufferedImages.size(); picIndex++) {
        	if(totalPicNum == 2 || totalPicNum == 5 || totalPicNum == 6){
        		//需要特殊处理,来让图片垂直居中
        		specialDraw(bufferedImages.get(picIndex), picIndex, picInfo, graphics2d, totalPicNum);
        	}else{
        		//不需要特殊处理,按照正常的处理逻辑
        		normalDraw(bufferedImages.get(picIndex), picIndex, picInfo, graphics2d);
        	}
        }
        //将最终结果图片输出到指定文件
        ImageIO.write(outImage, PICTRUE_FORMATE_JPG, new File(destPath));
    }

    private static void specialDraw(BufferedImage bufferedImage, int picIndex, PicInfo picInfo, Graphics2D graphics2d, int totalPicNum) {
    	int xIndex = (picIndex % picInfo.getPicNumPerRow());
    	int y = 0;
    	if(totalPicNum == 2){
    		y = PIC_HEIGHT / 4;
    	}else if(totalPicNum == 5 || totalPicNum == 6){
    		if(picIndex < 3){
    			y = (PIC_HEIGHT / 2 - PIC_HEIGHT / 3);
    		}else{
    			y = PIC_HEIGHT / 2;
    		}
    	}
		graphics2d.drawImage(bufferedImage, xIndex * picInfo.getPerPicWith(), y, null);
	}

	private static void normalDraw(BufferedImage bufferedImage, int picIndex, PicInfo picInfo, Graphics2D graphics2d) {
    	int xIndex = (picIndex % picInfo.getPicNumPerRow());
		int yIndex = (picIndex / picInfo.getPicNumPerRow());
		graphics2d.drawImage(bufferedImage, xIndex * picInfo.getPerPicWith(), yIndex * picInfo.getPerPicHeight(), null);
	}

	/**
     * 图片缩放
     * @param filePath 图片路径
     * @param width 宽度
     * @param height 高度
     * @param fillWhite 比例不对时是否需要补白
     */
    public static BufferedImage resizeImage(BufferedImage bufferedImage, int width, int height, boolean fillWhite) {
        double ratio = 0; // 缩放比例
		Image newImage = bufferedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
		// 计算比例
		if ((bufferedImage.getHeight() > height) || (bufferedImage.getWidth() > width)) {
		    if (bufferedImage.getHeight() > bufferedImage.getWidth()) {
		        ratio = (new Integer(height)).doubleValue()/bufferedImage.getHeight();
		    } else {
		        ratio = (new Integer(width)).doubleValue()/bufferedImage.getWidth();
		    }
		    AffineTransformOp affineTransformOp = new AffineTransformOp(AffineTransform.getScaleInstance(ratio, ratio), null);
		    newImage = affineTransformOp.filter(bufferedImage, null);
		}
		if (fillWhite) {
		    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 == newImage.getWidth(null)){
		    	g.drawImage(newImage, 0, (height - newImage.getHeight(null))/2, newImage.getWidth(null), newImage.getHeight(null), Color.white, null);
		    }else{
		    	g.drawImage(newImage, (width - newImage.getWidth(null))/2, 0, newImage.getWidth(null), newImage.getHeight(null), Color.white, null);
		    }
		    g.dispose();
		    newImage = image;
		}
		return (BufferedImage) newImage;
    }
    
    /**
     * 缩放本地图片
     * @param file
     * @param width
     * @param height
     * @param fillWhite
     * @return
     */
    public static BufferedImage resizeLocalImage(File file, int width, int height, boolean fillWhite) {
        try {
        	//从本地加载图片
            BufferedImage bufferedImage = ImageIO.read(file);
            return resizeImage(bufferedImage, width, height, fillWhite);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 缩放网络图片
     * @param imageUrl
     * @param width
     * @param height
     * @param fillWhite
     * @return
     */
    public static BufferedImage resizeNetWorkImage(String imageUrl, int width, int height, boolean fillWhite) {
        try {
        	//从网络加载图片
            BufferedImage bufferedImage = ImageIO.read(new URL(imageUrl));
            return resizeImage(bufferedImage, width, height, fillWhite);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 获取群头像中每行/列显示的图片数
     * @param picNum 图片数量
     * @return
     */
    private static PicInfo getPicInfo(int totalPicNum){
    	//每行显示图片数
    	int picNumPerRow = 1;
    	//每列显示图片数
    	int picNumPerCol = 1;
    	switch (totalPicNum) {
		case 1:
			picNumPerRow = 1;
			picNumPerCol = 1;
			break;
		case 2:
			picNumPerRow = 2;
			picNumPerCol = 1;
			break;
		case 3:
		case 4:
			picNumPerRow = 2;
			picNumPerCol = 2;
			break;
		case 5:
		case 6:
			picNumPerRow = 3;
			picNumPerCol = 2;
			break;
		case 7:
		case 8:
		case 9:
			picNumPerRow = 3;
			picNumPerCol = 3;
			break;
		default:
			picNumPerRow = 1;
			picNumPerCol = 1;
			break;
		}
    	int perPicWith = PIC_WIDTH/picNumPerRow;
    	int perPicHeight = PIC_HEIGHT/picNumPerCol;
    	
    	//图片有效宽/高
    	int effectWithHeight = Math.min(perPicWith, perPicHeight);
    	
    	PicInfo picInfo = new PicInfo();
    	//图片的宽高统一
    	picInfo.setPerPicWith(effectWithHeight);
    	picInfo.setPerPicHeight(effectWithHeight);
    	picInfo.setPicNumPerRow(picNumPerRow);
    	picInfo.setPicNumPerCol(picNumPerCol);
    	return picInfo;
    }
    
    /**
     * 图片位置
     * @author tianchaohui
     */
    public static class PicLocation{
    	//横坐标
    	int xIndex = 0;
    	//纵坐标
        int yIndex = 0;
		public int getxIndex() {
			return xIndex;
		}
		public void setxIndex(int xIndex) {
			this.xIndex = xIndex;
		}
		public int getyIndex() {
			return yIndex;
		}
		public void setyIndex(int yIndex) {
			this.yIndex = yIndex;
		}
    }
    
    /**
     * 填充图片信息
     * @author tianchaohui
     */
    public static class PicInfo{
    	//每张图片宽度
    	private int perPicWith;
    	//每张图片高度
    	private int perPicHeight;
    	//每行显示图片数
    	int picNumPerRow;
    	//每列显示图片数
    	int picNumPerCol;
		public int getPerPicWith() {
			return perPicWith;
		}
		public void setPerPicWith(int perPicWith) {
			this.perPicWith = perPicWith;
		}
		public int getPerPicHeight() {
			return perPicHeight;
		}
		public void setPerPicHeight(int perPicHeight) {
			this.perPicHeight = perPicHeight;
		}
		public int getPicNumPerRow() {
			return picNumPerRow;
		}
		public void setPicNumPerRow(int picNumPerRow) {
			this.picNumPerRow = picNumPerRow;
		}
		public int getPicNumPerCol() {
			return picNumPerCol;
		}
		public void setPicNumPerCol(int picNumPerCol) {
			this.picNumPerCol = picNumPerCol;
		}
		@Override
		public String toString() {
			return "PicInfo [perPicWith=" + perPicWith + ", perPicHeight=" + perPicHeight + ", picNumPerRow="
					+ picNumPerRow + ", picNumPerCol=" + picNumPerCol + "]";
		}
    }
 
}

 

 

分享到:
评论

相关推荐

    Java获取Avatar头像工具类

    Java获取Avatar头像图片工具类。输入参数为Avatar注册邮箱地址,就能生成对应注册邮箱的Avatar头像链接。WordPress头像。

    微信群组九宫图java后台生成

    "微信群组九宫图java后台生成"是一个常见的需求,特别是在社交应用或者群管理工具的开发中。这个话题涉及到的是如何使用Java来创建一个九宫格图像,这种图像通常用于展示微信群组成员的头像,就像微信自身应用中的...

    钉钉生成用户名默认头像

    当用户没有上传头像时,像钉钉app一样可以根据用户名字生成用户名后两位的默认头像,颜色大小都可在工具类里自定义

    微信群聊生成九宫格形式的头像

    至于提供的源码,"JavaApk源码说明.txt"可能是对源代码的简单说明,"下载更多打包源码~.url"可能是指向更多相关源码的链接,而"防微信群聊九宫格头像"可能是包含具体实现的Java源文件,可以从中学习到上述技术的具体...

    仿微群聊合成1到9个人头像

    本话题主要关注如何使用Java或Android技术来实现“仿微群聊合成1到9个人头像”的功能。 首先,我们需要理解头像合成就是一门图像处理的艺术,它涉及到图片的裁剪、缩放、位置调整以及最终的合并。在这个过程中,...

    基于Java实现,动态生成二维码海报和汉字名字工具_java_代码_下载

    在本项目中,我们关注的是一个基于Java实现的图片生成工具,主要功能是动态生成二维码海报和汉字名字头像。这个工具对于需要快速创建个性化图片的开发者或设计师来说非常实用,尤其是在进行数字营销或者个人品牌推广...

    java二维码生成和添加中间图片

    Java二维码生成技术是一种在软件开发中常用的功能,它允许我们将数据编码成二维图像,以便于快速扫描和读取。Qrcode(二维码)是日本Denso Wave公司发明的一种矩阵式条形码,相比于传统的条形码,它能存储更多的数据...

    java生成二维码,中间带logo,logo居中,完美实现

    在Java编程环境中,生成带有logo的二维码是一种常见的需求,尤其在品牌推广或个性化设计中。本文将详细讲解如何使用Java实现这一功能,并确保logo居中且大小可调,以达到完美的视觉效果。 首先,我们需要引入生成...

    java实现上传头像裁剪头像保存头像

    在Java编程环境中,实现上传、裁剪以及保存头像的功能是一项常见的需求,尤其在Web应用或者移动应用中。本教程将深入探讨如何实现这一过程,主要关注上传接口的设计、图片处理技术以及文件存储策略。 首先,我们...

    java 生成二维码 且中间 带图片(logo) 的方法

    在Java编程环境中,生成带有图片(logo)的二维码是一项实用的技术,这通常涉及到图像处理和二维码编码库的结合使用。以下是一种实现这个功能的方法,基于`com.google.zxing`库,一个广泛使用的二维码生成库。 首先...

    生成中间带有头像的二维码

    生成带有头像的二维码则是二维码技术的一种创新应用,它将个人头像与二维码信息结合,使得二维码更加个性化,同时也提升了识别度。本篇文章将详细探讨如何生成中间带有头像的二维码,以及这一过程中的关键技术和步骤...

    根据中文首字生成图片如头像等场景需求

    在IT行业中,根据中文首字生成图片是一种常见的个性化定制服务,尤其在用户头像生成、社交媒体标识等方面有广泛应用。这个场景需求通常涉及到图像处理、文本处理以及编程技术。以下是相关知识点的详细介绍: 1. **...

    java生成微信小程序分享图海报图的全过程 可作为util直接使用

    这篇文章将详细介绍如何使用Java来生成高质量且不失真的小程序分享图和海报图,并将其转换为可以直接复用的工具类。我们将探讨以下几个关键知识点: 1. **图片处理库**:首先,我们需要一个强大的Java图片处理库,...

    java头像剪上传剪切设置大小,生成固定缩略图大小

    在Java编程语言中,处理图像任务,如头像剪切、上传、设置大小以及生成固定缩略图,是一项常见的需求。这些操作广泛应用于社交媒体、个人资料管理或任何需要用户自定义头像的系统中。本篇文章将深入探讨如何使用Java...

    生成带头像的二维码并保存分享的demo

    在IT行业中,生成带头像的二维码并实现保存与分享是一项常见的需求,特别是在移动应用和社交媒体领域。这个"生成带头像的二维码并保存分享的demo"提供了实现这一功能的实例代码,具有良好的注释和可扩展性。下面我们...

    Java 实现头像的剪切和上传功能

    在Java开发中,头像的剪切和上传功能是一项常见的需求,特别是在Web应用中,比如社交网络、用户注册等场景。本教程将详细介绍如何使用Java技术栈,结合jQuery ImgCrop库,来实现这一功能。 首先,我们需要理解头像...

    java头像上传并预览

    综上所述,Java头像上传并预览涉及到前端文件选择、实时预览、Ajax提交、后端文件接收与处理、图片预览生成等多个环节,需要掌握的知识点包括HTML5文件API、前端与后端交互、Java Web框架、文件存储策略、图像处理等...

    java 生成二维码demo

    在Java编程语言中,生成二维码是一项常见的任务,尤其在移动应用、网站链接分享等领域广泛应用。...现在,你可以下载提供的"java 生成二维码demo"压缩包,解压后运行示例代码,体验一下Java生成二维码的便捷性。

    钉钉生成用户名默认头像01

    在生成头像的过程中,颜色和大小的自定义是提升用户体验的重要方面。这可能涉及到色彩选择算法,以确保生成的头像与应用的整体设计风格保持一致,同时适应不同尺寸的需求。`CreateImgUtil`类中可能会包含设置颜色和...

    java版上传头像裁剪

    【Java版上传头像裁剪】是一个典型的Web应用功能,主要涉及到的技术包括JSP、Servlet、JavaScript以及图像处理。在本项目中,用户可以上传个人头像,然后系统会对上传的图片进行裁剪,生成适合特定尺寸的头像。下面...

Global site tag (gtag.js) - Google Analytics