Image to ASCII
JMArts Design
Posted on July 7, 2024
Esse código é uma implementação de arte ASCII em Processing, que converte uma imagem em numa representação de caracteres ASCII. Vamos comparar esse código com a versão em Processing e explicá-lo em detalhes:
Código em Processing
O código em Processing seria muito semelhante, com algumas diferenças sintáticas e de API. Aqui está uma versão equivalente em Processing:
Processing Code
PImage img;
int cellSize = 8; // Tamanho da célula ASCII
void preload() {
// Carrega a imagem antes do setup
img = loadImage("example.jpg");
}
void setup() {
size(1024, 1024);
textSize(cellSize);
fill(255); // Define a cor do texto como branco
}
void draw() {
background(0);
if (img != null) {
img.filter(GRAY);
pushMatrix();
scale(1.0 * width / img.width, 1.0 * height / img.height);
for (int x = 0; x < img.width; x += cellSize) {
for (int y = 0; y < img.height; y += cellSize) {
color c = img.get(x, y);
float gray = brightness(c);
char asciiChar = getASCIIChar(gray);
text(asciiChar, x, y + cellSize);
}
}
popMatrix();
}
}
char getASCIIChar(float gray) {
if (gray >= 0 && gray <= 25) {
return 'M';
} else if (gray >= 26 && gray <= 50) {
return '$';
} else if (gray >= 51 && gray <= 76) {
return 'o';
} else if (gray >= 77 && gray <= 102) {
return '|';
} else if (gray >= 103 && gray <= 127) {
return '*';
} else if (gray >= 128 && gray <= 152) {
return ':';
} else if (gray >= 153 && gray <= 178) {
return '\'';
} else if (gray >= 179 && gray <= 204) {
return '.';
} else {
return ' ';
}
}
void keyPressed() {
if (key == 's') {
saveASCIIArt(); // Salvar a imagem ASCII art
} else if (key == 'r') {
img = null; // Limpar a imagem para começar de novo
}
}
void saveASCIIArt() {
saveCanvas("ascii-art", "png");
println("ASCII art saved as image.");
}
As principais diferenças entre o código em Processing e o código em JavaScript (P5.js) são:
- Sintaxe e Nomenclatura: O código em Processing usa a sintaxe e a nomenclatura da linguagem Java, enquanto o código em P5.js usa a sintaxe e a nomenclatura do JavaScript.
-
Declaração de Variáveis: Em Processing, as variáveis são declaradas usando o tipo de dado (como
PImage
para imagens), enquanto em P5.js, as variáveis são declaradas usandolet
. -
Funções: Em Processing, as funções são definidas usando a palavra-chave
void
ou o tipo de retorno, enquanto em P5.js, as funções são definidas usando a sintaxe de função do JavaScript. -
Chamadas de Função: Em Processing, as funções são chamadas usando o nome da função seguido de parênteses, como
loadImage()
etext()
. Em P5.js, as funções são chamadas da mesma maneira, mas a sintaxe é ligeiramente diferente, comoloadImage()
etext()
. -
Constantes: Em Processing, as constantes são definidas usando
final
, comoGRAY
. Em P5.js, as constantes são acessadas diretamente, comoGRAY
.
Apesar dessas diferenças sintáticas, o fluxo de execução e a lógica do programa são muito semelhantes entre as duas versões. Ambas carregam uma imagem, convertem-na em tons de cinza, percorrem a imagem célula por célula e exibem os caracteres ASCII correspondentes no canvas.
Explicação do Código
O código em Processing e o código em P5.js realizam as mesmas tarefas, com algumas diferenças de sintaxe e API. Vamos explicar o código passo a passo:
Declaração de Variáveis: Ambos os códigos declaram uma variável para armazenar a imagem (
img
) e uma variável para definir o tamanho da célula ASCII (cellSize
).Função
preload()
: Essa função é chamada antes dosetup()
e carrega a imagemexample.jpg
antes que o programa seja executado.Função
setup()
: Essa função é chamada uma vez, no início do programa. Ela cria um canvas de 1024x1024 pixels, define o tamanho do texto para o tamanho da célula ASCII e define a cor do texto como branco.-
Função
draw()
: Essa função é chamada repetidamente, a cada quadro. Ela:- Define o fundo como preto.
- Verifica se a imagem foi carregada.
- Converte a imagem para tons de cinza.
- Dimensiona a imagem para preencher todo o canvas.
- Percorre a imagem célula por célula.
- Para cada célula, obtém o valor de brilho (escala de cinza) e usa a função
getASCIIChar()
para obter o caractere ASCII correspondente. - Exibe o caractere ASCII no canvas.
Função
getASCIIChar(gray)
: Essa função recebe um valor de brilho (escala de cinza) e retorna o caractere ASCII correspondente, com base em um conjunto de intervalos predefinidos.-
Função
keyPressed()
: Essa função é chamada quando uma tecla é pressionada. Ela verifica se a tecla pressionada é 's' ou 'r':- Se for 's', ela chama a função
saveASCIIArt()
para salvar a imagem ASCII art. - Se for 'r', ela define a variável
img
comonull
, limpando a imagem para que o usuário possa começar de novo.
- Se for 's', ela chama a função
Função
saveASCIIArt()
: Essa função salva o canvas atual como uma imagem PNG com o nome 'ascii-art' e registra uma mensagem no console.
Embora haja algumas diferenças sintáticas entre o código em Processing e o código em P5.js, a lógica e o fluxo de execução são muito semelhantes. Ambos os códigos convertem uma imagem em uma representação de caracteres ASCII e permitem que o usuário salve a imagem ASCII art.
Sketch em openprocessing.org -
Image to ASCII
Posted on July 7, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.