如何将多个头像合成类似QQ的群头像?
如上图所示,如何用java将单一的图片合成如上群头像。
在一个正方形外框中,要将多个图片合成上述图片。首先要做的是,依据圆相交的程度,计算圆心坐标与图片间空白区域大小。然后设计不同位置的切割模具,最后再将切割好的单一图片,在最终承载的图片上的指定位置绘制出来,即可完成整个合并过程。
参考代码如下:
private String exe5(List<String> urls) throws IOException {
int size = 220, wihteSize = 15;
int x = 130, y = 0;
 
BufferedImage imageNew = new BufferedImage(480, 480, BufferedImage.TYPE_INT_ARGB);
 
Graphics2D graphics2DNew = imageNew.createGraphics();
imageNew = graphics2DNew.getDeviceConfiguration().createCompatibleImage(480, 480, Transparency.TRANSLUCENT);
graphics2DNew.dispose();
graphics2DNew = imageNew.createGraphics();
graphics2DNew.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 
for(int i = 0; i < urls.size(); i++) {
String fileName = urls.get(i);
 
Area tempArea = new Area();
Ellipse2D.Double circle0 = new Ellipse2D.Double(wihteSize, wihteSize, size - 2 * wihteSize, size - 2 * wihteSize);
if (i == 0) {
Ellipse2D.Double circle1 = new Ellipse2D.Double(-130, 112, size, size);
tempArea.add(new Area(circle0));
tempArea.subtract(new Area(circle1));
} else if (i == 1) {
Ellipse2D.Double circle1 = new Ellipse2D.Double(53, 148, size, size);
tempArea.add(new Area(circle0));
tempArea.subtract(new Area(circle1));
} else if(i == 2) {
Ellipse2D.Double circle1 = new Ellipse2D.Double(153, 0, size, size);
tempArea.add(new Area(circle0));
tempArea.subtract(new Area(circle1));
} else if(i == 3) {
Ellipse2D.Double circle1 = new Ellipse2D.Double(53, -148, size, size);
tempArea.add(new Area(circle0));
tempArea.subtract(new Area(circle1));
} else {
Ellipse2D.Double circle1 = new Ellipse2D.Double(-130, -112, size, size);
tempArea.add(new Area(circle0));
tempArea.subtract(new Area(circle1));
}
 
graphics2DNew.drawImage(drawImage(fileName, size, tempArea), x, y, null);
if(i == 0) {
x = 0;
y = 112;
} else if (i == 1) {
x = 54;
y = 260;
} else if (i == 2) {
x = 207;
y = 260;
} else if (i == 3) {
x = 260;
y = 112;
} else {
x = 260;
y = 112;
}
}
graphics2DNew.dispose();
 
……
}
 
/**
* 往模具中填充图片
* @param fileName
* @param size
* @return
* @throws IOException
*/
private BufferedImage drawImage(String fileName, int size, Area area) throws IOException {
BufferedImage bufferedImage = zipImage(fileName, size);
 
BufferedImage tempBufferImage = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = tempBufferImage.createGraphics();
 
tempBufferImage = g2d.getDeviceConfiguration().createCompatibleImage(size, size, Transparency.TRANSLUCENT);
g2d.dispose();
g2d = tempBufferImage.createGraphics();
 
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 
g2d.setClip(area);
g2d.fill(area);
 
g2d.drawImage(bufferedImage, 0, 0, null);
 
g2d.dispose();
 
return tempBufferImage;
}
 
合成之后的图片会有一定的毛刺,但是缩小看之后,就无法分辨出来。因此,在客户端进行展示的时候,取缩略图就可以满足需求。

