分享
 
 
 

Java线程控制的图像分割与合成

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Java线程控制的图像分割与合成

索红光石乐义丁淑妍高振东

摘要:使用Java对WEB静态图像进行分割重组,然后根据用户的交互操作合成显示,并利用线程对程序的并发性加以控制,从而达到图像显示的动态性和交互性效果。

关键词:Java语言类Class线程Thread

Java是一种面向对象的编程语言。它具有与平台无关、面向对象、动态、安全等特点,允许直接使用多线程方式进行编程,对程序进行并发控制。Java还支持分布式网络操作,从而能够方便地进行网络文件对象的存取。利用Java语言本身提供的绘图功能,可以绘制一些简单的图形。而对于复杂图形,一般先用绘图软件制成图像,然后采用Java所提供的方法对图像下载并进行处理和控制,从而实现静态图像的动态显示。

1Java图像处理与线程的并发控制

1.1Java图像处理

Java语言提供了丰富的类(Class)、接口(Interface)以及相应的调用方法(Method)。使用这些类或接口,可以定义自己的类或子类,充分利用Java面向对象的特性进行编程。在java.awt包中,提供了专门的Image类,它是1种抽象类,可提供抽象的方法描绘图片的一些共同特性。而在Applet类和Tookit类中都提供了2种getImage()方法下载图像,分别根据绝对地址和相对地址查询所要下载的图像。通常采用相对地址的下载方法,它的语法定义及功能如下:

1.public Image getImage(URL url,String name)

功能:根据相对地址下载图像。

参数:url——URL(统一资源定位)基地址,

name——图像文件名。

获取图像后就可以调用Graphics类提供的drawImage()方法显示图像。

2.public drawImage(Image img,int x,int y,observer)

功能:在指定位置显示图像。

参数:img——待显示图像,x——横坐标,y——纵坐标,observer——图像监视器,用来监视图像的下载情况,接受图像装载信息(当图像完全载入时返回True,否则返回False)。

在显示图像时,通常希望获得对图像的控制,从而以自己喜欢的各种方式实现媒体播放。为此,Java专门提供了用于跟踪包括图像和声音等多媒体对象的ImageObserver类和MediaTracker类,在本文程序中主要用到的是跟踪多幅图像状态的MediaTracker类。

1.2Java多线程并发功能

目前,线程(Thread)已经为许多操作系统和应用开发系统所采用。线程是程序的单个控制流,具有顺序程序的特点,但是线程不是1个程序,它仅仅是程序的1个执行序列。线程具有很强的并发功能,在同一时刻可能有多个线程同时处于执行状态。线程是动态的,具有一定的生命周期,分别经历从创建、执行、阻塞直到消亡的过程。Java语言中提供了专门的Thread类,以支持直接的多线程编程。Thread类提供了对线程的控制方法,如Start(),Stop(),Run()、Suspend()、resume()、Sleep()以及Run()方法等等,它们可以对线程的状态进行控制。并可以运用SetPriority()方法设置线程的运行优先顺序。Thread类的定义方法如下:

Thread(ThreadGroup group,Runable target,String name)

SetPriority()用来设置线程的优先级。线程优先级是1个介于MINPRIORITY(在类中定义为1)和MAXPRIORITY(在类中定义为10)之间的整数。线程不同的优先级决定了不同线程之间的切换。

2Java图像分割与合成的算法及实现

Java程序首先将一个完整的图像下载,然后将其分割成20个单元拼图,即分为5行4列。在本例中特地将第20幅图像单元设为1个空白图像,以便拼图时用户交互操作使用。这些参数分别定义在相应的变量中。

final int XCELLS=5;//每行拼图的数目

final int YCELLS=4;//每列拼图的数目

final int ALLCELLS=20;//分割元素的数目

final int EMPTY=19;//将第20单元,即cells[19]置成

//空白图像

然后将这些图像分割单元存于1个Cell类数组cells[]中,在这里Cell类中含有图像以及它的起始位置和当前位置,其具体定义如下:

class Cell

