2011-08-13 12 views
7

javaを使用してピクセル画像を作成する最も良い方法はどれですか。 言い換えれば、合計40.000ピクセルの200x200のサイズのピクセル画像を作成したいと思います。どのようにしてランダムな色からピクセルを作成し、それをJFrameの所定の位置にレンダリングできますか?Javaでのピクセル画像のペイント

ピクセルを作成するだけのコンポーネントを作成しようとしましたが、forループでこのようなピクセルを250.000回作成して各インスタンスをJPanelsレイアウトに追加すると、これはあまり効果がないようです。

class Pixel extends JComponent { 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(getRandomColor()); 
     g.fillRect(0, 0, 1, 1); 
    } 
} 

答えて

9

このためにクラスを作成する必要はありません。 Javaはすでに、あなたが必要とするものを正確に行う優れたBufferedImageクラスを持っています。ここではいくつかの擬似コードは次のとおりです。

int w = 10; 
int h = 10; 
int type = BufferedImage.TYPE_INT_ARGB; 

BufferedImage image = new BufferedImage(w, h, type); 

int color = 255; // RGBA value, each component in a byte 

for(int x = 0; x < w; x++) { 
    for(int y = 0; y < h; y++) { 
     image.setRGB(x, y, color); 
    } 
} 

// Do something with image 
+1

参照も、この[実施例](http://sites.google.com/site/drjohnbmatthews/raster )。 – trashgod

+0

1:1は、これをスイングパネルに配置しようとすると機能しません。 'ImageIO.read()'の画像と同じコードを使用しています。だからここにコードに何か問題がありますが、私は確信していません。 – Blauhirn

3

あなたはおそらく、あなたが希望のサイズのBufferedImageを作成し、ランダムなピクセルの束を作成するためにimg.setRGB(x, y, getRandomColor())を使用したいと思います。それで、あなたはどこでもそれを望む場所にイメージ全体をレンダリングすることができます。

6

ここでのキーはCanvasクラスです。任意の描画操作を可能にするのは標準Componentです。これを使用するには、Canvasクラスをサブクラス化し、paint(Graphics g)メソッドをオーバーライドしてから、各ピクセルをループしてランダムな色を描画する必要があります。次のコードは動作するはず:

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.util.Random; 

import javax.swing.JFrame; 

public class PixelCanvas extends Canvas { 
    private static final int WIDTH = 400; 
    private static final int HEIGHT = 400; 
    private static final Random random = new Random(); 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 

     for(int x = 0; x < WIDTH; x++) { 
      for(int y = 0; y < HEIGHT; y++) { 
       g.setColor(randomColor()); 
       g.drawLine(x, y, x, y); 
      } 
     } 
    } 

    private Color randomColor() { 
     return new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)); 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 

     frame.setSize(WIDTH, HEIGHT); 
     frame.add(new PixelCanvas()); 

     frame.setVisible(true); 
    } 
} 

生成された画像は、次のようになります

Noise Image

+0

'Canvas'と' JFrame'を混ぜることに注意してください。 'new Color(random.nextInt()、true)'も考慮してください。 – trashgod

+0

奇妙なミックスを避けるために 'JFrame'の代わりに' Frame'をインスタンス化することでも同じことができます。 –

関連する問題