Tarefa
Escreva um programa ou função que tire uma imagem de largura we altura h, e dois números inteiros a <= w/2e b <= h/2, e produza uma representação artística da imagem, com as dimensões ax b.
A arte ascii deve ser gerada através das seguintes etapas (ou outro processo com a mesma saída):
Redimensionar o
wxhpara2ax2b. A cor do pixel(x, y)na imagem redimensionada deve ser igual à média das cores de todos os pixels da imagem original dentro do retângulo com os seguintes cantos:(floor[x * w/2a], floor[y * h/2b]) (ceil[(x+1) * w/2a], ceil[(y+1) * h/2b])A imagem redimensionada deve ser dessaturada tomando a média dos componentes vermelho, verde e azul da cor e definindo cada componente para essa média.
Um caractere deve ser emitido para cada bloco 2x2 de pixels, seguindo as regras abaixo:
- Deixe
e = 3 - floor[color/64], onde cor se refere ao componente vermelho da cor do pixel superior esquerdo (no intervalo de 0 a 255). Vamosf,gehreferem-se a este valor, mas para o canto superior direito, canto inferior esquerdo, e pixels inferior direito, respectivamente. - Vamos
zser a média dee,f,g,h. - Emita o caractere correspondente ao seguinte (branco representa um pixel onde
3 - floor[color/64]é zero e cinza representa diferente de zero).
= Saída de espaço ( )
ou
= Saída "see (or f) >= 2e'caso contrário.
ou
= Saída ,seg (or h) >= 2e.caso contrário.
ou
= Saída-
ou
= Saída;
= Saída \
= Saída /
= Saída J
= Saída L
= Saída 7
= Saída P
z = 1: saída*.z = 2: saídaC.z = 3: saída#.
- Deixe
Outras notas: Todas as médias tomadas nas etapas acima devem usar a divisão inteira (ou seja, arredondar para 0).
Você pode usar uma biblioteca para ler imagens, mas as bibliotecas não podem ser usadas para as etapas de redimensionamento e dessaturação.
Entrada
Seu programa coletará três dados:
- Uma imagem. Esta imagem pode estar em qualquer formato de sua escolha (por exemplo, PNG, PPM)
- A largura da arte ascii (em número de caracteres)
- A altura da arte ascii (em número de caracteres)
A entrada pode ser lida através de STDIN, passada como um argumento de linha de comando, armazenada como uma variável, etc.
Resultado
Seu programa exibirá a arte ascii gerada a partir da imagem e através do processo descrito acima. Cada linha deve ter a mesma largura (a largura passada como entrada) e nenhum espaço extra pode ser adicionado ou removido. A última linha pode ter uma nova linha à direita, mas isso não é obrigatório. Linhas em branco (linhas apenas com espaços) não devem ser omitidas.
Exemplos
Todas as imagens foram tiradas da Wikipedia e lançadas em domínio público. Espera-se que seu programa funcione para todas as imagens e entradas válidas.

Largura = 52, Altura = 25:
------ - ----.
- ********** L .-- .-- 7 ---- P-
.J ****************. . ********* \.
, ****************** L \ J ********** '.
- ********************. J *********** L /
J *********************; ./*************.EU
; ********************* PJ **************; 7;
. ********************** '. *************** ;; *
; **********************; ***************; J *.
*********************** ******* P ******** '**;
C ********************* C ******* P; *******. **;
C ********************** J ***************; **;
C *********************; ****************. **;
********************** '*************** P; **
J ********************* P *************** / ***
. ********************** 7 ************* 'J **;
; ******************** C "'P *********** PJ ***'
"7 ****************** C" '********** P. ** C;
'* C *************'; ********* - J ** CP
'* C ********** P 7 ** 7 ** P / - **** P
- * CC0C * P- '7 ******** P'
'---' --- '
Largura: 70, Altura: 3:
---------------------------. .----------------
J ***************************** P -J ***************** *** / J **;
---------- ********* P --------- '-------------------- - '

Largura: 50, Altura: 25:
.J ---
.J * P --- J * L--.
J *** 'L -J *********** -
J ****; **************** L
; ***** '.J ********************
J **** 7 ************************ P
** CC *; . ********* LJ *********** P-
** C * P 'J ********************** -
7 * C * L **********************;
J * C **; **********************;
JC ** C **. ; ; ******** CCC * C ** CC0 **
"7 ***** L. 7 ***** CCCCCC **** CC ** '
- *****. -J - ** C * C * CC ****** CC * '
; ** CC ***; '** CCC ***** ATCC *;
«- **** - - *** SHIPC *** -
'------'

Largura: 26, Altura: 17:
- ,EU
J - ** L .C #
J '; * PL, C # "
.PP 7. JC7P
;; * J ;; C'C;
J; CC; L C "#
* L 7-P; *; PC
7CL *** J * PC '#
'7 # C * C # P'; P JC # C-
J # CCC # L .JC # CJCC ## C;
; # - - #, CCC # CCCCCCCC
; * .- -.C; ; CCCCCCCCCCCC
; **** J ** L; CCCCCCCCCCCC
; *******; 'CCCCCCCCCCCP
'*******' CCCCCCCCCCC '
'* P-7 *' "CC0P" -
'---
Isso é código-golfe , então a resposta mais curta vence.