Swing/RandomDissolve のバックアップソース(No.5)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- Swing/RandomDissolve へ行く。
- 1 (2007-10-21 (日) 04:27:13)
- 2 (2012-08-03 (金) 16:13:53)
- 3 (2013-08-27 (火) 18:03:28)
- 4 (2014-11-22 (土) 03:59:58)
- 5 (2014-11-25 (火) 03:03:31)
- 6 (2015-01-13 (火) 11:27:57)
- 7 (2016-02-10 (水) 23:49:33)
- 8 (2016-09-15 (木) 16:33:36)
- 9 (2017-10-27 (金) 13:34:01)
- 10 (2019-05-21 (火) 14:52:55)
- 11 (2021-02-16 (火) 17:06:14)
- 12 (2024-01-17 (水) 11:24:40)
--- title: RandomDissolveで表示を切り替え tags: [Animation, Graphics, BufferedImage, WritableRaster] author: aterai pubdate: 2007-03-26 description: RandomDissolve効果で表示する画像を切り替えます。 --- * 概要 [#na4cc347] `RandomDissolve`効果で表示する画像を切り替えます。このサンプルは、[https://forums.oracle.com/thread/1270228 Java 2D - random pixelwise fading ?]に投稿されているソースコードを参考にしています。 #download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTRdPqz07I/AAAAAAAAAhM/h3EaItM41Yw/s800/RandomDissolve.png) * サンプルコード [#y4f21e02] #code(link){{ 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(); } @Override 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); } @Override public void actionPerformed(ActionEvent e) { if(nextStage()) { repaint(); }else{ animator.stop(); } } } }} * 解説 [#w98eeb09] 上記のサンプルでは、`BufferedImage`から`WritableRaster`を取得し、元画像と次の画像のコピーから、`int`配列をそれぞれ用意しています。元画像の配列を次の画像のピクセルでランダムに置き換えて、これを再描画することで画像の切り替えを行っています。 * 参考リンク [#t2398063] - [https://forums.oracle.com/thread/1270228 Java 2D - random pixelwise fading ?] * コメント [#ddce085f] #comment #comment