为减少动画制作过程中的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实现图像分割的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. openseadragon.js与deep zoom java实现艺术品图片展示

    openseadragon.js 是一款用来做图像缩放的插件,它可以用来做图片展示,做展示的插件很多,也很优秀,但大多数都解决不了图片尺寸过大的问题. 艺术品图像展示就是最简单的例子,展示此类图片一般 ...

  3. JAVA小游戏之两个物体碰撞产生的碰撞检测

    首先必须了解两个物体,在移动时,会有怎样的效果,比如沪我们小时候耍过的坦克大战.看起来很简单,但是写起代码来,复杂的要多: 下面举个例子: // 构造一个新的 Rectangle,其左上角的坐标为 ( ...

  4. Java游戏之碰撞检测

    在进行Java游戏开发时,我们经常会遇到碰撞检测的问题.如坦克大战中,炮弹与坦克相遇发生爆炸:守卫者游戏中,守卫者发射的箭与怪物相遇使怪物失血:打飞机游戏中,飞机发送的子弹与敌机相遇干掉敌机.这些都需 ...

  5. MindSpore部署图像分割示例程序

    MindSpore部署图像分割示例程序 本端侧图像分割Android示例程序使用Java实现,Java层主要通过Android Camera 2 API实现摄像头获取图像帧,进行相应的图像处理,之后调 ...

  6. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  7. Elasticsearch之java的基本操作一

    摘要   接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...

  8. 论:开发者信仰之“天下IT是一家“(Java .NET篇)

    比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...

  9. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

随机推荐

  1. ORM之连表操作

    ORM之连表操作 -----------------------------连表的正向操作------------------------- 在models.py中创建两张表UserType和User ...

  2. C语言学习1

    一.初识C语言 1.1 C语言的起源 1972年,贝尔实验室的丹尼斯,里奇和肯,汤普逊在开发UNIX操作系统时设计了C语言,然而,C语言不完全是里奇突发奇想出来的,他是在B语言的基础上进行设计的,至于 ...

  3. 97-2016年11月1日AUDUSD在公布利率后反手做单感悟(2016.11.2)

    2016年11月1日AUDUSD在公布利率后反手做单感悟         11月1日,澳联储公布利率决议,保持利率不变,AUDUSD大涨.我在上面做空认为市场会回调.做空位置是根据多种斐波那契技术找的 ...

  4. [HDU1576] A/B(扩展欧几里得)

    传送门 n = A % 9973 -> n = A - A / 9973 * 9973 设 x = A / B(题目所述,B|A) -> A = B * x 所以 B * x - A / ...

  5. 姓名与ID(codevs 1027 未结题)

    题目描述 Description 有N个人,各自有一个姓名和ID(别名).每个人的姓名和ID都没有重复.这些人依次进入一间房间,然后可能会离开.过程中可以得到一些信息,告知在房间里的某个人的ID.你的 ...

  6. Bzoj3038 上帝造题的七分钟2 线段树

    Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1135  Solved: 509 Description XLk觉得<上帝造题的七分钟>不太 ...

  7. 【ZJOI2017 Round1练习&BZOJ4774】D3T2 road(斯坦纳树,状压DP)

    题意: 对于边带权的无向图 G = (V, E),请选择一些边, 使得1<=i<=d,i号节点和 n − i + 1 号节点可以通过选中的边连通, 最小化选中的所有边的权值和. d< ...

  8. Linux下汇编语言学习笔记51 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  9. Codeforces 651B Beautiful Paintings【贪心】

    题意: 给定序列,重新排序,使严格上升的子序列最多.求这些子序列总长度. 分析: 贪心,统计每个元素出现次数,每次从剩余的小的开始抽到大的,直到不再剩余元素. 代码: #include<iost ...

  10. 安装adt-bundle-windows-x86-20130917时遇到的问题及解决方法

    最近在上安卓课,老师让我们下载此软件(adt-bundle-windows-x86-20130917.下载压缩后,打开eclipse的时候,会出现以下情况: 这时说明你的jdk还没下载或者下载错位置了 ...