收录日期:2018/09/20 11:40:23 时间:2016/05/18 03:14:45 标签:J2ME
西门子手机图片格式的分析:
bin & mask 
在cnjm.net下载了西门子手机模拟器,在GameAPI_Demo中可以发现一个简依的bin&mask码查看器
show.java,通过分析,我只能发现如下规律,设临时存储图片的格式为二维数组:
a[0][0]  a[0][1]……………………a[0][N]
a[1][0]  a[1][1]……………………a[1][N]
……………………………………………………
a[M][0]  a[M][1]……………………a[M][N]
则:
1、数组的大小为N*M,而且N%==8*i (i = 1,2,……)
2、存储为bin后的数组的大小为N*M/8
3、在上面的数组中设仅存2值1或0,1->black 0->white
将上面的数组寸储为文件格式时用到如下公式:
a[i][j] a[i][j+1]……a[i][j+7]   j%8==0
设寸储为bb[k];
则bbk = -128*a[i][j]+64*a[i][j+1]+32*a[i][j+2]+
16*a[i][j+3]+8*a[i][j+4]+4*a[i][j+5]+
2*a[i][j+6]+1*a[i][j+7]
例如:有8个象素点从左到右分别为:white,black,black ,white,white,black,white,black
则存储为bit 为:-128*0+64*1+32*1+16*0+8*0+4*1+2*0+1*1 = 101
总结:bin文件是对图象的压缩处理,他用到了上面的公式对仅有背景色和前景色进行压缩处理,生成了
相对存储容量小的图象.


我对mask码的作用也不明白,但应该和图片的frame有关,具体是什么我说不清。我只得到如下结论:
.mask文件用来存储整个图象的轮廓,整个轮廓为全黑色
.bin文件是mask的图象改造之后的图片为真正在屏幕上显示的图片。


然后,我自己编辑了一个bin文件生成器,还不是很成熟,欢迎网友给我提建议或者欢迎在这个版本的
基础上开发新的图象编译器。。。。:)
小工具的使用方法:
1。输入长宽
2。先做mask ,做出轮廓
3。存储。
4。改造mask存储为bin
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
class ControlButton extends Button implements ActionListener{
private SiemensPicGenerateCanvas c;
private byte[][] tempByte;
private int x,y;
private Color[] color = {new Color(0x00ffc742),Color.black};
private boolean hit;
public boolean getHit(){
return hit;
}
public ControlButton(SiemensPicGenerateCanvas c,SiemensPicGenerate bb,int x,int y){
hit = true;
this.x = x;
this.y = y;
this.c = c;
setBackground(color[0]);
addActionListener(this);
tempByte = bb.getArray();
}
public void actionPerformed(ActionEvent e){
if(e.getSource() == this){
setBackground(hit ? color[1]:color[0] );
if(hit == true)
tempByte[x][y] = 1;
else
tempByte[x][y] = 0;
hit = !hit;
c.repaint();
}
System.out.println("x = "+x+" y = "+y+" value = "+tempByte[x][y]);
}
}
class SiemensPicGenerateCanvas extends Canvas{
private SiemensPicGenerate s;
private Color[] color = {new Color(0x00ffc742),Color.black};
public SiemensPicGenerateCanvas(SiemensPicGenerate s){
this.s = s;
setBackground(color[0]);
}
public void paint(Graphics g){
for(int i = 0;i < s.getMaxX();i++)
for(int j = 0 ; j<s.getMaxY();j++)
if(s.getValue(i,j) == 1){
g.setColor(color[1]);
g.drawLine(i,j,i,j);
}
else{
g.setColor(color[0]);
g.drawLine(i,j,i,j);
}

}
}

