📄 fenge.java
字号:
import java.awt.*;
import java.awt.image.*;
import java.applet.*;
public class fenge extends Applet
{
Image img,pic;
static int[] pixels1;
static int w,h;
static int[] p1;
public void init()
{
try
{
img=getImage(getDocumentBase(),"1.jpg");
MediaTracker mt= new MediaTracker(this);//跟踪多种媒体对象状态
mt.addImage(img,0);//向此媒体跟踪器正在跟踪的图像列表添加一个图像
mt.waitForID(0);//开始加载由此媒体跟踪器跟踪且具有指定标识符的所有图像。
w=img.getWidth(null);//获得图像宽
h=img.getHeight(null);//获得图像高
pixels1=new int [w*h];
p1=new int[w*h+1];
for(int i=0;i<w*h;i++)
{p1[i]=0;}
PixelGrabber grabber=new PixelGrabber(img,0,0,w,h,pixels1,0,w);
grabber.grabPixels();
incise() ;//切割函数的调用
pic=createImage(new MemoryImageSource(w,h,pixels1,0,w));
}catch(InterruptedException e){};
}
public static void incise()
{
//图象切割主要有从头到尾,从尾到头,从上到下,从左到右及柔化处理
//图象切割主要分为三步
//先去边框外的背景,即下面的scanHead_to_End()函数scanEnd_to_Head()函数
//再去其边框,即下面的scanLift_to_Right()函数和scanUp_to_Down()函数
//最后去边框里的背景,即在调用scanHead_to_End()函数scanEnd_to_Head()函数即可
//具体在下函数里实现
scanHead_to_End();
scanEnd_to_Head();
scanLift_to_Right();
scanUp_to_Down();
scanEnd_to_Head();
scanHead_to_End();
scanLift_to_Right();
scanUp_to_Down();
}
public static void scanHead_to_End()
{
//从头到尾处理函数的基本思想是:首先将前一部分点加进集合,即p1[i]=1;
//并令其像素值为一白色,即pixels1[i]=2147483647;
//表示已处理过,然后从下一点开始,判断其本身的像素值和其上或左一点的像素值
//如果两条件同时满足的话,表明此点为要去的点,即作p1[i]=1和pixels1[i]=2147483647处理
//这样循环到尾能把边框外的背景去掉
//但右下角没法去掉,所以还要调用从尾到头函数,其基本算法和此函数相同,下面就不在介绍
int i,m,n,t1=0,t2=0;
for(i=0;i<2000;i++)
{
p1[i]=1;
pixels1[i]=2147483647;
}
for(i=2000;i<w*h;i++)
{
t1=0;t2=0;
m=i-w;//取上一点
n=i-1;//取左一点
if(pixels1[i]<=-13777216)
{
if(p1[m]==1)
t1=1;
if(p1[n]==1)
t2=1;
}
if(t1==1||t2==1)
{ p1[i]=1; pixels1[i]=2147483647 ; }
else if(pixels1[i]==2147483647) p1[i]=1;
}
}
public static void scanEnd_to_Head()
{//和上一函数做法基本相同
int i,m,n,t1=0,t2=0;
for(i=w*h-1;i>w*h-2000;i--)
{
p1[i]=1;
}
for(i=w*h-2000;i>0;i--)
{
t1=0;t2=0;
m=i+w;//取下点
n=i+1;//取右一点
if(pixels1[i]<=-13777216)
{
if(p1[n]==1)
t2=1;
if(p1[m]==1)
t1=1;
}
if(t1==1||t2==1)
{ p1[i]=1; pixels1[i]=2147483647 ; }
else if(pixels1[i]==2147483647) p1[i]=1;
}
}
public static void scanLift_to_Right()
{
//此函数能去掉部分边框
//具体算法思想是:先处理左边边框,从头到尾循环,若此点不在集合p1里
//在判断此点左边一点在不在p1里,若在p1里
//在判断右边几点,比如5点的像素值属不属于背景色
//以上三点同时满足的话,就可以判定这点是边框,
//把这点加进p1集合即p1[i]=1和把其像素值令为白即pixels1[i]=2147483647;
//这样能处理掉左边边框,右边也同样处理即可
int i,x,t1,t2;
for(i=2000;i<w*h;i++)
{
t1=0;t2=0;
x=i%w;
if(p1[i]!=1)
{
if(x<=256)
{
for(int j=1;j<5;j++)
if((x-j>0)&&(pixels1[i-j]==2147483647))
{t1=1;j=16;}
for(int j=1;j<8;j++)
if((pixels1[i+j]<=-13777216))
{t2=1;j=16;}
if(t1==1&&t2==1)
{ p1[i]=1;pixels1[i]=2147483647;}
}
else
{
for(int j=1;j<5;j++)
if((pixels1[i-j]==2147483647)||(pixels1[i-j]<=-13777216))
{t1=1;j=16;}
for(int j=1;j<5;j++)
if((x+j<512)&&(pixels1[i+j]==2147483647))
{t2=1;j=16;}
if(t1==1&&t2==1)
{ p1[i]=1;pixels1[i]=2147483647;}
}
}
}
}
public static void scanUp_to_Down()
{
//此函数的功能主要是去掉其上下部分的边框
//基本算法与上一函数相同
int i,y,t1,t2;
for(i=2000;i<w*h;i++)
{
t1=0;t2=0;
y=i/w+1;
if(p1[i]!=2147483647)
{
if(y<=256)
{
for(int j=1;j<5;j++)
if(y-j>0&&pixels1[i-j*w]==2147483647)
{t1=1;j=16;}
for(int j=1;j<5;j++)
if((pixels1[i+j*w]==2147483647)||(pixels1[i+j*w]<=-15777216))
{t2=1;j=16;}
if(t1==1&&t2==1)
{p1[i]=1; pixels1[i]=2147483647; }
}
else
{
for(int j=1;j<8;j++)
if((y+j<512)&&pixels1[i+j*w]==2147483647)
{t1=1;j=16;}
for(int j=1;j<8;j++)
if((pixels1[i-j*w]==2147483647)||(pixels1[i-j*w]<=-13777216))
{t2=1;j=16;}
if(t1==1&&t2==1)
{p1[i]=1; pixels1[i]=2147483647; }
}
}
}
}
public void paint (Graphics g)
{
g.drawImage(img,20,0,300,300,null);
g.drawImage(pic,330,0,300,300,null);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -