2011-08-13 5 views
7

java로 픽셀 이미지를 만드는 가장 좋은 방법은 다음 중 어느 것입니까? 말하자면, 총 40.000 픽셀 인 200x200 크기의 픽셀 이미지를 만들고 싶습니다. 임의의 색상으로 픽셀을 만들고 JFrame의 지정된 위치에서 렌더링하는 방법은 무엇입니까?Java에서 픽셀 이미지 페인팅

나는 단지 픽셀을 생성하는 자체 구성 요소를 만들려고했지만 for-loop로 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

이 경우 클래스를 만들 필요가 없습니다. 자바는 이미 당신이 필요로하는 것을 수행하는 훌륭한 BufferedImage 클래스를 가지고 있습니다. 당신은 아마 당신이 원하는 크기의 BufferedImage를 만들고, 임의 픽셀의 무리를 만들 img.setRGB(x, y, getRandomColor())를 사용하는 것이 좋습니다

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

: 여기에 몇 가지 의사 코드입니다. 그런 다음 원하는 모든 이미지를 렌더링 할 수 있습니다.

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'을 인스턴스화함으로써 동일하게 할 수 있습니다. –