public class SiemensPicGenerate extends Frame implements ActionListener
{
private File f;
   private int size;
   private int wOfButton;
   private DFile dfile;
   private static byte[] bb;
   private FileOutputStream is;
   private SiemensPicGenerateCanvas c;
private ControlButton[][] btn;
private static byte[][] storeArray;
private int MaxX,MaxY;
private byte[] arc = {-128,64,32,16,8,4,2,1};
private Dia dia;
private MenuBar menuBar;
private Menu file,about;
private MenuItem save,author;
private DOfAuthor doa;
private class Dia extends Dialog implements ActionListener{
private Button yes;
private TextField tx1,tx2;
private Label lb1,lb2,lbT;
SiemensPicGenerate spg;
public Dia(SiemensPicGenerate spg,String s){
super(spg,s);
this.spg = spg;
spg.setEnabled(false);
yes = new Button("确定");
tx1 = new TextField("16");
tx2 = new TextField("16");
lb1 = new Label("长");
lb2 = new Label("宽");
lbT = new Label("长必须为8的倍数");
setLayout(null);
setSize(200,100);
add(yes);
add(tx1);
add(tx2);
add(lb1);
add(lb2);
add(lbT);
yes.setBounds(155,75,40,20);
lb1.setBounds(10,20,20,20);
tx1.setBounds(30,20,60,20);
lb2.setBounds(10,50,20,20);
tx2.setBounds(30,50,60,20);
lbT.setBounds(10,75,80,20);
setVisible(true);
setModal(true);
yes.addActionListener(this);
}
public void actionPerformed(ActionEvent act){
if(act.getSource() == yes){
if(Integer.parseInt(tx1.getText())%8!=0)
return;
else if(tx2.getText()==null||tx1.getText()==null)
return;
MaxX = Integer.parseInt(tx1.getText());
MaxY = Integer.parseInt(tx2.getText());
setVisible(false);
init();///
spg.setEnabled(true);
}
}
}
private class DFile extends FileDialog{
public DFile(SiemensPicGenerate spg,String s){
super(spg,"存储",FileDialog.SAVE);
setVisible(true);
int c=0;
for(int j = 0;j<MaxY;j++){
byte k = 0;
for(int i = 0;i<MaxX;i++){
if(i%8 == 0)
    k = 0;
k += (byte)(storeArray[i][j]*arc[i%8]);
if(i%8 == 7)
bb[c++]= k;


}
}

try{
f = new File(this.getDirectory(),this.getFile());
is = new FileOutputStream(f);
is.write(bb);
is.close();

}
catch(Exception ex){
System.out.println(""+ex);
}
}
 
}
private class DOfAuthor extends Dialog implements ActionListener{
private Button yes;
private Label lb1,lb2,lbT;
private SiemensPicGenerate spg;
public DOfAuthor(SiemensPicGenerate spg,String s){
super(spg,s);
this.spg = spg;
spg.setEnabled(false);
yes = new Button("确定");
lb1 = new Label("author wjGFox");
lb2 = new Label("version 0.99");
lbT = new Label("gowithfox@163.com");
setLayout(null);
setSize(200,100);
add(yes);
add(lb1);
add(lb2);
add(lbT);
yes.setBounds(155,75,40,20);
lb1.setBounds(10,30,190,20);
lb1.setForeground(Color.blue);
lb2.setBounds(10,50,190,20);
lb2.setForeground(Color.blue);
lbT.setBounds(10,70,180,20);
lbT.setForeground(Color.blue);
setModal(false);
setVisible(true);
yes.addActionListener(this);
}
public void actionPerformed(ActionEvent act){
if(act.getSource() == yes){
setVisible(false);
spg.setEnabled(true);
}
}

}
public void actionPerformed(ActionEvent ac){
if(ac.getSource() == author){
DOfAuthor doa = new  DOfAuthor(this,"about");
}
else if(ac.getSource() ==save){
dfile = new DFile(this,"save");

}
}
public byte getValue(int x,int y){
return storeArray[x][y];
}
public int getMaxX(){
return MaxX;
}
public int getMaxY(){
return MaxY;
}
public SiemensPicGenerate()
{
super("西门子图片生成器--西门子手机工具集 (1) author wjGFox");
MaxX = 16;
MaxY = 16;
wOfButton = 12;
menuBar = new MenuBar();
file = new Menu("文件");
save = new MenuItem("存储");
about = new Menu("关于");
author = new MenuItem("作者");
file.add(save);
setMenuBar(menuBar);
menuBar.add(file);
menuBar.add(about);
about.add(author);
dia = new Dia(this,"请输入长&宽");
this.addWindowListener (new WindowAdapter(){
public void windowClosing(WindowEvent e){
dispose();
System.exit(0);
}
});
}
public void init(){
save.addActionListener(this);
author.addActionListener(this);
c = new SiemensPicGenerateCanvas(this);
storeArray = new byte[MaxX][MaxY];
size = MaxY*MaxX/8;
bb = new byte[size];
for(int i = 0;i<size;i++)
bb[i] = 0;
btn =new ControlButton[MaxX][MaxY];
for(int i = 0;i < MaxX;i++)
for(int j = 0 ;j<MaxY;j++)
storeArray[i][j] = 0;
for(int i = 0; i< MaxX;i++)
for(int j = 0 ; j<MaxY;j++){
btn[i][j] = new ControlButton(c,this,i,j);
add(btn[i][j]);
}
setLayout(null);
for(int i = 0; i< MaxX;i++)
for(int j = 0 ; j<MaxY;j++)
btn[i][j].setBounds(10+i*wOfButton,45+j*wOfButton,wOfButton,wOfButton);
add(c);
c.setBounds(20+MaxX*wOfButton,60,MaxX,MaxY);
}
public byte[][] getArray(){
return storeArray;
}

public static void main(String args[])
{
SiemensPicGenerate f = new SiemensPicGenerate();
f.setSize(640,480);
f.show();
}
}
我自己写的代码还很不成熟欢迎高手指点,
使用时,将上面的代码存储为SiemensPicGenerate.java 再执行即可!
同时,我希望网友能够更开放自己所研究的东西,我也希望得到其他图象的压缩,解压缩算法,
有谁知道讲 & | << >>>这些东西的书籍或网站欢迎推荐!!!我的e-mail: gowithfox@163.com
太好了,我正想找这个呢,请到http://expert.csdn.net/Expert/topic/1811/1811090.xml?temp=.1450159领分。
up
BUG修订
init();///改为spg.init();///
我做了修订!呈上!
import java.awt.*;
import java.awt.event.*;
import java.io.*;
interface ARC{
static final byte[] arc = {-128,64,32,16,8,4,2,1};
}
interface Author{
static final String HELP="  Hello!\n  This program is written by GaoWenjun. \n  2003-06-10 0.50 /2003-07-20 0.99.";
static final String HELPA[]={"\n    西门子手机手机bin图片是开发游戏\n",
 "    的很一个很重要的资源,由于资料的\n",
 "    匮乏,故自己开发了一款小软件,本\n",
  "    软件全部采用java语言开发,请使用\n",
  "    时注意对话框的提示。\n"};
}
class DiaAuthor extends Dialog implements ActionListener{
private Button yes;
private Label lb1,lb2,lbT;
private SieBING sbg;
private TextArea textArea;
public DiaAuthor(SieBING sbg){
super(sbg,"GxoF 关于...");
this.sbg = sbg;
sbg.setEnabled(false);
yes = new Button("确定");
lb1 = new Label("         ◎author GxoF  高文君");
lb2 = new Label("      GxoF 西门子手机bin图片生成器 Version 0.99 ");
lbT = new Label("详细说明");
textArea = new TextArea(Author.HELP+Author.HELPA[0]+Author.HELPA[1]+Author.HELPA[2]+Author.HELPA[3]+Author.HELPA[4]);
setLayout(null);
setSize(400,300);
add(yes);
add(lb1);
add(lb2);
add(lbT);
add(textArea);
yes.setBounds(330,260,40,20);
lb1.setBounds(80,30,300,20);
lb2.setBounds(50,55,300,20);
lbT.setBounds(30,80,300,20);
textArea.setBounds(30,110,270,150);
setResizable(false);
setVisible(true);
setModal(true);
yes.addActionListener(this);
}
public void actionPerformed(ActionEvent act){
if(act.getSource() == yes){
setVisible(false);
sbg.setEnabled(true);
}
}
}

