2011-08-13 114 views
7

哪種方法是使用java創建像素圖像的最佳方法。假設我想創建一個像素圖像,尺寸爲200x200,總共爲40.000像素。如何從隨機顏色創建像素並將其呈現在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

通過實例化一個'Frame'而不是'JFrame'可以實現同樣的效果,以避免奇怪的混合。 –