Escrevendo pixel a pixel usando o Canvas
Ao criar o canvas, temos que acessar o Graphics2d se quisermos trabalhar nele. O mesmo Graphics2d permite acesso a uma classe do tipo PixelWriter e com ela podemos configurar a cor de cada pixel de um canvas! Veja o exemplo mais básico possível que gera um canvas com pixels aleatórios:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.Random; | |
import javafx.application.Application; | |
import javafx.scene.Scene; | |
import javafx.scene.canvas.Canvas; | |
import javafx.scene.image.PixelWriter; | |
import javafx.scene.layout.StackPane; | |
import javafx.scene.paint.Color; | |
import javafx.stage.Stage; | |
public class Main extends Application { | |
private static final int WIDTH = 800; | |
private static final int HEIGHT = 600; | |
public static void main(String[] args) { | |
launch(); | |
} | |
@Override | |
public void start(Stage stage) throws Exception { | |
Canvas canvas = new Canvas(WIDTH, HEIGHT); | |
PixelWriter pixelWriter = canvas.getGraphicsContext2D().getPixelWriter(); | |
Random random = new Random(); | |
for (int i = 0; i < WIDTH; i++) { | |
for (int j = 0; j < HEIGHT; j++) { | |
float r = random.nextFloat(); | |
float g = random.nextFloat(); | |
float b = random.nextFloat(); | |
pixelWriter.setColor(i, j, Color.color(r, g, b)); | |
} | |
} | |
stage.setScene(new Scene(new StackPane(canvas), WIDTH, HEIGHT)); | |
stage.setTitle("Manipulando Pixel a Pixel de um canvas"); | |
stage.show(); | |
} | |
} |
O código é simples:
- Inicialmente criamos um canvas e pegamos o pixel writer dele;
- Há um for de for que passará por cada posição do canvas - indo até a largura e a altura da aplicação;
- Nesse for de for criamos valores aleatórios para R (vermelho), G (verde) e B (azul);
- Então escrevemos o pixel usando o PixelWriter com uma cor que criamos a partir dos valores aleatórios;
- Por fim temos toda a já conhecida parte do JavaFX, que é de criar uma scene, uma raiz.
O resultado é algo similar ao seguinte sempre com valores aleatórios ao executar a aplicação:
Temos bastante pontos cinza, pois o ponto cinza equivale a valores iguais de RGB!
Olhem mais um exemplo bacana:
Veja o código
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import javafx.application.Application; | |
import javafx.scene.Scene; | |
import javafx.scene.canvas.Canvas; | |
import javafx.scene.canvas.GraphicsContext; | |
import javafx.scene.image.PixelWriter; | |
import javafx.scene.layout.StackPane; | |
import javafx.scene.paint.Color; | |
import javafx.stage.Stage; | |
import static java.lang.Math.*; | |
public class Vermelhao extends Application { | |
private static final float WIDTH = 800; | |
private static final float HEIGHT = 600; | |
public static void main(String[] args) { | |
launch(); | |
} | |
@Override | |
public void start(Stage stage) throws Exception { | |
System.out.println(sqrt(pow(0 - 400, 2) + pow(0 - 300, 2))); | |
Canvas canvas = new Canvas(WIDTH, HEIGHT); | |
GraphicsContext ctx = canvas.getGraphicsContext2D(); | |
final PixelWriter pixelWriter = ctx.getPixelWriter(); | |
double maiorDistancia = sqrt(pow(0 - 800, 2) + pow(0 - 600, 2)) / 2; | |
for (int i = 0; i < WIDTH; i++) { | |
for (int j = 0; j < HEIGHT; j++) { | |
double d = Math.sqrt(Math.pow((WIDTH / 2) - i, 2) + Math.pow((HEIGHT / 2) - j, 2)); | |
d = d / maiorDistancia; | |
pixelWriter.setColor(i, j, Color.color(1 - d, 0, 0)); | |
} | |
} | |
stage.setTitle("Manipulando Pixel a Pixel de um canvas"); | |
stage.show(); | |
stage.setScene(new Scene(new StackPane(canvas), WIDTH, HEIGHT)); | |
} | |
} |
Bem, essa foi uma postagem rápida. Pretendo criar algo bacana com isso, então precisava introduzir essa classe. Até mais, pessoal!
Nenhum comentário:
Postar um comentário