2010-07-24 9 views
13

Tôi phải tạo một hoạt ảnh 2D đơn giản mà không cần sử dụng các nguyên thủy khác nhau cho đường vẽ, vòng tròn, vv cho mục đích. Nó phải được thực hiện bằng cách thao tác các pixel và thực hiện một trong các thuật toán để vẽ đường thẳng, khoanh tròn vv bằng cách tô màu các pixel.Làm cách nào để tô màu một pixel?

Tôi đã nghĩ đến việc sử dụng Turbo C cho mục đích này, nhưng tôi sử dụng ubuntu. Vì vậy, tôi đã thử sử dụng dosbox để cài đặt và chạy turbo C nhưng vô ích.

Hiện tại, tùy chọn duy nhất của tôi là Java. Có thể thao tác pixel trong Java không? Tôi không thể tìm thấy bản thân mình bất kỳ hướng dẫn tốt cho cùng. Nó sẽ là tuyệt vời nếu một mẫu mã cho cùng có thể được đưa ra.

+1

Nếu bạn chạy ubuntu và muốn trình biên dịch, 'apt-get install build-essential' sẽ giúp bạn có được GCC, trình biên dịch C và C++ chuẩn trong những ngày này. –

+5

Lưu ý rằng nếu bạn đang sau khi thực hiện (ví dụ như để viết một trò chơi), bạn không muốn thao tác từng và từng pixel riêng lẻ bằng cách sử dụng * setRgb *, đó là cách quá chậm. Bạn thường muốn thao tác trực tiếp dữ liệu thô cơ bản. Bạn có thể muốn xem, ví dụ, vào GetRaster của * BufferedImage() getDataBuffer()) getData() * trả về một biểu diễn int [] của các pixel của bạn. – NoozNooz42

Trả lời

28

Lớp java.awt.BufferedImage có phương thức setRGB(int x, int y, int rgb) đặt màu của một pixel riêng lẻ. Ngoài ra, bạn có thể muốn xem java.awt.Color, đặc biệt là phương pháp getRGB(), có thể chuyển đổi Màu thành số nguyên mà bạn có thể đưa vào thông số int rgb của setRGB.

+1

Liên kết bị hỏng. Xem https://docs.oracle.com/javase/8/docs/api/java/awt/image/BufferedImage.html và https://docs.oracle.com/javase/8/docs/api/java/awt /Color.html –

1

Bạn có thể thực hiện việc này bằng cách sử dụng gói dựng sẵn của java 2D Graphics.

23
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class DirectDrawDemo extends JPanel { 

    private BufferedImage canvas; 

    public DirectDrawDemo(int width, int height) { 
     canvas = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
     fillCanvas(Color.BLUE); 
     drawRect(Color.RED, 0, 0, width/2, height/2); 
    } 

    public Dimension getPreferredSize() { 
     return new Dimension(canvas.getWidth(), canvas.getHeight()); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.drawImage(canvas, null, null); 
    } 


    public void fillCanvas(Color c) { 
     int color = c.getRGB(); 
     for (int x = 0; x < canvas.getWidth(); x++) { 
      for (int y = 0; y < canvas.getHeight(); y++) { 
       canvas.setRGB(x, y, color); 
      } 
     } 
     repaint(); 
    } 


    public void drawLine(Color c, int x1, int y1, int x2, int y2) { 
     // Implement line drawing 
     repaint(); 
    } 

    public void drawRect(Color c, int x1, int y1, int width, int height) { 
     int color = c.getRGB(); 
     // Implement rectangle drawing 
     for (int x = x1; x < x1 + width; x++) { 
      for (int y = y1; y < y1 + height; y++) { 
       canvas.setRGB(x, y, color); 
      } 
     } 
     repaint(); 
    } 

    public void drawOval(Color c, int x1, int y1, int width, int height) { 
     // Implement oval drawing 
     repaint(); 
    } 



    public static void main(String[] args) { 
     int width = 640; 
     int height = 480; 
     JFrame frame = new JFrame("Direct draw demo"); 

     DirectDrawDemo panel = new DirectDrawDemo(width, height); 

     frame.add(panel); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.setResizable(false); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 


} 

alt text http://grab.by/grabs/39416148962d1da3de12bc0d95745341.png

1

Một chút niềm vui tôi đã ngày nay, nơi tôi đã sử dụng #Jave Cavas, màu, đồ họa và #Swing JFrame để tạo ra một lớp pixel đơn giản tô màu tất cả chúng ta đang làm là tạo một JFrame vuông 400 × 400 pixel (thêm vài pixel cần thiết cho khung nó tự) và sau đó chúng tôi mở rộng Canvas và tô màu các pixel đối xứng.

package gcclinux.co.uk; 

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

import javax.swing.JFrame; 

public class ColouringPixels extends Canvas { 

    private static final long serialVersionUID = 1L; 
    private static final int WIDTH = 407; // Additional pixels needed for the frame 
    private static final int HEIGHT = 427; // Additional pixels needed for the frame 


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

     for (int r = 0; r <= 2; r++) { 

     for(int y = 0; y < HEIGHT; y++) { 
      for(int x = 0; x < WIDTH; x++) { 
       if (x >= 1 && x <= 100 && y >= 1 && y <=100){ 
        g.setColor(Color.WHITE); 
       } else if (x >= 101 && x <= 200 && y >= 101 && y <=200){ 
        g.setColor(Color.RED); 
       } else if (x >= 201 && x <= 300 && y >= 201 && y <=300){ 
        g.setColor(Color.WHITE); 
       } else if (x >= 301 && x <= 399 && y >= 301 && y <=400){ 
        g.setColor(Color.RED); 
       } else    
       { 
        g.setColor(Color.BLUE); 
       } 
       g.drawLine(x, y, x, y); 
      } 
     } 
      for(int x = 0; x < HEIGHT; x++) { 
       for(int y = 0; y < WIDTH; y++) { 
        if (x >= 1 && x <= 100 && y >= 1 && y <=100){ 
         g.setColor(Color.RED); 
        } else if (x >= 101 && x <= 200 && y >= 101 && y <=200){ 
         g.setColor(Color.WHITE); 
        } else if (x >= 201 && x <= 300 && y >= 201 && y <=300){ 
         g.setColor(Color.RED); 
        } else if (x >= 301 && x <= 399 && y >= 301 && y <=400){ 
         g.setColor(Color.WHITE); 
        } else    
        { 
         g.setColor(Color.BLUE); 
        } 
        g.drawLine(x, y, x, y); 
       } 
      } 
     } 
     try { 
      Thread.sleep(2000);    // Sleep for 2 seconds 
      System.exit(0);    // Closed the program 
     }catch(InterruptedException ex) { 
      Thread.currentThread().interrupt(); 
     } 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("ColouringPixels - Lesson 9"); 
     frame.setSize(WIDTH, HEIGHT); 
     frame.setResizable(false); 
     frame.add(new ColouringPixels()); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
}