class LoadFile extends FileDialog{
private File f;
private FileInputStream is;
private byte[] bb;
private int width;
private DiaLoad lod;
private int fileLength;
private int Width;
private SieBING sbg;
public LoadFile(SieBING sbg,byte[][] storeArray){
super(sbg,"读取",FileDialog.LOAD);
setVisible(true);
this.sbg = sbg;
lod=new DiaLoad(sbg,this);

try{
f = new File(this.getDirectory(),this.getFile());
is = new FileInputStream(f);
fileLength = is.available();
bb = new byte[fileLength];
is.read(bb);
is.close();
for(int i=0;i<bb.length;i++){
System.out.print(bb[i]+",");
}
}
catch(Exception ex){
lod.setVisible(false);
sbg.setEnabled(true);
System.out.println(""+ex);
}

}
class DiaLoad extends Dialog implements ActionListener{
private SieBING sbg;
private Button yes;
private TextField tx1;
private Label lb1,lbT;
private int Width;
private LoadFile lof;
public DiaLoad(SieBING sbg,LoadFile lof){
super(sbg,"请输入宽");
this.sbg=sbg;
this.lof=lof;
sbg.setEnabled(false);
yes = new Button("确定");
tx1 = new TextField("16");
lb1 = new Label("宽");
lbT = new Label("宽必须输入正确,否则程序出错");
setLayout(null);
setSize(200,100);
add(yes);
add(tx1);
add(lb1);
add(lbT);
yes.setBounds(155,75,40,20);
lb1.setBounds(10,20,20,20);
tx1.setBounds(30,20,60,20);
lbT.setBounds(10,75,80,20);
setVisible(true);
setModal(true);
sbg.setEnabled(false);
lof.setVisible(false);
yes.addActionListener(this);
}
public int getWidth(){
return Width;
}
public void actionPerformed(ActionEvent act){
if(act.getSource() == yes){
Width=Integer.parseInt(tx1.getText());
setVisible(false);
sbg.setMaxX(Width);
sbg.setMaxY(fileLength*8/Width);
sbg.setPointStoreToZero();
byte[][] pointStore=sbg.getPointStore();
if(pointStore==null)
return;
// System.out.println("pointSotre "+pointStore.length+" "+pointStore[0].length);
for(int i=0,l=0;i<fileLength*8/Width;i++)
for(int j=0;j<Width;){
for(int k=0;k<8;k++,j++){
if((lof.bb[l]>>k&1)==1)
pointStore[i][8*(j/8)+7-k]=1;
}
l++;
}
//for(int i=0,l=0;i<fileLength*8/Width;i++)
// for(int j=0;j<Width;j++)
// System.out.print(pointStore[i][j]);
}
sbg.setEnabled(true);
}
}
}

