今天用JAVA写一个封闭图形的填充,
我采用种子填充算法,
/**
*@param x 初始点x坐标
*@param y 初始点y坐标
*@param ccolor 填充颜色
*@param bcolor 初始点颜色
*@param image 图形
*/
public void setColor(int x,int y,Color ccolor,Color bcolor,java.awt.image.BufferedImage image){
ArrayList list=new ArrayList();//边界保存,保存下一次要处理的
//装入原始点
list.add(x);
list.add(y);
while(list.size()!=0){
//填充边界颜色
for(int i=0;i
//if(image.getRGB(list.get(i),list.get(i+1))!=ccolor.getRGB())
image.setRGB(list.get(i),list.get(i+1),ccolor.getRGB());
}
int size=list.size();
int byLength=0;
while(size>0){
int tempx,tempy;
tempx=list.get(0);
tempy=list.get(1);
if(tempx>0){
if(image.getRGB(tempx-1, tempy)==bcolor.getRGB()){//取左边点
list.add(tempx-1);
list.add(tempy);
byLength++;
//System.out.println("("+(tempx-1)+","+tempy+")");
}
}
if(tempy>0){
if(image.getRGB(tempx, tempy-1)==bcolor.getRGB()){//取上边点
list.add(tempx);
list.add(tempy-1);
byLength++;
//System.out.println("("+tempx+","+(tempy-1)+")");
}
}
if(tempx
if(image.getRGB(tempx+1,tempy)==bcolor.getRGB()){//取右边点
list.add(tempx+1);
list.add(tempy);
byLength++;
//System.out.println("("+(tempx+1)+","+tempy+")");
}
}
if(tempy
if(image.getRGB(tempx, tempy+1)==bcolor.getRGB()){//取左边点
list.add(tempx);
list.add(tempy+1);
byLength++;
//System.out.println("("+tempx+","+(tempy+1)+")");
}
}
if(byLength==0)return;
list.remove(0);
list.remove(0);
size-=2;
}
if(byLength==0)break;
}
}
//运算速度太慢了.
//不知道...windows那个画图的填充是怎么实现的,觉得它的速度不错.
我采用种子填充算法,
/**
*@param x 初始点x坐标
*@param y 初始点y坐标
*@param ccolor 填充颜色
*@param bcolor 初始点颜色
*@param image 图形
*/
public void setColor(int x,int y,Color ccolor,Color bcolor,java.awt.image.BufferedImage image){
ArrayList list=new ArrayList();//边界保存,保存下一次要处理的
//装入原始点
list.add(x);
list.add(y);
while(list.size()!=0){
//填充边界颜色
for(int i=0;i
//if(image.getRGB(list.get(i),list.get(i+1))!=ccolor.getRGB())
image.setRGB(list.get(i),list.get(i+1),ccolor.getRGB());
}
int size=list.size();
int byLength=0;
while(size>0){
int tempx,tempy;
tempx=list.get(0);
tempy=list.get(1);
if(tempx>0){
if(image.getRGB(tempx-1, tempy)==bcolor.getRGB()){//取左边点
list.add(tempx-1);
list.add(tempy);
byLength++;
//System.out.println("("+(tempx-1)+","+tempy+")");
}
}
if(tempy>0){
if(image.getRGB(tempx, tempy-1)==bcolor.getRGB()){//取上边点
list.add(tempx);
list.add(tempy-1);
byLength++;
//System.out.println("("+tempx+","+(tempy-1)+")");
}
}
if(tempx
if(image.getRGB(tempx+1,tempy)==bcolor.getRGB()){//取右边点
list.add(tempx+1);
list.add(tempy);
byLength++;
//System.out.println("("+(tempx+1)+","+tempy+")");
}
}
if(tempy
if(image.getRGB(tempx, tempy+1)==bcolor.getRGB()){//取左边点
list.add(tempx);
list.add(tempy+1);
byLength++;
//System.out.println("("+tempx+","+(tempy+1)+")");
}
}
if(byLength==0)return;
list.remove(0);
list.remove(0);
size-=2;
}
if(byLength==0)break;
}
}
//运算速度太慢了.
//不知道...windows那个画图的填充是怎么实现的,觉得它的速度不错.
![](http://c.services.spaces.live.com/CollectionWebService/c.gif?space=vsplay&page=RSS%3A+%E5%B0%81%E9%97%AD%E5%8C%BA%E5%9F%9F%E5%A1%AB%E5%85%85%2C%E5%A4%AA%E6%85%A2%E4%BA%86...&referrer=)
![](https://i-blog.csdnimg.cn/blog_migrate/177fa8045eabe6f09969c4a92724dc14.gif)