É inverno e chegou a época do ano para começar a esfriar (e para estranhos lenços de cabeça coloridos começarem a aparecer ... em breve). Vamos escrever um código para criar imagens de avatar e outras imagens congeladas, para se adequar ao tema!
Entrada
A entrada para os envios para esse desafio deve ser uma imagem (a imagem a congelar) e um número (o limite, que será explicado mais adiante).
Você pode inserir a imagem da maneira que o seu idioma suportar (um caminho de arquivo ou URL como argumento, retirá-la da área de transferência, arrastar e soltar uma imagem etc.) e em qualquer formato listado aqui que expresse cores em RGB (você pode suportar / exigir RGBA, se desejar, mas isso não é um requisito).
Você também pode inserir o número da maneira que desejar (argumento de linha de comando, STDIN, caixa de diálogo de entrada etc.), com a exceção de codificá-lo em seu programa (por exemplo n=10
). Se você usar um caminho / URL de arquivo para a imagem, ela deverá ser inserida dessa maneira também.
Saída
O programa deve processar a imagem de acordo com a descrição abaixo e enviá-la da maneira que desejar (para um arquivo, mostrando-o na tela, colocando-o na área de transferência, etc.).
Descrição
As submissões devem processar a imagem com as três etapas a seguir. n
refere-se ao número que seu programa recebeu como entrada junto com a imagem.
Aplique um desfoque de raio
n
à imagem de entrada, substituindo os valores de R, G e B de cada pixel pelos valores médios de R, G e B de todos os pixels a uma distância den
pixels de Manhattan , ignorando todas as coordenadas fora dos limites. (Ou seja, todos os pixels em que a soma da diferença em X e a diferença em Y é menor ou igual an
.)(nota: usei um desfoque gaussiano para as imagens acima porque havia uma função interna conveniente para ela, para que suas imagens pudessem parecer um pouco diferentes.)
Defina cada pixel como um pixel aleatório a uma distância de
n/2
pixels ("distância" é definida da mesma maneira que na etapa anterior).Isso deve ser feito percorrendo a imagem e definindo cada pixel para um pixel aleatório nesse intervalo, para que alguns pixels desapareçam completamente e outros possam ser duplicados.
Todas as alterações devem ser aplicadas ao mesmo tempo. Em outras palavras, use os valores antigos dos pixels (após a etapa 1, mas antes desta etapa), não os novos valores após defini-los para um pixel aleatório.
Multiplique o valor RGB "azul" de cada pixel por 1,5, limitando-o a 255 (ou qualquer que seja o valor máximo para uma faixa de pixels) e arredondando para baixo.
Regras
Você pode usar bibliotecas de imagens / funções relacionadas ao processamento de imagens incorporadas ao seu idioma; no entanto, você não pode usar nenhuma função que execute uma das três principais tarefas mencionadas na descrição. Por exemplo, você não pode usar uma
blur
função, mas umagetPixel
função está correta.Isso é código-golfe , então o código mais curto em bytes vence!
fonte
dx <= n && dy <= n
é uma representação precisa da distância de Manhattan, não é?Respostas:
Python 2 - 326
339 358Recebe informações do usuário. Arquivo primeiro, então
n
.Provavelmente, isso poderia ser muito mais praticado: P Graças ao @ SP3000 por idéias de golfe!
Entrada de amostra: (Windows)
Edit : Bug corrigido onde o azul estava sendo propagado (Martin com n = 20 não é mais um rio; _;)
Martin com n = 2:
Martin com n = 10:
Martin com n = 20:
fonte
Python 2-617 bytes
EDIT: jogou golfe, parece que FryAmTheEggMan me venceu :)
fonte
Java - 1009 bytes
eh, eu pensei que poderia fazer melhor que isso ...
Martin com n = 5:
n = 20:
Eu com 10:
fonte
k&0xFF00
? Além disso, você não poderia usar255
no lugar de0xFF
?C, 429 (391 + 38 para definir sinalizadores)
Formato de entrada:
pam
arquivo sem comentários ou espaço em branco extra no cabeçalho, conteúdo transmitido via STDIN.n
argumentos são necessários (eles podem ser qualquer coisa).Formato de saída:
pam
arquivo em STDOUT.Compilar:
-Wl,--stack,33554432
aumenta o tamanho da pilha; isso pode ser alterado ou removido, dependendo do tamanho da imagem que está sendo processada (o programa requer um tamanho de pilha maior que o dobro do número de pixels vezes 4).-funsigned-char
tem o uso do gcc emunsigned char
vez designed char
parachar
. Os padrões C permitem qualquer uma dessas opções, e essa opção é necessária apenas aqui porque o gcc usasigned char
por padrão.Para executar (n = 5):
Nota: Se a compilação no Windows,
stdio.h
,fcntl.h
eio.h
deve ser incluído, e o seguinte código adicionado ao início domain()
fim para o programa de leitura / gravação para STDIN / STDOUT como binário, não texto, córregos (isso é irrelevante no Linux, mas Windows usa em\r\n
vez de\n
para fluxos de texto).Versão comentada
Martin com n = 10:
Martin com n = 20:
Martin com n = 100:
fonte
R, 440 caracteres
Com quebras de linha para legibilidade:
Entrada de amostra:
f(2,"avatar.png")
Resultados com n = 2
... com n = 10
... com n = 20
fonte