Étant donné une image, soit en entrée (éventuellement en triplets RVB) ou avec le nom de fichier en entrée (vous pouvez supposer que l'image a un nom de fichier spécifique, éventuellement sans extension), sortez une image représentant un seul canal de couleur de l'image.
Vous prendrez également une autre entrée, représentant le canal à produire. L'entrée peut être l'un des 3 symboles distincts. Cependant, les symboles doivent être soit une chaîne soit un nombre. Cependant, vous ne pouvez pas prendre une matrice à appliquer au tableau en entrée. (comme {1, 0, 0}
ou {0, 1, 0}
).
Vous sortirez le <input>
canal de l'image d'entrée. Vous pouvez soit l'enregistrer dans un fichier, soit produire un ensemble de paires RVB.
Votre programme ne doit pas avoir de limites sur la taille de l'image (en px) et doit prendre en charge les triplets .png
, .jpg
/ .jpeg
/ .JPG
, ou RVB en tant que formats d'image. (il peut cependant en prendre en charge autant que vous le souhaitez)
Cas de test:
Circuit Rouge:
Circuit Vert:
Canal bleu:
Et un autre cas de test, entièrement de rouge. Photo originale , rouge , verte et bleue . (avertissement: le canal uni et rouge fait mal à regarder trop longtemps)
2 autres cas de test:
Original , rouge , vert , bleu .
Original , rouge , vert , bleu .
Les deux derniers cas de test proviennent d' images avec toutes les couleurs .
Réponses:
APL (Dyalog) , 7 octets
E / S: tableau de triplets RVB
Essayez-le en ligne!
⍳3
trois premiers entiers⎕=
comparer l'entrée numérique (le canal choisi) à celle⊂
joindre (donc chaque triplet d'image associe ce triplet entier)⎕×
multiplier l'entrée numérique (le tableau des triplets) avec cellela source
JavaScript (ES6), 29 octets
L'entrée est un tableau 2D d'entiers 24 bits (par exemple
[[0x0000ff,0x00ff00],[0xff0000,0xffffff]]
) et16711680
pour le rouge,65280
pour le vert,255
pour le bleu. Si ce n'est pas valide, essayez ceci à la place:JavaScript (ES6), 48 octets
L'entrée est un tableau 3D de valeurs de couleur et
0
pour le rouge, le1
vert et le2
bleu.la source
Mathematica, 13 octets
Cela devrait être la version légitime de la réponse de JungHwan Min. Cette fonction prend l'image et l' une
Red
,Green
,Blue
comme entrée. Par exemple:Pour vous amuser, il y a aussi
ColorSeparate
qui vous donne des canaux individuels, mais il les renvoie sous forme d'images monocanal / en niveaux de gris, vous devrez donc les multiplier par la couleur par la suite.la source
Bash + ImageMagick,
353227 octetsSuppose l'image est dans le fichier
i
et le script prend l' uneRG
,BG
,BR
pour le bleu, rouge et vert respectivement; sorties dans le fichieri
.la source
Spectre , sans concurrence, 1 octet
(Non concurrent car ce défi a inspiré ce langage.) En réalité, Spectrum est une bibliothèque npm avec une interface de langage pour les commandes.
Prend l'entrée comme:
Appelez le programme comme:
Vous pouvez également fournir des informations aux invites:
Cela laisse l'image sur la pile. Pour le voir, ajoutez
O
à la fin, comme ceci:Pour plus de plaisir, essayez
echo filename | node spectrum.js "wO"
. Il effectue les trois isolations de canaux à la fois:la source
n[d1=`[d1-P*][],.g!]#Pdd1-P~%-1=p
JavaScript (ES6), 29 octets
Un peu comme la réponse d'ETHproductions mais avec une entrée plus flexible que la première méthode et plus petite que la seconde.
Ceci définit une fonction qui accepte l'image comme un tableau unidimensionnel d'intensités de couleur numériques. Cette fonction renvoie ensuite une autre fonction qui accepte une valeur entière représentant le canal de couleur souhaité.
Les couleurs peuvent être représentées par n'importe quelle plage numérique tant que 0 indique une absence totale de couleur. Par exemple
0.0 - 1.0
ou0 - 255
Exemples:
Si les données d'image sont au format RVB, l'appel de la fonction avec des arguments
(imageData)(0)
renvoie l'image avec uniquement le canal rouge.Si les données d'image sont au format BGR, l'appel de la fonction avec des arguments
(imageData)(2)
renvoie également l'image avec uniquement le canal rouge.la source
i%3==b&&v
marche aussi.Python 2, 69 octets
Toujours au golf.
Prend l'entrée comme
filename, n
(oùn
est 0, 1 ou 2). Enregistre la nouvelle image sur l'ancienne.0
est vert,1
rouge et2
bleu. Merci à @ovs, @Mikhail et @Rod pour les octets désactivés.la source
k[:,:,x[i][0]]=k[:,:,x[i][1]]=0
k[:,:,[1,2,0][i]]=k[:,:,i]=0
from cv2 import*
pour économiser quelques octetsk[:,:,i-1]=k[:,:,i]=0
park[:,:,[i,i-1]]=0
CJam , 12 octets
Un bloc anonyme qui attend un tableau 3D de triplets RVB et un nombre compris entre 0 et 2 inclus sur la pile. Laisse ensuite le tableau extrait sur la pile.
Pourrait peut-être jouer au golf en utilisant un format d'entrée bizarre, mais j'ai l'impression que ça triche un peu.
Essayez-le en ligne!
Le cas de test est constitué juste pour démontrer, l'utilisation des triplets à partir d'une image réelle serait beaucoup trop grande.
Explication
la source
PowerShell , 282 octets
Rien de tout cela "jouer au golf à l'entrée" ou "à l'aide de fonctions intégrées". Phooey là-dessus. ;-)
Ceci prend ici le chemin complet d'un PNG d'entrée (cependant, à proprement parler, il n'a pas besoin d'être un PNG, car JPG, BMP, etc. sont pris en charge par .NET, mais je ne l'ai essayé que sur PNG), et un
(R, G, B)
pour le canal de couleur, puis les stocke dans$x
et$y
. Nous créons ensuite unNew-Object
typeSystem.Drawing.Bitmap
de$x
et stockons cela dans$a
.Ensuite, nous faisons une double boucle sur tous les pixels. Tout d' abord de
1
jusqu'à$a
« s.Height
, réglage de$h
chaque itération (il est indexé zéro, c'est pourquoi nous--$_
, ce qui permet d' économiser sur octets( .height-1)
. A l' intérieur, on boucle de1
jusqu'à$a
» s.Width
.Chaque itération, nous effectuons un
.GetPixel
sur lesw,h
coordonnées particulières , ce qui renvoie unSystem.Drawing.Color
objet. Nous enselect
sortons lesR G B
valeurs. Leiex
voici une astuce qui transforme cela en une table de hachage (par exemple, quelque chose comme@{R=34; G=177; B=76}
) afin que nous puissions indexer directement avec ce canal de couleur désirée[$y]
. Cette valeur est stockée dans$i
.Ensuite, nous avons défini trois valeurs
$r, $g, $b
comme étant le résultat de certains opérateurs pseudo-ternaires basés sur la valeur de la lettre de$y
. Ainsi, par exemple, si$y
c'est le casR
, le résultat est ici$r=$i, $g=0, $b=0
.Ensuite, nous faisons un
.SetPixel
retour sur cettew,h
coordonnée particulière , en construisant une nouvelle enSystem.Drawing.Color
utilisant la statiqueFromARGB
(qui suppose que l'alpha est entièrement opaque). Une fois que nous avons terminé la boucle, nous avons simplement.Save
le PNG dans un nouveau fichier.Remarque: cela prend beaucoup de temps, car il effectue une boucle complètement indépendante à travers chaque pixel et effectue un tas de calculs et appelle chaque itération.
Tests:
la source
Bash + ImageMagick, 41 octets
L'entrée est un fichier nommé
x
, paramètre de ligne de commande l'unR
ouG
ouB
La sortie écrase le fichier d'entrée
Diffère de la réponse de betseg en prenant un paramètre de canal à lettre unique plus naturel. Écraser également au lieu de sortir un nouveau fichier que betseg est libre de voler :)
la source
$1
guillemets ont besoin, les noms de fichiers peuvent avoir des espacesx
pour 1 octet de moins.Puce , 78 octets
Essayez-le en ligne!
La puce est un langage 2D qui fonctionne sur les bits composants de chaque octet dans un flux d'octets.
Présentation
Cette solution particulière s'attend à ce que le premier octet d'entrée soit le caractère de contrôle - pour définir quel (s) canal (s) conserver - et ce qui suit est l'octet des données d'image. Les données d'image doivent être des triplets RVB, un octet par canal, 24 bits par pixel:
Le caractère de contrôle est interprété comme un champ de bits, bien que seuls les trois bits les plus bas aient une signification:
Cela signifie que nous pouvons utiliser des caractères ASCII pour sélectionner le canal que nous voulons:
1
signifie rouge2
signifie bleu4
signifie vertOu faites quelque chose de plus chic:
5
garder le rouge et le bleu, mais pas le vert7
garder tous les canaux (l'image est inchangée)0
supprimer tous les canaux (l'image est noire)Comment ça marche
Cette solution est plutôt brouillée en raison du golf, mais voici:
C
,B
etA
, et stocker les bits correspondants dans leursM
cellules Emory. En outre,S
supprimez la sortie pour le premier cycle./
commutateurs pour sortir l'octet d'entrée actuel, s'il est éteint, ouvrez les commutateurs pour que nous sortions un octet zéro.Affichage des résultats
Bien sûr, vous pouvez utiliser hexdump ou quelque chose d'ennuyeux, mais il s'avère que c'est (presque) un format d'image valide réel: PixMap portable binaire .
Plop juste les données d'image d'en haut (moins l'octet de contrôle, bien sûr) dans le fichier ci-dessous, ajustez la largeur / hauteur pour être valide, et vous pouvez afficher l'image dans une visionneuse appropriée comme IrfanView, bien que plus simple (comme la plupart des navigateurs) intégrés) ne peut pas le gérer.
Par exemple (en utilisant des échappements pour les données brutes):
la source
MATL,
2113 octetsLe canal de couleur doit être spécifiée en utilisant le mappage suivant:
1:red
,2:green
,3:blue
Les interprètes en ligne ne peuvent pas utiliser
imread
pour lire les images, voici donc une version légèrement modifiée où j'ai codé en dur une image aléatoire dans la source .Explication
la source
05AB1E , 16 octets
Essayez-le en ligne!
Utilise des couleurs hexadécimales dans un format de tableau 2D et [0,1,2] pour chaque canal.
la source
Clojure,
421332 octets-89 octets en insérant agressivement tout, en changeant de ma vieille méthode ridicule de supprimer les canaux et en supprimant une importation accidentelle inutile.
J'ai giflé ça une demi-heure avant le début de mon quart de travail, sans savoir ce que je faisais. J'ai peu d'expérience avec
BufferedImage
, donc il peut y avoir une meilleure façon de procéder. J'abuse égalementColor
pour convertir des va-et-vient entre les représentations de couleurs entières et individuelles.C'est comiquement énorme par rapport aux autres réponses pour quelques raisons (en plus de l'évidence que Clojure n'est pas une langue de golf):
Au lieu de simplement manipuler un tableau d'octets, cela prend en fait en entrée une image, la modifie et la sort.
J'utilise Java-interop, qui, bien que pratique, peut parfois être assez verbeux. Les importations à elles seules dépassent de nombreuses réponses.
Voir le code ci-dessous pour une ventilation.
la source
Lua (framework love2d), 498 octets
Je l'ai fait plus comme un exercice pour moi-même, donc ce n'est pas aussi court que cela pourrait être (même si j'ai essayé de jouer au golf), mais je voulais l'ajouter ici parce que je pense que j'ai bien fait. Même si je suis trop tard.
Ici, le code golfé, en dessous est la version expliquée et démêlée.
Voici le code qui doit contenir un fichier * .jpg. Une fois l'image insérée, vous pouvez appuyer sur les touches numériques des canaux rouge (1) vert (2) ou bleu (3). Pour voir à nouveau l'image par défaut, appuyez sur 0. En fait, elle montre simplement l'image dans la fenêtre.
La partie importante qui fait tout le travail est le shader qui est la petite déclaration de chaîne au début ou démêlée:
qui obtient le pixel réel de l'image et montre simplement les canaux selon les besoins.
Mon image de test et les différentes sorties pour les canaux (aussi bien sûr les autres)
la source
C,
6058 octetsL'entrée d'image est une liste de nombres (en décimal) entre 0 et 255
stdin
, par exempleLe canal est spécifié comme premier argument du programme et est l'un des
Exemple:
la source