{int sx,sy;//起始位置

int cx,cy;//当前位置

Image img;//单元图像

public Cell(Image img,int x,int y)//Cell类构造函数

{this.img=img;

sx=x;sy=y;}//给起始位置赋值为x,y

}

为了对每个图像分割单元进行状态跟踪,还需要建立1个MediaTracker类的实体(instance),然后调用addImage()方法,为每个要跟踪的图像指定1个唯一的标识符。标识符决定了图像获取时的优先顺序并使得图像能够独立完整地进行处理。

MediaTracker tracker=new MediaTracker(this)

//为当前使用类建立1个MediaTracker实体,用于跟踪类

//上的图像

cells[EMPTY]=new Cell(createEmpty(),toPoint(EMPTY).x,toPoint(EMPTY).y);

tracker.addImage(cells[EMPTY].img,0);

//调用createEmpty()方法产生空白图像,并加入到所跟踪

//的cells数组中20单元

void setPosition(int x,int y)//设置单元图像当前位置

{cx=x;cy=y;}

各个图像单元的位置存放于位置数组position里:

int position[][]=new int[XCELLs][YCELLS]

这样就可以使用Cell类数组cells[]对图像的各个单元进行操作,从而将各个单元图像进行合成显示,并通过position[][]数组改变各个单元的位置。为了对各单元进行并发操作,需要对线程加以控制,并通过鼠标事件和按键事件控制进程的开始、睡眠和进行等状态变化,其实现方法如下(仅以run()方法为例):

Thread imageThread=null;//定义线程imageThread,初始

//值为空

public void run()

{imageThread.setPriority(Thread.MINPRIORITY);//设置线

//程执行优先级别

try

{imageThread.sleep(2000);//线程睡眠等待2000ms

}catch(InterruptedException e){}

first=changeArray();//调用changeArray()方法随机改变图

//像单元位置

while(!loaded)//判断图像若未被跟踪载入,则调用相关

//方法跟踪并加载图像

{repaint();

try

{imageThread.sleep(100);

}catch(InterruptedException e){System.out.println(e);}

}

}

changeArray()方法用来随机地改变图像单元的位置,其实现方法如下:

boolean changeArray()

{

int source[]=new int[20];

int full[]=new int[20];

for(int i=0;i<ALLCELLS;i++)

{

int r=(int)(Math.random()*20);

while(full[r]!=0)

r=(r+(int)(Math.random()*20))%20;

source[i]=r;

full[r]=1;

}

int pos=0;

for(int i=0;i<ALLCELLS;i++,pos++)

{

Point p=toPoint(source[pos]);

cells[pos].setPosition(p.x,p.y);

position[p.x][p.y]=pos;

}

x=cells[EMPTY].cx;

y=cells[EMPTY].cy;

return(false);

}

当applet执行后点击鼠标,线程就被启动,开始装载图像并执行changeArray()随机选择1个位置来移动图像单元,此时可以使用键盘移动图像上的任意单元到任何位置。在这里还有一个重要内容就是怎样将图像分割成许多的单元,我们可以通过引用CropImageFilter方法来分割图像,它是1个分割图像过滤器。其实现方法如下:

Image crop(int pos)

{//pos参数为调用函数给出的图像单元位置号

Point p=toPoint(pos);//将位置号转化为坐标形式

ImageFilter filter=new CropImageFilter(xside*p.x,yside*p.y,xside,yside);

//在给定坐标和长宽的绝对矩形区域内创建分割图像过

//滤器实体filter

ImageProducer producer=new FilteredImageSource(baseImage.getSource(),filter;)

//由原图像和分割图像过滤器实体创建新的图像

//产生器producer

return createImage(producer);//由图像产生器producer产生

//图像并返回

}

通过以上步骤,整个图像的分割与合成显示就完成了。本程序主要利用了crop()、changeArray()、mousedown()、Thread()等方法以及几个表示程序运行状态的布尔变量实现了一个线程控制和动感图像相结合的图像处理过程。

作者单位:山东东营石油大学计算机系(257062)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有