如何将多个头像合成类似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+jquery实现裁剪图片上传到服务器
大体分两步: 1.利用jquery裁剪图片,把裁剪到的几个点传入后端 2.利用前端传入的几个点,来裁剪图片 首先,用到一个jquery的插件 imgAreaSelect 实例及插件下载地址:http: ...
-
java画图程序_图片用字母画出来_源码发布_版本二
在上一个版本:java画图程序_图片用字母画出来_源码发布 基础上,增加了图片同比例缩放,使得大像素图片可以很好地显示画在Notepad++中. 项目结构: 运行效果1: 原图:http://imag ...
-
java画图程序_图片用字母画出来_源码发布
在之前写了一篇blog:java画图程序_图片用字母画出来 主要是把一些调试的截图发布出来,现在程序调试我认为可以了(当然,你如果还想调试的话,也可以下载源码自己调试). 就把源码发布出来. 项目结构 ...
-
java画图程序_图片用字母画出来
最近在研究怎样将图片用字母在文本编辑工具中“画”出来. 你看了这个可能还不知道我想说什么? 我想直接上图,大家一定就知道了 第一张:小猫 原图:http://www.cnblogs.com/hongt ...
-
[Java] JavaMail 发送带图片的 html 格式的邮件
JavaMail 发送的邮件正文和附件是相互独立的,但是内置图片需要定位图片在正文中的位置,所以内置图片和邮件正文是互相依赖的. 发送带附件的邮件可参考JavaMail 发送 html 格式.带附件的 ...
-
java用户界面——加载图片 jpg GIF
java用户界面--加载图片 jpg GIF 代码如下: package day08; import java.awt.GridLayout; import javax.swing.Icon;impo ...
-
Java爬取 百度图片Google图片Bing图片
先看看抓取的结果. 8个Java类: Startup.java - main函数 ImageCrawler.java - Crawler基类 BaiduImageCrawler.java - 百度图片 ...
-
java多图片上传--前端实现预览--图片压缩 、图片缩放,区域裁剪,水印,旋转,保持比例。
java多图片上传--前端实现预览 前端代码: https://pan.baidu.com/s/1cqKbmjBSXOhFX4HR1XGkyQ 解压后: java后台: <!--文件上传--&g ...
-
java关于图片处理修改图片大小
最近做了一个关于图片浏览的内容.因为图片都是一些证件的资料的扫描件所以比较大,对系统的影响也是非常之大的,有很大可能直接把系统干死.那么我是这么处理的,给大家分享一下.如果大家有好的方案的话一定要早点 ...
-
java中如何把图片转换成二进制流的代码
在学习期间,把开发过程经常用到的一些代码段做个备份,下边代码内容是关于java中如何把图片转换成二进制流的代码,应该能对各朋友也有用处. public byte[] SetImageToByteArr ...
随机推荐
-
Ubuntu14.04解决远程root-ssh拒绝登录
(1)查看ip地址是否冲突 我在单位的虚拟机ip地址是192.168.14.85,与其它机器冲突了.改成了192.168.14.83 (2)关闭Ubuntu14.04的防火墙 root@stgman- ...
-
const的位置与区别
转自 http://www.cnblogs.com/wucx/p/4566176.html 一个比较经典的问题——问以下两种声明的区别:1) const char * p2) char * co ...
-
DB2 for z: system catalog tables
http://www.ibm.com/support/knowledgecenter/SSEPEK_10.0.0/com.ibm.db2z10.doc.sqlref/src/tpc/db2z_cata ...
-
Asp程序的IIS发布
-
php排序之冒泡排序
冒泡排序比较简单.作为很多公司面试笔试题常常出现,要求手写该排序算法.双层循环,不断的与后面的比较,如果大于后面的,调换两者顺序即可. 演示效果如图: 代码如下: <?php function ...
-
WPF里面的常用笔刷
程序运行效果 <Window x:Class="This_brush.MainWindow" xmlns="http://schemas.microsoft.com ...
-
ExtJS001HelloWorld弹窗
html页面 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" ...
-
Java Day03 面向对象程序设计
1.面向对象 面向对象是指一种程序设计泛型,同时也是一种程序开发的方法. 2.类 类是一种抽象的概念,类中包含了数据与对数据的操纵. 具有相同特性(数据元素)和行为(功能)的对象的抽象就是类.类是对象 ...
-
Spark报错
1. Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at com.mysql.jdb ...
-
lsof 命令用法详解
lsof 命令用法详解 作用 用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP.UDP).找回/恢复删除的文件.是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所 ...