你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 图形图象处理与游戏编程
图像透明度在具有立体感动画制作中的应用(四)
 

//改变云层透明度---------------------------------

    iw=imBack.getWidth(this); //获取宽、高

    ih=91;

    grabber(imBack,iw,ih);    //获取pixels[]

    changeBack1Alpha();

    ImageProducer ip=

new MemoryImageSource(iw,ih,pixels,0,iw);

    imBack1a=createImage(ip);

   

    //改变海水透明度---------------------------------

    iw=imBack.getWidth(this);

    ih=imBack.getHeight(this);

    grabber(imBack,iw,ih);  //获取pixels[]

    changeBack2Alpha();

    ip=

new MemoryImageSource(iw,ih,pixels,0,iw);

    imBack2a=createImage(ip);

   

    //制作一棵树---------------------------------------

    grabber(imTree,iw,ih);    //获取pixels[]

    changeBack3Alpha();

    ip=

new MemoryImageSource(iw,ih,pixels,0,iw);

    imTreea=createImage(ip);

   

    //改变fish图像背景的Alpha------------------

    iw=img.getWidth(this);

    ih=img.getHeight(this);

    grabber(img,iw,ih);

    changeAlpha();                

    ip=

new MemoryImageSource(iw,ih,pixels,0,iw);

    imgA=createImage(ip);     

  }

 

  public synchronized void

 actionPerformed(ActionEvent e) {

    if(e.getSource() == bStop) { tFlag = false;}

    if(e.getSource() == bStart) {

      tFlag = true;

      notify();

    }

  }

 

  public void start() {

    thread = new Thread(this);

    thread.start();

  }

 

  public void stop(){tFlag = false;}

 

  public void run() {

    sound=getAudioClip(getCodeBase(), "spacemusic.au");

    sound.loop();

    while(tFlag) {

      move();

      try {  

        synchronized(this){

while(!tFlag)  wait();

  }

      }

      catch(InterruptedException e) {}    

    }

  }

 

  //装载图像

  public void loadImage(){

    //利用MediaTracker跟踪图像的加载

    MediaTracker tracker =

new MediaTracker(this);

    imBack =getImage(getCodeBase(),

"image/back0.jpg");

    imTree=getImage(getCodeBase(),

"image/tree.jpg");

    img=getImage(getCodeBase(),"image/fish.gif");

    tracker.addImage(imBack,0);

    tracker.addImage(imTree,1);

    tracker.addImage(img,2);

    try{

      tracker.waitForAll(); //等待图像完全加载

    }

catch(InterruptedException e){ }

  }

 

  public void grabber(Image img,int w, int h){     

    pixels=new int[w*h];

    try{

      PixelGrabber pg=

new PixelGrabber(img,0,0,w,h,pixels,0,w);

      pg.grabPixels();

    }

    catch (InterruptedException e1) { }

  }

 

  //1种方法取ARGB,改变云层alpha

  public void changeBack1Alpha(){

    ColorModel cm=ColorModel.getRGBdefault();

    for(int i=0;i<ih;i++){

      for(int j=0;j<iw;j++){

        int red,green,blue;

        red  =cm.getRed(pixels[i*iw+j]);       

        green=cm.getGreen(pixels[i*iw+j]);

        blue =cm.getBlue(pixels[i*iw+j]);

        if(i<ih){

int a=220-2*i;  //透明度变化

          pixels[i*iw+j]=a<<24|red<<16|

green<<8|blue;//颜色不变     }      

      }

    }  

  } 

 

  //改变海水的Alpha

  public void changeBack2Alpha(){

    ColorModel cm=ColorModel.getRGBdefault();

    for(int i=220;i<256;i++){

      for(int j=0;j<iw;j++){

        int red,green,blue;

        red  =cm.getRed(pixels[i*iw+j]);       

        green=cm.getGreen(pixels[i*iw+j]);

        blue =cm.getBlue(pixels[i*iw+j]);

        int a=3*i-540;   //透明度变化(120-225)

        pixels[(i-220)*iw+j]=a<<24|red<<16|

green<<8|blue;//颜色不变

      }

    }  

  } 

 

  //制作一棵树

  public void changeBack3Alpha(){

    ColorModel cm=ColorModel.getRGBdefault();

    for(int i=0;i<ih;i++){

      for(int j=0;j<iw;j++){

        int red,green,blue;

        red  =cm.getRed(pixels[i*iw+j]);       

        green=cm.getGreen(pixels[i*iw+j]);

        blue =cm.getBlue(pixels[i*iw+j]);

        if (red>=40&&red<=90&&

green>=110&&green<=130&&

blue>=100&&blue<=180) {

          red = 255; green = 255;

blue = 255;   //设置为白色

          pixels[i*iw+j]=0<<24|red<<16|

green<<8|blue;//全透明

        }      

        else if(red==255&&green==255&&

blue==255){      

          pixels[i*iw+j]=0<<24|red<<16|

green<<8|blue;//全透明

        }

      }

    }  

  }

  //2种方法取ARGB,改变Alpha

  public void changeAlpha(){

    for(int i=0;i<iw*ih;i++){

      int p=pixels[i];

      int red,green,blue;

      red  =0xff&(p>>16);      

      green=0xff&(p>>8);

      blue =0xff&(p);

      if(red>230&&green>230&&blue>230)

        pixels[i]=0<<24|red<<16|green<<8|blue;  }  

  } 

  int x=256,y=150;    //前景图初始坐标

  public void move(){

    Graphics g = getGraphics();

    buff =new BufferedImage(2*iw,2*ih,

BufferedImage.TYPE_INT_ARGB);

    tempGr=buff.createGraphics();

    try{

      Thread.sleep(50);

      x-=2;

      offGr.drawImage(imBack,0,0,this);

      if(x>130){

        offGr.drawImage(imgA,x,y,this);

        y-=2;

      }

      else{                             

        tempGr.drawImage(imgA,0,0,this);

        filtIm=new BufferedImage(2*iw,2*ih,

BufferedImage.TYPE_INT_ARGB);

        AffineTransform transform=

AffineTransform.getRotateInstance(

Math.toRadians(-60),34,34);

        AffineTransformOp op=

new AffineTransformOp(transform,

AffineTransformOp.

TYPE_BILINEAR);

        op.filter(buff,filtIm);

        if(x==130) x=x-6;

        offGr.drawImage(filtIm,x,y-80,null);

        y+=2;

      }

      offGr.drawImage(imBack1a,0,0,this);

      offGr.drawImage(imBack2a,0,220,this);

      offGr.drawImage(imTreea,0,0,this);   

      g.drawImage(offIm,0,0,this);//一次性画图   if(x<-60){

        x=256;

        Thread.sleep(200);

      }

      if(y>220){ x=256; y=150; }        

    }

    catch(InterruptedException e1){ }

  }  

  public void update(Graphics g){

    paint(g);

  }

}

运行程序将产生鱼儿跳跃的动画。可以修改sleep(ms)中时间,调节鱼儿跳跃的速度,读者不妨一试。

参考文献

 

1Cay S.Hostmann, Gary Cornell(朱志等译). Java2核心技术,卷II:高级特性. 北京:机械工业出版社,2001.

2Herbert Schildt(张玉清等译). Java2参考大全(第四版). 北京:清华大学出版社, 2002.

3]孙燮华. Java程序设计教程. 北京:清华大学出版社, 2007.

  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089