仿微信9宫格群组头像

开发了一个聊天工具,群组头像像仿照微信的头像那样显示成员头像合成图片,百度了一下,发现没有顺手的,就自己动手写了一个,现在分享给大家。
我所有用户图片都是120*120的,合成图片为132*132,九宫格的话用户图片边到合成图片边为3,依次类推,里面的120,132,40,30等大小根据自己的头像大小灵活变动即可

public static String[] getXy(int size){
String[] s = new String[size];
int _x = 0;
int _y = 0;
if(size ==1){
_x = _y = 6;
s[0] = "6,6";
}
if(size == 2){
_x =_y = 4;
s[0] = "4,"+(132/2-60/2);
s[1] = 60+2*_x+","+ (132/2-60/2);
}
if(size == 3){
_x=_y =4;
s[0] = (132/2-60/2)+","+_y;
s[1] = _x+","+(60+2*_y);
s[2] = (60+2*_y)+","+(60+2*_y);
}
if(size ==4){
_x=_y =4;
s[0] = _x+","+_y;
s[1] = (_x*2 + 60)+","+_y;
s[2] = _x+","+(60+2*_y);
s[3] = (60+2*_y)+","+(60+2*_y);
}
if(size == 5){
_x = _y = 3;
s[0] = (132-40*2-_x)/2+","+(132-40*2-_y)/2;
s[1] = ((132-40*2-_x)/2+40+_x)+","+(132-40*2-_y)/2;
s[2] = _x+","+((132-40*2-_x)/2+40+_y);
s[3] = (_x*2+40)+","+((132-40*2-_x)/2+40+_y);
s[4] = (_x*3+40*2)+","+((132-40*2-_x)/2+40+_y);
}
if(size == 6){
_x = _y = 3;
s[0] = _x+","+((132-40*2-_x)/2);
s[1] = (_x*2+40)+","+((132-40*2-_x)/2);
s[2] = (_x*3+40*2)+","+((132-40*2-_x)/2);
s[3] = _x+","+((132-40*2-_x)/2+40+_y);
s[4] = (_x*2+40)+","+((132-40*2-_x)/2+40+_y);
s[5] = (_x*3+40*2)+","+((132-40*2-_x)/2+40+_y);
}
if(size == 7){
_x=_y =3;
s[0] = (132-40)/2+","+_y;
s[1] = _x+","+(_y*2+40);
s[2] = (_x*2+40)+","+(_y*2+40);
s[3] = (_x*3+40*2)+","+(_y*2+40);
s[4] = _x+","+(_y*3+40*2);
s[5] = (_x*2+40)+","+(_y*3+40*2);
s[6] = (_x*3+40*2)+","+(_y*3+40*2);
}
if(size == 8){
_x=_y =3;
s[0] = (132-80-_x)/2+","+_y;
s[1] = ((132-80-_x)/2+_x+40)+","+_y;
s[2] = _x+","+(_y*2+40);
s[3] = (_x*2+40)+","+(_y*2+40);
s[4] = (_x*3+40*2)+","+(_y*2+40);
s[5] = _x+","+(_y*3+40*2);
s[6] = (_x*2+40)+","+(_y*3+40*2);
s[7] = (_x*3+40*2)+","+(_y*3+40*2);
}
if(size == 9){
_x=_y = 3;
s[0]=_x+","+_y;
s[1] = _x*2+40+","+_y;
s[2] = _x*3+40*2 +","+_y;
s[3] = _x+","+(_y*2+40);
s[4] = (_x*2+40)+","+(_y*2+40);
s[5] = (_x*3+40*2)+","+(_y*2+40);
s[6] = _x+","+(_y*3+40*2);
s[7] = (_x*2+40)+","+(_y*3+40*2);
s[8] = (_x*3+40*2)+","+(_y*3+40*2);
}
return s;
}

public static int getWidth(int size){
int width = 0;
if(size == 1){
width = 120;
}
if(size>1 && size<=4){
width = 60;
}
if(size>=5){
width = 40;
}
return width;
}

public static void download(String urlString, String filename,String savePath) throws Exception {
// 构造URL
URL url = new URL(urlString);
// 打开连接
URLConnection con = url.openConnection();
//设置请求超时为5s
con.setConnectTimeout(5*1000);
// 输入流
InputStream is = con.getInputStream();

// 1K的数据缓冲
byte[] bs = new byte[1024];
// 读取到的数据长度
int len;
// 输出的文件流
File sf=new File(savePath);
if(!sf.exists()){
sf.mkdirs();
}
OutputStream os = new FileOutputStream(sf.getPath()+File.separator+filename);
// 开始读取
while ((len = is.read(bs)) != -1) {
os.write(bs, 0, len);
}
// 完毕,关闭所有链接
os.close();
is.close();
}

public static String zoom(String sourcePath,String targetPath,int width,int height) throws IOException{
File imageFile = new File(sourcePath);
if(!imageFile.exists()){
throw new IOException("Not found the images:"+sourcePath);
}
if(targetPath==null || targetPath.isEmpty()) targetPath = sourcePath;
String format = sourcePath.substring(sourcePath.lastIndexOf(".")+1,sourcePath.length());
BufferedImage image = ImageIO.read(imageFile);
image = zoom(image,width,height);
ImageIO.write(image, format, new File(targetPath));
return targetPath;
}

private static BufferedImage zoom(BufferedImage sourceImage , int width , int height){
BufferedImage zoomImage = new BufferedImage(width, height, sourceImage.getType());
Image image = sourceImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
Graphics gc = zoomImage.getGraphics();
gc.setColor(Color.WHITE);
gc.drawImage( image , 0, 0, null);
return zoomImage;
}

public static void createImage(File[] files,String outPath) throws Exception{
String[] imageSize = getXy(files.length);
int width = getWidth(files.length);
BufferedImage ImageNew = new BufferedImage(132,132,BufferedImage.TYPE_INT_RGB);
//设置背景为白色
for(int m=0;m<132;m++){
for(int n=0;n<132;n++){
ImageNew.setRGB(m, n, 0xFFFFFF);
}
}
for(int i=0;i<imageSize.length;i++){
String size = imageSize[i];
String[] sizeArr = size.split(",");
int x = Integer.valueOf(sizeArr[0]);
int y = Integer.valueOf(sizeArr[1]);
String f = zoom(files[i].getPath(),SystemConfig.getFileFsBase()+File.separator+"group"+File.separator+"temp",width,width);
File fileOne = new File(f);
BufferedImage ImageOne = ImageIO.read(fileOne);

//从图片中读取RGB
int[] ImageArrayOne = new int[width*width];
ImageArrayOne = ImageOne.getRGB(0,0,width,width,ImageArrayOne,0,width);
ImageNew.setRGB(x,y,width,width,ImageArrayOne,0,width);//设置左半部分的RGB
}
File outFile = new File(outPath);
ImageIO.write(ImageNew, "png", outFile);//写图片
}

public static void main(String[] args) throws Exception{

File f = new File("D:\\group");
File[] fArr = f.listFiles();
createImage(fArr,"D:\\group\\g.png");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值