使用Java实现图像分割
为减少动画制作过程中的IO操作,我们可以使用连续动画来改善动画播放效率。
如果我们对图像中的每张小图像单独分割成独立的文件,那么当每次要使用这些小图像的时候,我们都得从文件中读取图像信息。
实际上我们可以利用Java将整张大图像中的每个小图像在应用程序中分割出来,然后使用的时候,直接从分割后的图像中获取需要使用的小图像就可以了,这样就不用每次都从文件中读取小图像信息,效率自然会比较高。
那么如何来实现图像分割操作呢?
示例:
import java.awt.Component;
import java.awt.Image;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
/**
* 图像处理辅助类
*
* @author
*
*/
public class ImageUtil {
/**
* 分割图像
*
* @param image
* 传入的图片对象
* @param rows
* 垂直方向上需要裁剪出的图片数量 - 行
* @param cols
* 水平方向上需要裁剪出的图片数量 - 列
* @param x
* 开始裁剪位置的X坐标
* @param y
* 开始裁剪位置的Y坐标
* @param width
* 每次裁剪的图片宽度
* @param height
* 每次裁剪的图片高度
* @param changeX
* 每次需要改变的X坐标数量
* @param changeY
* 每次需要改变的Y坐标数量
* @param component
* 容器对象,目的是用来创建裁剪后的每个图片对象
* @return 裁剪完并加载到内存后的二维图片数组
*/
public static Image[][] cutImage(Image image, int rows, int cols, int x,
int y, int width, int height, int changeX, int changeY,
Component component) {
Image[][] images = new Image[rows][cols];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
ImageFilter filter = new CropImageFilter(x + j * changeX, y + i
* changeY, width, height);
images[i][j] = component.createImage(new FilteredImageSource(
image.getSource(), filter));
}
}
return images;
}
}
编写一个专门分割图像的方法cutImage(),该方法中使用到的CropImageFilter类、FilteredImageSource类的详情,大家可以参考JavaAPI文档。
测试:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import javax.swing.JFrame;
import com.utils.ImageUtil;
/**
* 图像分割测试
*
* @author
*
*/
public class CutImageDemo extends JFrame {
private static final long serialVersionUID = 1140239462766935667L;
private MediaTracker mediaTracker;
private Image[][] images;
public CutImageDemo() {
setSize(800, 600);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
// 创建媒体追踪器对象
mediaTracker = new MediaTracker(this);
// 获取源图像
Image image = Toolkit.getDefaultToolkit().getImage("images/Cg0430.jpg");
// 分割图像
images = ImageUtil.cutImage(image, 5, 5, 0, 3, 128, 95, 128, 95, this);
int index = 0;
// 将所有分割得到的图像添加到MediaTracker追踪列表中
for (Image[] images2 : images) {
for (Image image2 : images2) {
mediaTracker.addImage(image2, index++);
}
}
setVisible(true);
}
@Override
public void paint(Graphics g) {
try {
// 加载所有图像
mediaTracker.waitForAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
if (mediaTracker.checkAll()) { // 所有图像加载完毕
// 循环将每张分割的图像绘制到窗体中
for (int row = 0, len = images.length; row < len; row++) {
for (int col = 0, length = images[row].length; col < length; col++) {
Image img = images[row][col];
int imgWidth = img.getWidth(null);
int imgHeight = img.getHeight(null);
int x = col * (imgWidth + 10) + 15;
int y = row * (imgHeight + 15) + 40;
g.drawImage(img, x, y, null);
}
}
}
}
public static void main(String[] args) {
new CutImageDemo();
}
}
使用Java实现图像分割的更多相关文章
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- openseadragon.js与deep zoom java实现艺术品图片展示
openseadragon.js 是一款用来做图像缩放的插件,它可以用来做图片展示,做展示的插件很多,也很优秀,但大多数都解决不了图片尺寸过大的问题. 艺术品图像展示就是最简单的例子,展示此类图片一般 ...
- JAVA小游戏之两个物体碰撞产生的碰撞检测
首先必须了解两个物体,在移动时,会有怎样的效果,比如沪我们小时候耍过的坦克大战.看起来很简单,但是写起代码来,复杂的要多: 下面举个例子: // 构造一个新的 Rectangle,其左上角的坐标为 ( ...
- Java游戏之碰撞检测
在进行Java游戏开发时,我们经常会遇到碰撞检测的问题.如坦克大战中,炮弹与坦克相遇发生爆炸:守卫者游戏中,守卫者发射的箭与怪物相遇使怪物失血:打飞机游戏中,飞机发送的子弹与敌机相遇干掉敌机.这些都需 ...
- MindSpore部署图像分割示例程序
MindSpore部署图像分割示例程序 本端侧图像分割Android示例程序使用Java实现,Java层主要通过Android Camera 2 API实现摄像头获取图像帧,进行相应的图像处理,之后调 ...
- 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题
背景起因: 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...
- Elasticsearch之java的基本操作一
摘要 接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...
- 论:开发者信仰之“天下IT是一家“(Java .NET篇)
比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...
- 故障重现, JAVA进程内存不够时突然挂掉模拟
背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...
随机推荐
- LINUX:Contos7.0 / 7.2 LAMP+R 下载安装Mysql篇
文章来源:http://www.cnblogs.com/hello-tl/p/7569097.html 更新时间:2017-09-21 16:06 简介 LAMP+R指Linux+Apache+Mys ...
- HTML、CSS常用技巧
一.HTML 在介绍HTML之前,我们先看一下HTML的文档树结构,主要包括哪些: (一).头部标签 1,Doctype Doctype告诉浏览器使用什么样的HTML或XHTML规范来解析HTML文档 ...
- <vue>…… v-if 与 v-show ……//
#v-if 用法: 根据表达式的值的真假条件渲染元素.在切换时元素及它的数据绑定 / 组件被销毁并重建.如果元素是 <template> ,将提出它的内容作为条件块. 当条件变化时该指令触 ...
- xtu summer individual 5 E - Burning Bridges
Burning Bridges Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on ZJU. Origina ...
- Win 2003 创建 IP 安全策略来屏蔽端口的图文教程
(本文用示例的方法讲解 IP 安全策略的设置方法,具体的设置还是要根据个人实际的需要来设置.另外 Windows Server 2008 与此类似.千一网络编辑注) IP安全性(Internet Pr ...
- linux & command line & console & logs
linux & command line & console & logs how to get the logs form linux command console htt ...
- [K/3Cloud] 使用操作还是服务
现在菜单点击事件既可以挂操作又可以挂服务,那到底是应该挂操作还是服务呢? 有个需求是要求一个动作可以在两个时点被触发 1.单据由下推或选单生成的时候: 2.点击单据界面功能菜单: 这样是不是需要做一个 ...
- Delphi:校验手机号及身份证号
//校验手机号 function IsMobileNumber( num:string ):boolean; begin Result:=False; if length( tr ...
- JAVA配置--JDK环境变量配置
环境变量是整台电脑的全局变量,(这台电脑上)任何程序都可以读取这个变量. 如果您安装好jdk,但环境变量配置让你感到有一点模糊的话,那么请您看一下这篇,希望对您有帮助 根据打开电脑的属性(R),出现 ...
- JSP中操作Java Beans
以下内容引用自http://wiki.jikexueyuan.com/project/jsp/beans.html: JavaBean是在编写Java时专门创建的Java类,根据JavaBean AP ...