TITLE:RandomDissolveで表示を切り替え

RandomDissolveで表示を切り替え

編集者:Terai Atsuhiro~

作成日:2007-03-26
更新日:2024-01-17 (水) 11:24:40
  • category: swing folder: RandomDissolve title: RandomDissolveで表示を切り替え tags: [Animation, Graphics, BufferedImage, WritableRaster] author: aterai pubdate: 2007-03-26T20:17:32+09:00 description: RandomDissolve効果で表示する画像を切り替えます。 image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTRdPqz07I/AAAAAAAAAhM/h3EaItM41Yw/s800/RandomDissolve.png

概要

RandomDissolve効果で表示する画像を切り替えます。

概要

RandomDissolve効果で表示する画像を切り替えます。このサンプルは、random pixelwise fading ?に投稿されているソースコードを参考にしています。

サンプルコード

#spanend
#spanadd
class RandomDissolve extends JComponent implements ActionListener {
#spanend
  private static final int STAGES = 16;
  private final Timer animator;
  private final transient BufferedImage image1;
  private final transient BufferedImage image2;
  private transient BufferedImage srcimg;
  private boolean mode = true;
  private int currentStage;
  private int[] src, dst, step;

#spandel
#screenshot
#spanend
  public RandomDissolve(BufferedImage i1, BufferedImage i2) {
    super();
    this.image1 = i1;
    this.image2 = i2;
    this.srcimg = copyImage(mode ? image2 : image1);
    animator = new Timer(10, this);
  }

#spandel
**サンプルコード [#y4f21e02]
#spanend
#spandel
#code{{
#spanend
 class RandomDissolve extends JComponent implements ActionListener {
   private final javax.swing.Timer animator;
   private final BufferedImage image1;
   private final BufferedImage image2;
   private BufferedImage srcimg, dstimg;
   private boolean mode = true;
   private int currentStage;
   private int[] src, dst, step;
   public RandomDissolve(BufferedImage i1, BufferedImage i2) {
     this.image1 = i1;
     this.image2 = i2;
     this.srcimg = copyImage(mode?image2:image1);
     animator = new javax.swing.Timer(10, this);
   }
   public boolean nextStage() {
     if(currentStage > 0) {
       currentStage = currentStage - 1;
       for(int i=0; i<step.length; i++) {
         if(step[i]==currentStage) src[i] = dst[i];
       }
       return true;
     }else{
       return false;
     }
   }
   private BufferedImage copyImage(final BufferedImage image) {
     int w = image.getWidth();
     int h = image.getHeight();
     BufferedImage result = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
     Graphics2D g = result.createGraphics();
     g.drawRenderedImage(image, null);
     g.dispose();
     return result;
   }
   private int[] getData(BufferedImage image) {
     WritableRaster wr = image.getRaster();
     DataBufferInt dbi = (DataBufferInt)wr.getDataBuffer();
     return dbi.getData();
     //return ((DataBufferInt)(image.getRaster().getDataBuffer())).getData();
   }
   private static final int STAGES = 16;
   public void animationStart() {
     currentStage = STAGES;
     dstimg = copyImage(mode?image1:image2);
     srcimg = copyImage(mode?image2:image1);
     src  = getData(srcimg);
     dst  = getData(dstimg);
     step   = new int[src.length];
     mode   = !mode;
     Random rnd = new Random();
     for(int i=0;i<step.length;i++) {
       step[i] = rnd.nextInt(currentStage);
     }
     animator.start();
   }
   public void paintComponent(Graphics g) {
     super.paintComponent(g);
     Graphics2D g2d = (Graphics2D)g;
     g2d.setPaint(getBackground());
     g2d.fillRect(0, 0, getWidth(), getHeight());
     g2d.drawImage(srcimg, 0, 0, srcimg.getWidth(), srcimg.getHeight(), this);
   }
   public void actionPerformed(ActionEvent e) {
     if(nextStage()) {
       repaint();
     }else{
       animator.stop();
     }
   }
 }
  public boolean nextStage() {
    if (currentStage > 0) {
      currentStage = currentStage - 1;
      for (int i = 0; i < step.length; i++) {
        if (step[i] == currentStage) {
          src[i] = dst[i];
        }
      }
      return true;
    } else {
      return false;
    }
  }
#spanadd

#spanend
  private BufferedImage copyImage(final BufferedImage image) {
    int w = image.getWidth();
    int h = image.getHeight();
    BufferedImage result = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = result.createGraphics();
    g.drawRenderedImage(image, null);
    g.dispose();
    return result;
  }
#spanadd

#spanend
  private int[] getData(BufferedImage image) {
    WritableRaster wr = image.getRaster();
    DataBufferInt dbi = (DataBufferInt) wr.getDataBuffer();
    return dbi.getData();
  }
#spanadd

#spanend
  public void animationStart() {
    currentStage = STAGES;
    srcimg = copyImage(mode ? image2 : image1);
    src = getData(srcimg);
    dst = getData(copyImage(mode ? image1 : image2));
    step = new int[src.length];
    mode ^= true;
    Random rnd = new Random();
    for (int i = 0; i < step.length; i++) {
      step[i] = rnd.nextInt(currentStage);
    }
    animator.start();
  }
#spanadd

#spanend
  @Override protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g.create();
    g2d.setPaint(getBackground());
    g2d.fillRect(0, 0, getWidth(), getHeight());
    g2d.drawImage(srcimg, 0, 0, srcimg.getWidth(), srcimg.getHeight(), this);
    g2d.dispose();
  }
#spanadd

#spanend
  @Override public void actionPerformed(ActionEvent e) {
    if (nextStage()) {
      repaint();
    } else {
      animator.stop();
    }
  }
#spanadd
}
#spanend
View in GitHub: Java, Kotlin
  • &jnlp;
  • &jar;
  • &zip;

解説

上記のサンプルでは、BufferedImageからWritableRasterを取得し、元画像と次の画像のコピーから、int配列をそれぞれ用意しています。元画像の配列を次の画像のピクセルでランダムに置き換えて、これを再描画することで画像の切り替えを行っています。

解説

  • BufferedImageからWritableRasterを取得し、元画像と次の画像のコピーからint配列をそれぞれ作成
  • 元画像の配列を次の画像のピクセルでランダムに置き換えて、これを再描画することで画像の切り替えを実行

参考リンク

参考リンク

コメント

コメント