📄 graphkw.java
字号:
}
//MyCanvas //画布类=======================================
class MyCanvas extends Panel {
private BMPFile bitmap;
public boolean file_loaded;
public boolean flag_changed;
public boolean flag_redo_or_undo;
private Scrollbar hBar, vBar;
private Dimension size;
MyCanvas() {
super();
file_loaded=false;
flag_changed=false;
flag_redo_or_undo=false;
bitmap=new BMPFile();
hBar=new Scrollbar(Scrollbar.HORIZONTAL);
hBar.setEnabled(false);
hBar.setFocusable(false);
hBar.setValue(0);
vBar=new Scrollbar(Scrollbar.VERTICAL);
vBar.setEnabled(false);
vBar.setFocusable(false);
vBar.setValue(0);
setLayout(new BorderLayout());
add(hBar, BorderLayout.SOUTH);
add(vBar, BorderLayout.EAST);
hBar.addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
repaint();
}
});
vBar.addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
repaint();
}
});
}
public void load(String filename) {
if (bitmap.load(filename)==true) {
System.out.println("File load success!");
file_loaded=true;
flag_changed=false;
flag_redo_or_undo=false;
} else {
System.out.println("File load failed!");
file_loaded=false;
flag_changed=false;
flag_redo_or_undo=false;
}
hBar.setValue(0);
vBar.setValue(0);
repaint();
}
public void save() {
if (bitmap.save()==true) {
System.out.println("File save success!");
flag_changed=false;
} else {
System.out.println("File save failed!");
}
}
public void saveAs(String filename) {
if (bitmap.saveAs(filename)==true) {
System.out.println("File save as success!");
file_loaded=true;
flag_changed=false;
flag_redo_or_undo=false;
} else {
System.out.println("File save as failed!");
}
}
public void doFileter(String opt) {
if (bitmap.doFileter(opt)==true) {
flag_changed=true;
flag_redo_or_undo=false;
}
repaint();
}
public void undo() {
flag_redo_or_undo=!flag_redo_or_undo;
flag_changed=true;
bitmap.undo();
repaint();
}
public void paint(Graphics g) {
if (file_loaded==false) return;
size=bitmap.getSize();
int img_w=(int)size.getWidth();
int img_h=(int)size.getHeight();
int hb=(int)(hBar.getWidth()-vBar.getWidth());
int vb=(int)vBar.getHeight();
int x_max=img_w-hb;
int y_max=img_h-vb;
hBar.setEnabled(x_max>0);
vBar.setEnabled(y_max>0);
hBar.setMaximum(img_w);
vBar.setMaximum(img_h);
int x=hBar.getValue();
int y=vBar.getValue();
hBar.setBlockIncrement((int)size.getWidth()/5);
hBar.setVisibleAmount(hb);
vBar.setBlockIncrement((int)size.getHeight()/5);
vBar.setVisibleAmount(vb);
if (x_max<0) x=x_max/2;
if (y_max<0) y=y_max/2;
g.drawImage(bitmap.getMemoryMap(), -x, -y, this);
super.paint(g);
}
}
//图像算法======================================================================
abstract class NineGridTemplet {
protected MemoryMap map;
protected int height, width;
protected int x, y;
public void start(MemoryMap m_map) {
x=0;
y=0;
map=m_map;
width=map.getWidth();
height=map.getHeight();
}
protected boolean atEdge() {
return (x==0 || x==width-1 || y==0 || y==height-1);
}
public abstract int getNextValue();
}
class G_XX extends NineGridTemplet { //线性均值滤波
public int getNextValue() {
int i=0, j=0, k=0;
boolean b=atEdge();
if (!b) {
i= ( map.getRed(x-1, y-1) + map.getRed(x, y-1) + map.getRed(x+1, y-1)+
map.getRed(x-1, y) + map.getRed(x, y) + map.getRed(x+1, y)+
map.getRed(x-1, y+1) + map.getRed(x, y+1) + map.getRed(x+1, y+1)
) / 9;
j= ( map.getGreen(x-1, y-1) + map.getGreen(x, y-1) + map.getGreen(x+1, y-1)+
map.getGreen(x-1, y) + map.getGreen(x, y) + map.getGreen(x+1, y)+
map.getGreen(x-1, y+1) + map.getGreen(x, y+1) + map.getGreen(x+1, y+1)
) / 9;
k= ( map.getBlue(x-1, y-1) + map.getBlue(x, y-1) + map.getBlue(x+1, y-1)+
map.getBlue(x-1, y) + map.getBlue(x, y) + map.getBlue(x+1, y)+
map.getBlue(x-1, y+1) + map.getBlue(x, y+1) + map.getBlue(x+1, y+1)
) / 9;
}
x++;
if (x>=width) {
x=0;
y++;
}
if (y>=height) y=0;
if (b) return map.getRGB(x, y);
else return ((i<<16) + (j<<8) + k) & (65535*256-1);
}
}
class G_ZZ extends NineGridTemplet { //中值滤波
private int n[], i, j, k, r, g, b;
public int getNextValue() {
if (n==null) n=new int[9];
boolean bo=atEdge();
if (!bo) {
n[0]=map.getRGB(x-1, y-1);
n[1]=map.getRGB(x+1, y-1);
n[2]=map.getRGB(x, y-1);
n[3]=map.getRGB(x-1, y);
n[4]=map.getRGB(x, y);
n[5]=map.getRGB(x+1, y);
n[6]=map.getRGB(x-1, y+1);
n[7]=map.getRGB(x, y+1);
n[8]=map.getRGB(x+1, y+1);
for (i=7; i>=0; i--)
for (j=0; j<=i; j++)
if (n[j]>n[j+1]) {
k=n[j];
n[j]=n[j+1];
n[j+1]=k;
}
r=(n[4]>>16) & 255;
for (i=0; i<=8; i++) n[i]=n[i] & 65535;
for (i=7; i>=0; i--)
for (j=0; j<=i; j++) {
if (n[j]>n[j+1]) {
k=n[j];
n[j]=n[j+1];
n[j+1]=k;
}
}
g=(n[4]>>8) & 255;
for (i=0; i<=8; i++) n[i]=n[i] & 255;
for (i=7; i>=0; i--)
for (j=0; j<=i; j++) {
if (n[j]>n[j+1]) {
k=n[j];
n[j]=n[j+1];
n[j+1]=k;
}
}
b=n[4] & 255;
}
x++;
if (x>=width) {
x=0;
y++;
}
if (y>=height) y=0;
if (bo) return map.getRGB(x, y);
else return ((r<<16) + (g<<8) + b) & (65535*256-1);
}
}
class G_BY extends NineGridTemplet { //边缘识别
public int getNextValue() {
int i=0, j=0, k=0;
boolean b=atEdge();
if (!b) {
i= -map.getRed(x-1, y-1) - map.getRed(x, y-1) - map.getRed(x+1, y-1)
-map.getRed(x-1, y) + 8*map.getRed(x, y) - map.getRed(x+1, y)
-map.getRed(x-1, y+1) - map.getRed(x, y+1) - map.getRed(x+1, y+1);
if (i<0) i=0;
i=i&255;
j= -map.getGreen(x-1, y-1) - map.getGreen(x, y-1) - map.getGreen(x+1, y-1)
-map.getGreen(x-1, y) + 8*map.getGreen(x, y) - map.getGreen(x+1, y)
-map.getGreen(x-1, y+1) - map.getGreen(x, y+1) - map.getGreen(x+1, y+1);
if (j<0) j=0;
j=j&255;
k= -map.getBlue(x-1, y-1) - map.getBlue(x, y-1) - map.getBlue(x+1, y-1)
-map.getBlue(x-1, y) + 8*map.getBlue(x, y) - map.getBlue(x+1, y)
-map.getBlue(x-1, y+1) - map.getBlue(x, y+1) - map.getBlue(x+1, y+1);
if (k<0) k=0;
k=k&255;
}
x++;
if (x>=width) {
x=0;
y++;
}
if (y>=height) y=0;
if (b) return map.getRGB(x, y);
else return ((i<<16) + (j<<8) + k) & (65535*256-1);
}
}
class X_MOHU extends NineGridTemplet { //横向模糊
protected boolean atEdge() {
return (x<=2 || x>=width-3);
}
public int getNextValue() {
int i=0, j=0, k=0;
boolean b=atEdge();
if (!b) {
i= (map.getRed(x-3, y) +map.getRed(x-2, y) + map.getRed(x-1, y) + map.getRed(x, y) + map.getRed(x+1, y) + map.getRed(x+2, y) + map.getRed(x+3, y))/7;
j= (map.getGreen(x-3, y) +map.getGreen(x-2, y) + map.getGreen(x-1, y) + map.getGreen(x, y) + map.getGreen(x+1, y) + map.getGreen(x+2, y) + map.getGreen(x+3, y))/7;
k= (map.getBlue(x-3, y) +map.getBlue(x-2, y) + map.getBlue(x-1, y) + map.getBlue(x, y) + map.getBlue(x+1, y) + map.getBlue(x+2, y) + map.getBlue(x+3, y))/7;
}
x++;
if (x>=width) {
x=0;
y++;
}
if (y>=height) y=0;
if (b) return map.getRGB(x, y);
else return ((i<<16) + (j<<8) + k) & (65535*256-1);
}
}
class Y_MOHU extends NineGridTemplet { //竖向模糊
protected boolean atEdge() {
return (y<=2 || y>=height-3);
}
public int getNextValue() {
int i=0, j=0, k=0;
boolean b=atEdge();
if (!b) {
i= (map.getRed(x,y-3) +map.getRed(x,y-2) + map.getRed(x,y-1) + map.getRed(x,y) + map.getRed(x,y+1) + map.getRed(x,y+2) + map.getRed(x,y+3))/7;
j= (map.getGreen(x,y-3) +map.getGreen(x,y-2) + map.getGreen(x,y-1) + map.getGreen(x,y) + map.getGreen(x,y+1) + map.getGreen(x,y+2) + map.getGreen(x,y+3))/7;
k= (map.getBlue(x,y-3) +map.getBlue(x,y-2) + map.getBlue(x,y-1) + map.getBlue(x,y) + map.getBlue(x,y+1) + map.getBlue(x,y+2) + map.getBlue(x,y+3))/7;
}
x++;
if (x>=width) {
x=0;
y++;
}
if (y>=height) y=0;
if (b) return map.getRGB(x, y);
else return ((i<<16) + (j<<8) + k) & (65535*256-1);
}
}
class FUDIAO extends NineGridTemplet { //浮雕效果
public int getNextValue() {
int i=0, j=0, k=0;
boolean b=atEdge();
if (!b) {
i= -map.getRed(x-1, y-1) + map.getRed(x+1, y-1)
-map.getRed(x-1, y) + map.getRed(x+1, y)
-map.getRed(x-1, y+1) + map.getRed(x+1, y+1);
if (i<0) i=255;
else if(i>764)i=0;
else i=128;
j= -map.getGreen(x-1, y-1) + map.getGreen(x+1, y-1)
-map.getGreen(x-1, y) + map.getGreen(x+1, y)
-map.getGreen(x-1, y+1) + map.getGreen(x+1, y+1);
if (j<0) j=255;
else if(j>764)j=0;
else j=128;
k= -map.getBlue(x-1, y-1) + map.getBlue(x+1, y-1)
-map.getBlue(x-1, y) + map.getBlue(x+1, y)
-map.getBlue(x-1, y+1) + map.getBlue(x+1, y+1);
if (k<0) k=255;
else if(k>764)k=0;
else k=128;
}
x++;
if (x>=width) {
x=0;
y++;
}
if (y>=height) y=0;
if (b) return map.getRGB(x, y);
else return ((i<<16) + (j<<8) + k) & (65535*256-1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -