2013-02-13 35 views
5

Tôi cần chỉ có một bảng điều khiển bên trong mà tôi có thể vẽ. Tôi muốn có thể để vẽ pixel theo pixel.Java: vẽ đồ thị cơ bản, vẽ một điểm/chấm/pixel

ps: Tôi không cần dòng/vòng kết nối nguyên thủy khác. pps: thư viện đồ họa không thực sự quan trọng, nó có thể là awt, swing, qt .. bất cứ điều gì. Tôi chỉ muốn có một cái gì đó thường được đại diện bởi Bufferedimage hoặc somethign như thế, nơi bạn thiết lập màu sắc của các điểm ảnh duy nhất và sau đó đưa nó vào màn hình.

+0

Thật không may java không có bất kỳ phương pháp nào để vẽ một điểm duy nhất, thay vào đó bạn phải sử dụng 'drawLine' với cùng một điểm cho cả đầu và cuối. –

+1

@ExtremeCoders: đó là một pitty, và điều này không thêm một chi phí khủng khiếp? Tôi chỉ muốn có thể hiển thị các tập dữ liệu lớn .. –

Trả lời

2

đại diện bởi BufferedImage ..

Tôi đề nghị một BufferedImage cho rằng, hiển thị ..

..or một cái gì đó như thế, nơi bạn thiết lập màu sắc của điểm ảnh duy nhất và sau đó làm cho nó vào màn hình.

..trong một JLabel - như đã thấy trong this answer.

Tất nhiên, một khi chúng ta có một thể hiện của BufferedImage, chúng ta có thể setRGB(..).

2

Nếu bạn thực sự cần phải hiển thị pixel-by-pixel, tôi đã thực hiện việc này theo chiều dài cho phần trực quan của phần mềm điểm nóng mà tôi đã viết cho một phòng thí nghiệm nghiên cứu.

Điều bạn muốn là BufferedImage.setRGB(..) - nếu bạn vẽ pixel-by-pixel, tôi giả sử bạn đã triển khai thuật toán sẽ hiển thị giá trị RGB cho mỗi pixel (giống như chúng tôi đã làm với bản đồ nhiệt). Đây là những gì chúng tôi đã sử dụng trong một Applet tương thích với IE cũ trong ngày. Làm việc như một say mê và tương đối nhanh chóng cho những gì nó đã làm.

Thật không may bất cứ lúc nào bạn thao tác các giá trị RGB trực tiếp trong BufferedImage, nó sẽ trở thành uncached bởi bộ nhớ video sao lưu.

Vì Java 7 mặc dù, tôi nghe nói rằng triển khai J2D cơ bản sẽ cố gắng lưu lại hình ảnh vào bộ nhớ video sau khi thao tác dừng và hiển thị được thực hiện lặp đi lặp lại - ví dụ: đang hiển thị bản đồ nhiệt nó không được tăng tốc, nhưng khi nó được hiển thị, khi bạn kéo cửa sổ xung quanh và làm việc với ứng dụng, dữ liệu hình ảnh sao lưu có thể được tăng tốc lại.

+0

cảm ơn bạn, tôi đang cố gắng làm điều gì đó tương tự - tôi có một loạt phổ (được đo liên tục theo thời gian) và tôi muốn vẽ chúng thành bản đồ 2D, tô màu theo cường độ. Vì vậy, nó sẽ trông giống như một bản đồ nhiệt. Nhưng có rất nhiều dữ liệu để vẽ, và tôi hy vọng sẽ thực hiện một số bộ đệm thông minh và tải luồng dữ liệu, vì vậy chúng tôi có thể phóng to/thu nhỏ với tốc độ khá. –

+0

@chhh - chào đón nhiều nhất! Khi chúng tôi thực hiện zoom, chúng tôi giữ xung quanh BufferedImage cuối cùng ở mỗi mức thu phóng (vì vậy chúng không phải được hiển thị lại) nhưng nếu độ phân giải quá cao, điều này sẽ thổi HEAP của bạn để bạn có thể ghi chúng ra dưới dạng PNG đĩa và tải/re-render chúng trên bay hoặc một số lừa bằng nếu bạn cần. Đối với chúng tôi ít nhất, nó vẫn còn nhanh hơn để làm điều đó hơn tính toán lại và rerender khung. –

2

Một ví dụ về một trong những cách để làm điều đó:

// Create the new image needed 
img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 

for (int rc = 0; rc < height; rc++) { 
    for (int cc = 0; cc < width; cc++) { 
    // Set the pixel colour of the image n.b. x = cc, y = rc 
    img.setRGB(cc, rc, Color.BLACK.getRGB()); 
    }//for cols 
}//for rows 


và sau đó từ bên trong paintComponent ghi đè (Graphics g)

((Graphics2D)g).drawImage(img, <args>) 
+0

Cảm ơn, tôi sẽ thử một cái gì đó như thế. Bạn có bất cứ điều gì trong tâm trí của bạn để đề nghị tôi để đọc thêm về loại đồ họa trong Java? –

+0

Bạn có thể đã biết điều này, nhưng chỉ trong trường hợp: [http://docs.oracle.com/javase/tutorial/2d/index.html](http://docs.oracle.com/javase/tutorial/2d/ index.html) – Jool

0

Nếu bạn muốn làm điều gì đó một cách nhanh chóng, bạn có thể chỉ sử dụng phương thức Graphics setColor và drawLine. Ví dụ:

public void paintComponent(Graphics g) { 
    super.paintComponent(g);  

    // Set the colour of pixel (x=1, y=2) to black 
    g.setColor(Color.BLACK); 
    g.drawLine(1, 2, 1, 2); 
} 

Tôi đã sử dụng kỹ thuật này và không quá chậm. Tôi đã không so sánh nó với việc sử dụng các đối tượng BufferedImage.

0

Một chút trễ ở đây, nhưng bạn luôn có thể làm điều đó một cách lập trình viên Java trò chơi làm gì, với một lớp Screen:

public class Screen { 

    private int width, height; 

    public int[] pixels; 

    public Screen(int width, int height) { 
     this.width = width; 
     this.height = height; 

     pixels = new int[width * height]; 
    } 

    public void render() { 
     for(int y = 0; y < height; y++) { 
      for(int x = 0; x < width; x++) { 
       pixels[x + y * width] = 0xFFFFFF; //make every pixel white 
      } 
     } 
    } 

public void clear() { 
      for(int i = 0; i < pixels.length; i++) { 
        pixels[i] = 0; //make every pixel black 
      } 
    } 

} 

Và sau đó trong lớp học chính của bạn:

private Screen screen; 

    private BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
    private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); 

    public void render() { 
     BufferStrategy bs = getBufferStrategy(); 
     if (bs == null) { 
      createBufferStrategy(3); 
      return; 
     } 

     screen.clear(); 
     screen.render(); 

     for(int i = 0; i < pixels.length; i++) { 
      pixels[i] = screen.pixels[i]; 
     } 

     Graphics g = bs.getDrawGraphics(); 
     g.drawImage(image, 0, 0, getWidth(), getHeight(), null); 
     g.dispose(); 
     bs.show(); 
} 

Đó nên làm việc, tôi nghĩ vậy.

Các vấn đề liên quan