Para mostrar que programar não é puramente escravidão, trouxe um pequeno código para deixar o dia mais divertido.
Venho hoje ensinar como transformar imagens em arte ASCII, utilizando a linguagem de programação PHP.
No nosso exemplo iremos pegar esta imagem:

E transformar em mais ou menos isso:

Para tanto iremos precisar da linguagem PHP (como diz o título do artigo, duh!) e da biblioteca GD ativada nas configurações da linguagem, o que é bastante comum nos servidores e instalações desktop (vide xampp).
O código que faz a conversão é o seguinte:
<?php
/* abrimos a imagem */
$arquivo = imagecreatefromjpeg("epic.jpg");
/* verificamos se estamos com o stream aberto */
if ( $arquivo ) {
/* pegamos a largura e a altura da imagem para ser utilizado no loop de leitura */
$largura = imagesx( $arquivo );
$altura = imagesy( $arquivo );
/* damos um loop de linha em linha */
for ( $y = 0; $y < $altura; $y = $y + 1 ) {
/* damos o loop para ir de colona em coluna */
for( $x = 0; $x < $largura; $x = $x + 1 ) {
/* pegamos a cor alocada na posição (x, y) da iamgem */
$rgb = @imagecolorat($arquivo, $x, $y);
$cores = imagecolorsforindex($arquivo, $rgb);
/* imprimimos um * com a cor do ponto */
echo "<font style='color:rgb("
. $cores["red"] . ","
. $cores["green"] . ","
. $cores["blue"] . ")'>*</font>";
}
/* chegamos ao fim do loop das colunas, então iremos imprimir a próxima linha */
echo "<br>";
}
}
?>
Alguns podem não estar familiarizados com as funções:
- ImageColorAt – Que le o ponto (x, y) da imagem e retorna um inteiro contento as cores R,G,B daquele pontoImageColorsForIndex – Que recebe o valor gerado por ImageColorAt e o divide em um array, o que facilita o nosso trabalho
Como podemos melhorar o nosso código?
Notem que o nosso loop lê a imagem ponto-a-ponto. Isso é legal pois deixa o nosso resultado bastante nítido, mas a ponto de desempenho é absolutamente pífio.
Podemos dar uma melhorada no desempenho da nossa conversão reduzindo a quantidade de pontos retirados da imagem, mas tentando evitar a perda de nitidez.
Ao invez de pegar ponto-a-ponto na imagem podemos pegar 1 ponto a cada 3 pontos fazendo a seguinte alteração:
alterar a linha 17 que contém:
for( $x = 0; $x < $largura; $x = $x + 1 ) {
para:
for( $x = 0; $x < $largura; $x = $x + 3 ) {
Note que o desempenho atual foi bem maior e que a sua imagem pode ter ficado um pouco distorcida.
Para melhorar o problema da distorção, faça a mesma alteração no loop das linhas, alterando a linha 14 que contém:
for ( $y = 0; $y < $altura; $y = $y + 1 ) {
para:
for ( $y = 0; $y < $altura; $y = $y + 3 ) {
Claro que este código pode ser melhorado mil vezes, tanto em desempenho quanto em funcionalidade.
Ele pode ser alterado para abranger outros formatos de imagem usando funções como ImageCreateFromGif, ImageCreateFromPng, etc.
Este artigo foi escrito no site PapoGeek e pode ser lido na URL:
http://www.papogeek.com.br/2010/07/transformando-imagens-em-arte-ascii-com-php