class SaveFile extends FileDialog{
private File f;
private FileOutputStream is;
private byte[] bb;
public SaveFile(SieBING sbg,byte[][] storeArray){
super(sbg,"存储",FileDialog.SAVE);
setVisible(true);
bb = new byte[sbg.getMaxX()*sbg.getMaxY()/8];
int c=0;
for(int i = 0;i<sbg.getMaxY();i++){
byte k = 0;
for(int j = 0;j<sbg.getMaxX();j++){
if(j%8 == 0)
   k = 0;
k += (byte)(storeArray[i][j]*ARC.arc[j%8]);
if(j%8 == 7)
   bb[c++]= k;
}
}
try{
f = new File(this.getDirectory(),this.getFile());
is = new FileOutputStream(f);
is.write(bb);
is.close();
}
catch(Exception ex){
System.out.println(""+ex);
}
}
}
class Dia extends Dialog implements ActionListener{
private Button yes;
private TextField tx1,tx2;
private Label lb1,lb2,lbT;
private SieBING sbg;
public Dia(SieBING sbg){
super(sbg,"请输入宽&高");
this.sbg = sbg;
sbg.setEnabled(false);
yes = new Button("确定");
tx1 = new TextField("16");
tx2 = new TextField("16");
lb1 = new Label("宽");
lb2 = new Label("高");
lbT = new Label("宽必须为8的倍数,且宽&高不为空否则出错");
setLayout(null);
setSize(200,100);
add(yes);
add(tx1);
add(tx2);
add(lb1);
add(lb2);
add(lbT);
yes.setBounds(155,75,40,20);
lb1.setBounds(10,20,20,20);
tx1.setBounds(30,20,60,20);
lb2.setBounds(10,50,20,20);
tx2.setBounds(30,50,60,20);
lbT.setBounds(10,75,80,20);
setVisible(true);
setModal(true);
yes.addActionListener(this);
}
public void actionPerformed(ActionEvent act){
if(act.getSource() == yes){
if(Integer.parseInt(tx1.getText())%8!=0)
return;
sbg.setMaxX(Integer.parseInt(tx1.getText()));
sbg.setMaxY(Integer.parseInt(tx2.getText()));
sbg.setPointStoreToZero();
System.out.println(Integer.parseInt(tx1.getText()));
System.out.println(Integer.parseInt(tx2.getText()));
setVisible(false);
sbg.setEnabled(true);
}
}
}

