C'est l'hiver, et le moment de l'année est venu pour qu'il commence à faire froid (et que d'étranges couvre-chefs colorés commencent à apparaître ... bientôt). Écrivons du code pour faire des images d'avatar et d'autres images gelées, pour s'adapter au thème!
Contribution
La contribution aux soumissions à ce défi devrait être une image (l'image à faire figée) et un nombre (le seuil, qui sera expliqué plus loin).
Vous pouvez saisir l'image de n'importe quelle manière que votre langue prend en charge (un chemin de fichier ou une URL comme argument, la retirer du presse-papiers, faire glisser et déposer une image, etc.) et dans n'importe quel format répertorié ici qui exprime les couleurs en RVB (vous peut prendre en charge / exiger RGBA à la place si vous le souhaitez, mais ce n'est pas une exigence).
Vous pouvez également saisir le numéro de la manière que vous souhaitez (argument de ligne de commande, STDIN, boîte de dialogue de saisie, etc.), à l'exception de le coder en dur dans votre programme (ex. n=10
). Si vous utilisez un chemin de fichier / URL pour l'image, il doit également être saisi de cette manière.
Sortie
Le programme doit traiter l'image selon la description ci-dessous, puis la restituer comme vous le souhaitez (dans un fichier, l'afficher à l'écran, la mettre dans le presse-papiers, etc.).
La description
Les soumissions doivent traiter l'image avec les trois étapes suivantes. n
fait référence au numéro que votre programme a reçu en entrée avec l'image.
Appliquez un flou de rayon
n
à l'image d'entrée en remplaçant les valeurs R, G et B de chaque pixel par les valeurs moyennes R, G et B de tous les pixels dans une distance Manhattan den
pixels, en ignorant toutes les coordonnées hors limites. (C'est-à-dire tous les pixels où la somme de la différence en X et de la différence en Y est inférieure ou égale àn
.)(Remarque: j'ai utilisé un flou gaussien pour les images ci-dessus car il y avait une fonction intégrée pratique pour cela, donc vos images pourraient avoir un aspect légèrement différent.)
Définissez chaque pixel sur un pixel aléatoire à une distance de
n/2
pixels (la "distance" est définie de la même manière qu'à l'étape précédente).Cela doit être fait en parcourant l'image et en définissant chaque pixel sur un pixel aléatoire dans cette plage, de sorte que certains pixels peuvent disparaître complètement et certains peuvent être dupliqués.
Toutes les modifications doivent s'appliquer en même temps. En d'autres termes, utilisez les anciennes valeurs des pixels (après l'étape 1 mais avant cette étape), pas les nouvelles valeurs après les avoir définies sur un pixel aléatoire.
Multipliez la valeur RVB "bleue" de chaque pixel par 1,5, en la plafonnant à 255 (ou quelle que soit la valeur maximale pour une bande de pixels) et en arrondissant vers le bas.
Règles
Vous pouvez utiliser des bibliothèques d'images / des fonctions liées au traitement d'images intégrées dans votre langue; cependant, vous ne pouvez pas utiliser de fonctions exécutant l'une des trois tâches principales mentionnées dans la description. Par exemple, vous ne pouvez pas utiliser une
blur
fonction, mais unegetPixel
fonction est très bien.C'est le code-golf , donc le code le plus court en octets gagne!
la source
dx <= n && dy <= n
est une représentation précise de la distance de Manhattan, n'est-ce pas?Réponses:
Python 2 - 326
339 358Prend l'entrée de l'utilisateur. File d'abord, puis
n
.Cela pourrait probablement être joué beaucoup plus: P Merci à @ SP3000 pour les idées de golf!
Exemple d'entrée: (Windows)
Edit : Bug corrigé où le bleu se propageait (Martin avec n = 20 n'est plus une rivière; _;)
Martin avec n = 2:
Martin avec n = 10:
Martin avec n = 20:
la source
Python 2 - 617 octets
EDIT: joué au golf, on dirait que FryAmTheEggMan m'a bien battu :)
la source
Java - 1009 octets
eh, je pensais que je pouvais faire mieux que ça ...
Martin avec n = 5:
n = 20:
Moi avec 10:
la source
k&0xFF00
? De plus, ne pourriez-vous pas utiliser255
à la place de0xFF
?C, 429 (391 + 38 pour définir des drapeaux)
Format d'entrée:
pam
fichier sans commentaire ni espace supplémentaire dans l'en-tête, contenu transmis via STDIN.n
des arguments sont requis (ils peuvent être n'importe quoi).Format de sortie:
pam
fichier en STDOUT.Compiler:
-Wl,--stack,33554432
augmente la taille de la pile; cela peut être modifié ou supprimé, selon la taille de l'image en cours de traitement (le programme nécessite une taille de pile supérieure au double du nombre de pixels multiplié par 4).-funsigned-char
utilise gccunsigned char
au lieu designed char
forchar
. Les normes C autorisent l'une ou l'autre de ces options, et cette option est uniquement nécessaire ici car gcc utilisesigned char
par défaut.Pour exécuter (n = 5):
Remarque: Si la compilation sous Windows,
stdio.h
,fcntl.h
etio.h
doit être inclus, et le code suivant ajouté au début demain()
afin que le programme de lecture / écriture à STDIN / STDOUT sous forme binaire, pas de texte, les flux (ce qui est hors de propos sur Linux, mais Windows utilise\r\n
au lieu de\n
pour les flux de texte).Version commentée
Martin avec n = 10:
Martin avec n = 20:
Martin avec n = 100:
la source
R, 440 caractères
Avec des sauts de ligne pour plus de lisibilité:
Exemple d'entrée:
f(2,"avatar.png")
Résultats avec n = 2
... avec n = 10
... avec n = 20
la source