Как покрасить пиксель? - PullRequest
13 голосов
/ 24 июля 2010

Мне нужно создать простую 2D анимацию без использования различных примитивов для рисования линии, круга и т. Д.Это должно быть сделано путем манипулирования пикселями и реализации одного из алгоритмов рисования линий, окружностей и т. Д. Путем окрашивания пикселей.

Я думал об использовании Turbo C для этой цели, но я использую Ubuntu.Поэтому я попытался использовать dosbox для установки и запуска Turbo C, но безрезультатно.

Теперь мой единственный вариант - это Java.Можно ли манипулировать пикселями в Java?Я не мог найти себе хорошие учебники для того же.Было бы здорово, если бы можно было дать пример кода для этого.

Ответы [ 4 ]

30 голосов
/ 24 июля 2010

Класс java.awt.BufferedImage имеет метод setRGB(int x, int y, int rgb), который устанавливает цвет отдельного пикселя.Кроме того, вы можете захотеть взглянуть на java.awt.Color, особенно на его метод getRGB(), который может преобразовывать цвета в целые числа, которые можно вставить в параметр int rgb в setRGB.

23 голосов
/ 24 июля 2010
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);
    }


}

альтернативный текст http://grab.by/grabs/39416148962d1da3de12bc0d95745341.png

2 голосов
/ 17 декабря 2014

Еще одна забавная вещь, которую я получил сегодня, когда я использовал #Jave Cavas, Color, Graphics и #Swing JFrame для создания просто окрашивающего класса пикселей, все, что мы делаем, - это создаем квадрат в JFrame 400 × 400 пикселей (несколько дополнительных пикселей требуется длярамка сама), а затем мы расширяем холст и симметрично окрашиваем пиксели.

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);
    }
}
0 голосов
/ 24 июля 2010

Вы можете сделать это, используя встроенный в Java пакет 2D Graphics .

...