首页产品库评测行情新闻|手机数码笔记本台式机DIY硬件数字家庭数码相机办公外设|软件下载游戏开发|社区

更多

数码相机
MP4
LCD
机箱
音箱

天极网 > 开发频道>Java线程控制的图像分割与合成

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

2004-05-18 15:32作者:索红光 石乐义 丁淑妍 高振东出处:Java-cn责任编辑:方舟

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

  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()等方法以及几个表示程序运行状态的布尔变量实现了一个线程控制和动感图像相结合的图像处理过程。


共2页。 9 7 1 2

关注此文的读者还看过:

返回开发频道首页

共2页。 上一页12

软件频道最新更新

热点推荐

天极服务|关于我们|About us|网站律师|RSS订阅|友情合作|加入我们|天极动态|网站地图|意见反馈|MSN/QQ上看天极
Copyright (C) 1999-2012 Yesky.com, All Rights Reserved 版权所有 天极网络