class SieBINGCanvas extends Canvas implements MouseListener{
private SieBING s;
private int w=10;
private int o=3;
private int x,y;
private boolean firstTime;
private boolean readyTopaint=false;
private boolean repaintedB=false,repaintedF=false,repaintedAll=false;
//private Color[] color = {new Color(0x00ffc742),Color.black};
private Color[] color = {new Color(0x00ffc742),Color.black};
public SieBINGCanvas(SieBING s){
this.s = s;
 firstTime=true;
setBackground(Color.white);
addMouseListener(this);
readyTopaint=true;
}
public void paint(Graphics g){
if(readyTopaint==true){
if( firstTime==true){
for(int i = 0;i < s.getMaxY();i++)
for(int j = 0 ; j<s.getMaxX();j++)
if(s.getValue(i,j) == 1){
g.setColor(color[1]);
g.fillRect(50+j*o,50+i*o,o,o);
}
else{
g.setColor(color[0]);
g.fillRect(50+j*o,50+i*o,o,o);
}
for(int i = 0;i < s.getMaxY();i++)
for(int j = 0 ; j<s.getMaxX();j++)
if(s.getValue(i,j) == 1){
g.setColor(color[1]);
g.drawLine(50+j,350+i,50+j,350+i);
}
else{
g.setColor(color[0]);
g.drawLine(50+j,350+i,50+j,350+i);
}


for(int i = 0;i < s.getMaxY();i++)
for(int j = 0 ; j<s.getMaxX();j++){
if(s.getValue(i,j) == 1)
g.setColor(color[1]);
else
   g.setColor(color[0]);
g.fillRect(250+w*j,150+w*i,w-1,w-1);
}
}
}
if(repaintedB==true){
g.setColor(color[0]);
g.fillRect(150+w*x,150+y*w,w,w);
}
if(repaintedF==true){
g.setColor(color[0]);
g.fillRect(150+w*x,150+y*w,w,w);
}
if(repaintedAll==true){
for(int i = 0;i < s.getMaxY();i++)
for(int j = 0 ; j<s.getMaxX();j++)
if(s.getValue(i,j) == 1){
g.setColor(color[1]);
g.drawLine(50+j,50+i,50+j,50+i);
}
else{
g.setColor(color[0]);
g.drawLine(50+j,50+i,50+j,50+i);
}

for(int i = 0;i < s.getMaxY();i++)
for(int j = 0 ; j<s.getMaxX();j++){
if(s.getValue(i,j) == 1)
g.setColor(color[1]);
else
   g.setColor(color[0]);
g.fillRect(150+w*j,150+w*i,w,w);
}

}

}
public void repaintAll(){
repaintedAll=true;
repaint();
repaintedAll=false;

}
public void update(Graphics g){
paint(g);
}
private void repaintF(){
repaintedF=true;
repaint();
repaintedF=false;
}
private void repaintB(){
repaintedB=true;
repaint();
repaintedB=false;
}
public void  mouseClicked(MouseEvent e){
x=e.getX();
y=e.getY();
if(x>250&&y>150&&x<250+s.getMaxX()*w&&y<150+s.getMaxY()*w){
if(s.getValue((y-150)/w,(x-250)/w)==(byte)1){
s.setValue((y-150)/w,(x-250)/w);
repaintB();
}
else{
s.setValue((y-150)/w,(x-250)/w);
repaintF();
}
System.out.println(x+ "   " + y);
}
}
public void  mousePressed(MouseEvent e){

}
public void  mouseReleased(MouseEvent e){


public void mouseEntered(MouseEvent e){

}
public void mouseExited(MouseEvent e){

}


}


public class SieBING extends Frame implements ActionListener{
private MenuBar menuBar;
private Menu file,operate,about;
private MenuItem newFile,load,save,exit;
private MenuItem clearScreen,allBlack,oppsiteColor;
private MenuItem author;
private static int MaxY,MaxX;
private static byte[][] pointStore;
private static Dia diaFileLoad;
private static LoadFile loadFile;
private SieBINGCanvas sieCanvas;
//private SieBINGPaintCanvas siePaintCanvas;
private Button b ;
public SieBING()
{
super("  BIN图片生成器 GxoF授权开发");
menuBar = new MenuBar();

file = new Menu("文件");
newFile = new MenuItem("新建");
load = new MenuItem("打开");
save = new MenuItem("存储");
exit = new MenuItem("退出");


operate = new Menu("操作");
clearScreen = new MenuItem("清屏");
allBlack = new MenuItem("全黑");
oppsiteColor = new MenuItem("反色");

about = new Menu("关于");
author = new MenuItem("作者");

setMenuBar(menuBar);

menuBar.add(file);
menuBar.add(operate);
menuBar.add(about);

file.add(newFile);
file.add(load);
file.add(save);
file.addSeparator();
file.add(exit);

operate.add(clearScreen);
operate.addSeparator();
operate.add(allBlack );
operate.addSeparator();
operate.add(oppsiteColor);

about.add(author);

newFile.addActionListener(this);
load.addActionListener(this);
save.addActionListener(this);
exit.addActionListener(this);

clearScreen.addActionListener(this);
allBlack.addActionListener(this);
oppsiteColor.addActionListener(this);

author.addActionListener(this);

//siePaintCanvas = new SieBINGPaintCanvas(this);
sieCanvas = new SieBINGCanvas(this);
//setLayout(null);
//setLayout(new FlowLayout());
add(sieCanvas);
//add(siePaintCanvas);
//sieCanvas.setSize(200,200);
//sieCanvas.setBounds(100,100,100,100);
//siePaintCanvas.setSize(600,400);
this.addWindowListener (new WindowAdapter(){
public void windowClosing(WindowEvent e){
dispose();
System.exit(0);
}
});
}

public int getMaxX(){
return MaxX;
}

public void setMaxX(int MaxX){
this.MaxX=MaxX;
}

public int getMaxY(){
return MaxY;
}

public void setMaxY(int MaxY){
this.MaxY=MaxY;
}

public byte[][] getPointStore(){
return pointStore;
}

public void actionPerformed(ActionEvent e){
if(e.getSource()==exit){
dispose();
System.exit(0);
}
else if(e.getSource()==newFile){
new Dia(this);
}
else if(e.getSource()==load){
loadFile=new LoadFile(this,pointStore);

//sieCanvas = new SieBINGCanvas(this);
//siePaintCanvas = new SieBINGPaintCanvas(this);
//sieCanvas.setSize(MaxX,MaxY);
//siePaintCanvas.setSize(MaxX*6,MaxY*6);
/**/
//siepanel = new SiePanel(this);


}
else if(e.getSource()==save){
new SaveFile(this,pointStore); 
}
else if(e.getSource()==clearScreen){
setPointStoreToZero();
sieCanvas.repaintAll();
}
else if(e.getSource()==allBlack){
setPointStoreToONe();
sieCanvas.repaintAll();
}
else if(e.getSource()==oppsiteColor){
setOppsite();
sieCanvas.repaintAll();
}
else if(e.getSource()==author){
new DiaAuthor(this);
}
}
public void setPointStoreToONe(){
pointStore = new byte[MaxY][MaxX];
for(int i=0;i<MaxY;i++)
for(int j=0;j<MaxX;j++)
pointStore[i][j]=1;
}
public void setPointStoreToZero(){
pointStore = new byte[MaxY][MaxX];
for(int i=0;i<MaxY;i++)
for(int j=0;j<MaxX;j++)
pointStore[i][j]=0;
}
public void setOppsite(){
for(int i=0;i<MaxY;i++)
for(int j=0;j<MaxX;j++){
if(pointStore[i][j]==0)
pointStore[i][j]=1;
else
pointStore[i][j]=0;
}

}
public byte getValue(int i,int j){
return pointStore[i][j];
}
public void setValue(int i,int j){
if(pointStore[i][j]==0)
pointStore[i][j]=1;
else
pointStore[i][j]=0;
}

public static void main(String args[])
{
System.out.println("GxoF Develop Tookit for Siemens");
SieBING f = new SieBING();
f.setSize(800,550);
f.show();
}
}
不错啊!干嘛不发表到CNJM 
:)
mask是表示透明信息的
另外那个show.java就是我写的,呵呵
高人啊
学习,学习,再学习!
石子,你强呀!我整理了你的程序,我才能写出这个呀,你觉得好你就帮我放在cnjm上面吧!我也常上cnjm,那里的资料很丰富,喜欢ing!