如何将多个头像合成类似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 ...
随机推荐
- 最全的Android源码目录结构详解(转)
Android 2.1|-- Makefile|-- bionic (bionic C库)|-- bootable (启动 ...
- PHP设计模式之装饰者模式
<?php /* 装饰者模式动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. */ header("Content-type:text/html; cha ...
- (转)CWnd与HWND的区别与转换
一.区别HWND是句柄,CWnd是MFC窗体类,CWnd中包含HWND句柄成员对象是m_hWnd.HWND是Windows系统中对所有窗口的一种标识,即窗口句柄.这是一个SDK概念. CWnd是M ...
- nodejs模拟http-post文件的方法示例
var fs = require("fs"); var http = require('http'); function PostFileToServer(sFileName, d ...
- AutoCompleteTextView不能使用的问题
AutoCompleteTextView按照网络上的方法写之后不能使用 解决方法: android:layout_width="fill_parent" 而不能是wrap_pare ...
- bootstrap按钮加载状态改变
bootstrap里面有个激活按钮的时候,按钮变成不可用的: 按照官网里面的方法介绍是在button按钮加个data-loading-text="Loading..."属性,然后j ...
- 《A Tour of PostgreSQL Internals》学习笔记——进程间通信
中秋节假期这么快就没了,这几天还一直下雨,索性在家看看书.这次看的是Tom Lane的<A Tour of PostgreSQL Internals>.这篇小随笔就算做学习笔记了.园子里面 ...
- jquery的一些技巧总结
1.使用方法在需要使用JQuery的页面中引入JQuery的js文件即可.例如:<script type="text/javascript" src="js/jqu ...
- VC++2010配置使用MySQL5.6
0.前提 安装后的文件概览 编译器: VC++2010 MySQL版本:MySQL5.6.19 for win64 Connector版本:connector c++ 1.1.3 在VS2010 ...
- 对人脑处理视觉的描述(摘《学习OpenCV(中文版)》)
人脑将视觉信号划分入很多个通道,将各种不同的信息输入你的大脑.你的大脑有一个关注系统,会根据任务识别出图像的重要部分,并做重点分析,而其他部分则分析得较少 .在人类视觉流中存在大量的反馈,但是目前我们 ...