Java图片处理(一)图片合成的更多相关文章

  1. Java+jquery实现裁剪图片上传到服务器

    大体分两步: 1.利用jquery裁剪图片,把裁剪到的几个点传入后端 2.利用前端传入的几个点,来裁剪图片 首先,用到一个jquery的插件 imgAreaSelect 实例及插件下载地址:http: ...

  2. java画图程序_图片用字母画出来_源码发布_版本二

    在上一个版本:java画图程序_图片用字母画出来_源码发布 基础上,增加了图片同比例缩放,使得大像素图片可以很好地显示画在Notepad++中. 项目结构: 运行效果1: 原图:http://imag ...

  3. java画图程序_图片用字母画出来_源码发布

    在之前写了一篇blog:java画图程序_图片用字母画出来 主要是把一些调试的截图发布出来,现在程序调试我认为可以了(当然,你如果还想调试的话,也可以下载源码自己调试). 就把源码发布出来. 项目结构 ...

  4. java画图程序_图片用字母画出来

    最近在研究怎样将图片用字母在文本编辑工具中“画”出来. 你看了这个可能还不知道我想说什么? 我想直接上图,大家一定就知道了 第一张:小猫 原图:http://www.cnblogs.com/hongt ...

  5. [Java] JavaMail 发送带图片的 html 格式的邮件

    JavaMail 发送的邮件正文和附件是相互独立的,但是内置图片需要定位图片在正文中的位置,所以内置图片和邮件正文是互相依赖的. 发送带附件的邮件可参考JavaMail 发送 html 格式.带附件的 ...

  6. java用户界面——加载图片 jpg GIF

    java用户界面--加载图片 jpg GIF 代码如下: package day08; import java.awt.GridLayout; import javax.swing.Icon;impo ...

  7. Java爬取 百度图片Google图片Bing图片

    先看看抓取的结果. 8个Java类: Startup.java - main函数 ImageCrawler.java - Crawler基类 BaiduImageCrawler.java - 百度图片 ...

  8. java多图片上传--前端实现预览--图片压缩 、图片缩放,区域裁剪,水印,旋转,保持比例。

    java多图片上传--前端实现预览 前端代码: https://pan.baidu.com/s/1cqKbmjBSXOhFX4HR1XGkyQ 解压后: java后台: <!--文件上传--&g ...

  9. java关于图片处理修改图片大小

    最近做了一个关于图片浏览的内容.因为图片都是一些证件的资料的扫描件所以比较大,对系统的影响也是非常之大的,有很大可能直接把系统干死.那么我是这么处理的,给大家分享一下.如果大家有好的方案的话一定要早点 ...

  10. java中如何把图片转换成二进制流的代码

    在学习期间,把开发过程经常用到的一些代码段做个备份,下边代码内容是关于java中如何把图片转换成二进制流的代码,应该能对各朋友也有用处. public byte[] SetImageToByteArr ...

随机推荐

  1. Dom对象的方法应用一getElementById技巧、getElementsByName() IE,firefox兼容

    在document对象中有以下三个方法,对于程序员来说,真可谓无人不知,无人不晓,他们分别是: 1.getElementById()                  返回对拥有指定 id 的第一个对 ...

  2. 基于jquery框架的ajax搜索显示

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  3. (六)6.12 Neurons Networks from self-taught learning to deep network

    self-taught learning 在特征提取方面完全是用的无监督的方法,对于有标记的数据,可以结合有监督学习来对上述方法得到的参数进行微调,从而得到一个更加准确的参数a. 在self-taug ...

  4. 【英语】Bingo口语笔记(58) - blow系列

  5. 【英语】Bingo口语笔记(66) - 美式发音特点

  6. linux 命令部分说明

    shell 文件头格式   #! /bin/sh 定义变量  dir_tmp=/tmp/xxx 级联创建 mkdir -p /etc/aaa/bbb 阻塞命令 等待用户输入回车  继续    read ...

  7. xsheell的下载安装初级使用

    1)关于Xshell 网上更多的资料里提到的SSH客户端是putty,因为简单.开源.免费.但是也正是由于功能过于简单,所以在这里推荐大家使用Xshell. Xshell最初并不能免费使用,而且也没有 ...

  8. jQuery基础知识--Form基础

    form中的单行文本获取和失去焦点 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...

  9. 嵌入式 hi3518平台以太网网络模块设计包括重连机制和网线检测机制

    <span style="font-family:Courier New;"> #include <sys/types.h> #include <st ...

  10. Android中垃圾回收日志信息

    原因 GC_CONCURRENTfreed 178K, 41% free 3673K/6151K, external 0K/0K, paused 2ms+2msGC_EXPLICITfreed 6K, ...