Wenn Sie ein Bild entweder als Eingabe (möglicherweise in RGB-Triplets) oder mit dem Dateinamen als Eingabe (Sie können davon ausgehen, dass das Bild einen bestimmten Dateinamen hat, möglicherweise ohne Erweiterung) haben, geben Sie ein Bild aus, das einen einzelnen Farbkanal des Bildes darstellt.
Sie nehmen auch einen anderen Eingang, der den auszugebenden Kanal darstellt. Die Eingabe kann eines von 3 verschiedenen Symbolen sein. Die Symbole müssen jedoch entweder eine Zeichenfolge oder eine Zahl sein. Sie können jedoch keine Matrize als Eingabe für das Array verwenden. (wie {1, 0, 0}
, oder {0, 1, 0}
).
Sie geben den <input>
Kanal des Eingangsbildes aus. Sie können es entweder in einer Datei speichern oder eine Reihe von RGB-Paaren ausgeben.
Ihr Programm sollte keine Begrenzung für die Größe des Bildes (in Pixel) haben und als Bildformate entweder .png
, .jpg
/ .jpeg
/ .JPG
oder RGB-Triplets unterstützen. (Es können jedoch so viele unterstützt werden, wie Sie möchten.)
Testfall:
Roter Kanal:
Grüner Kanal:
Blauer Kanal:
Und noch ein Testfall, ganz in Rot. Ursprüngliches Foto , Rot , Grün und Blau . (Warnung: Der normale und der rote Kanal tun weh, wenn man sie zu lange ansieht.)
2 weitere Testfälle:
Original , rot , grün , blau .
Original , rot , grün , blau .
Die letzten beiden Testfälle stammen von Images mit allen Farben .
Antworten:
APL (Dyalog) , 7 Bytes
I / O: Array von RGB-Triplets
Probieren Sie es online!
⍳3
die ersten drei ganzen Zahlen⎕=
Vergleichen Sie die numerische Eingabe (den ausgewählten Kanal) damit⊂
umschließen (so paart jedes Bildtriplett dieses gesamte Triplett)⎕×
multiplizieren Sie die numerische Eingabe (das Array von Triplets) damitquelle
JavaScript (ES6), 29 Byte
Die Eingabe ist ein 2D-Array mit 24-Bit-Ganzzahlen (z. B.
[[0x0000ff,0x00ff00],[0xff0000,0xffffff]]
) und16711680
für Rot,65280
für Grün und255
für Blau. Wenn dies nicht gültig ist, versuchen Sie dies stattdessen:JavaScript (ES6), 48 Byte
Die Eingabe ist eine 3D-Anordnung von Farbwerten und
0
für Rot,1
für Grün,2
für Blau.quelle
Mathematica, 13 Bytes
Dies sollte die legitime Version der Antwort von JungHwan Min sein. Diese Funktion übernimmt das Bild und einer von
Red
,Green
,Blue
als Eingabe. Beispielsweise:Unterhaltsamerweise
ColorSeparate
gibt es auch einzelne Kanäle, die jedoch als Einzelkanal- / Graustufenbilder zurückgegeben werden. Sie müssten diese also ohnehin mit der Farbe multiplizieren.quelle
Bash + ImageMagick,
353227 BytesNimmt das Bild in der Datei
i
und das Skript nimmt eineRG
,BG
,BR
für blau, rot und grün ist; Ausgaben in die Dateii
.quelle
Spektrum , nicht konkurrierend, 1 Byte
(Nicht konkurrierend, weil diese Herausforderung diese Sprache inspiriert hat.) In Wirklichkeit ist Spectrum eine npm-Bibliothek mit einer Sprachschnittstelle für die Befehle.
Übernimmt Eingaben als:
Rufen Sie das Programm auf als:
Alternativ können Sie Informationen zu den Eingabeaufforderungen eingeben:
Das Bild bleibt auf dem Stapel. Zum Anzeigen fügen Sie
O
am Ende Folgendes hinzu:Probieren Sie es aus, um ein bisschen mehr Spaß zu haben
echo filename | node spectrum.js "wO"
. Alle drei Kanalisolationen werden gleichzeitig ausgeführt:quelle
n[d1=`[d1-P*][],.g!]#Pdd1-P~%-1=p
JavaScript (ES6), 29 Byte
Viel wie die Antwort von ETHproductions, aber mit flexiblerem Input als die erste Methode und kleiner als die zweite.
Dies definiert eine Funktion, die das Bild als ein eindimensionales Array numerischer Farbintensitäten akzeptiert. Diese Funktion gibt dann eine andere Funktion zurück, die einen ganzzahligen Wert akzeptiert, der den gewünschten Farbkanal darstellt.
Farben können durch einen beliebigen Zahlenbereich dargestellt werden, solange 0 ein völliges Fehlen von Farben anzeigt. ZB
0.0 - 1.0
oder0 - 255
Beispiele:
Wenn die Bilddaten im Format RGB vorliegen, wird beim Aufrufen der Funktion mit Argumenten
(imageData)(0)
nur das Bild mit dem roten Kanal zurückgegeben.Wenn die Bilddaten das Format BGR haben, wird beim Aufrufen der Funktion mit Argumenten
(imageData)(2)
auch das Bild nur mit dem roten Kanal zurückgegeben.quelle
i%3==b&&v
auch funktioniert.Python 2, 69 Bytes
Immer noch Golf spielen.
Übernimmt die Eingabe als
filename, n
(wobein
0, 1 oder 2 ist). Speichert das neue Bild über dem alten.0
ist grün,1
ist rot und2
ist blau. Danke an @ovs, @Mikhail und @Rod für die Bytes.quelle
k[:,:,x[i][0]]=k[:,:,x[i][1]]=0
mitk[:,:,[1,2,0][i]]=k[:,:,i]=0
from cv2 import*
, um einige Bytes zu speichernk[:,:,i-1]=k[:,:,i]=0
mitk[:,:,[i,i-1]]=0
CJam , 12 Bytes
Ein anonymer Block, der ein 3D-Array von RGB-Triplets und eine Zahl zwischen 0 und 2 einschließlich auf dem Stapel erwartet. Lässt das extrahierte Array anschließend auf dem Stapel.
Könnte möglicherweise mit einem bizarren Eingabeformat Golf gespielt werden, aber ich habe das Gefühl, dass das ein bisschen schummelt.
Probieren Sie es online!
Der Testfall dient nur der Veranschaulichung, die Verwendung der Drillinge aus einem tatsächlichen Bild wäre viel zu groß.
Erläuterung
quelle
PowerShell , 282 Byte
Nichts davon ist Lust auf "Golfen mit dem Input" oder "Verwenden von Built-Ins". Phooey darauf. ;-)
Dies hier ist der vollständige Pfad eines Eingangs PNG (obwohl, streng genommen, es nicht brauchen ein PNG, da JPG, BMP usw. unterstützt von .NET zu sein, aber ich habe es nur auf PNGs versucht), und eine
(R, G, B)
für den Farbkanal, speichert diese dann in$x
und$y
. Wir erstellen dann eineNew-Object
ArtSystem.Drawing.Bitmap
von$x
und speichern diese in$a
.Dann machen wir eine Doppelschleife über alle Pixel. Zuerst von
1
bis zu$a
‚s.Height
, Einstellung$h
jeder Iteration (es ist Null indiziert, so dass der Grund , warum wir--$_
, die Bytes über spart( .height-1)
. Im Inneren wir Schleife von1
bis zu$a
‘ s.Width
.Bei jeder Iteration führen wir eine
.GetPixel
an den jeweiligenw,h
Koordinaten durch, die einSystem.Drawing.Color
Objekt zurückgibt . Wirselect
geben dieR G B
Werte davon heraus. Dasiex
hier ist ein netter Trick, der dies in eine Hash-Tabelle (z. B. so etwas wie@{R=34; G=177; B=76}
) verwandelt, damit wir dies direkt mit dem gewünschten Farbkanal indizieren können[$y]
. Dieser Wert wird in gespeichert$i
.Als nächstes setzen wir drei Werte
$r, $g, $b
, die das Ergebnis einiger pseudoternärer Operatoren sind, basierend auf dem Buchstabenwert von$y
. Wenn$y
jaR
, dann ist das Ergebnis hier$r=$i, $g=0, $b=0
.Dann kehren wir zu
.SetPixel
dieser bestimmtenw,h
Koordinate zurück und konstruieren eine neue mitSystem.Drawing.Color
Hilfe der statischenFromARGB
(die davon ausgeht, dass das Alpha vollständig undurchsichtig ist). Sobald wir die Schleife beendet haben,.Save
erstellen wir einfach die PNG zu einer neuen Datei.Hinweis: Dies dauert sehr lange, da alle Pixel vollständig unabhängig voneinander durchlaufen werden und eine Reihe von Berechnungen durchgeführt und die einzelnen Iterationen aufgerufen werden.
Tests:
quelle
Bash + ImageMagick, 41 Bytes
Eingabe ist eine Datei mit dem Namen
x
, Kommandozeilenparameter eins vonR
oderG
oderB
Ausgabe überschreibt die Eingabedatei
Unterscheidet sich von der Antwort von betseg durch die Verwendung natürlicherer Einzelbuchstaben-Kanalparameter. Auch überschreiben, anstatt eine neue Datei auszugeben, die betseg stehlen kann :)
quelle
$1
Bedürfnisse Anführungszeichen, Dateinamen können Leerzeichen enthaltenx
für 1 Byte aus einem Dateinamen liest .Chip , 78 Bytes
Probieren Sie es online!
Chip ist eine 2D-Sprache, die die Komponentenbits jedes Bytes in einem Bytestrom verarbeitet.
Überblick
Bei dieser speziellen Lösung wird erwartet, dass das erste Byte der Eingabe das Steuerzeichen ist - um zu definieren, welche Kanäle beibehalten werden sollen - und dass im Folgenden die Bytes der Bilddaten angegeben werden. Die Bilddaten müssen RGB-Triplets sein, ein Byte pro Kanal, 24 Bit pro Pixel:
Das Steuerzeichen wird als Bitfeld interpretiert, obwohl nur die drei niedrigsten Bits eine Bedeutung haben:
Dies bedeutet, dass wir ASCII-Zeichen verwenden können, um den gewünschten Kanal auszuwählen:
1
bedeutet rot2
bedeutet blau4
bedeutet grünOder etwas ausgefalleneres machen:
5
Rot und Blau beibehalten, aber nicht Grün7
Alle Kanäle beibehalten (Bild bleibt unverändert)0
Alle Kanäle verwerfen (Bild ist schwarz)Wie es funktioniert
Diese Lösung ist aufgrund des Golfspiels ziemlich durcheinander, aber hier ist:
C
,B
undA
und speichern Sie diese Bits in den entsprechendenM
Emory-Zellen. AuchS
uppress Ausgang für den ersten Zyklus./
Schalter, um das aktuelle Eingangsbyte auszugeben. Wenn es ausgeschaltet ist, öffnen Sie die Schalter, damit wir ein Null-Byte ausgeben.Anzeigen der Ergebnisse
Sicher, Sie könnten Hexdump oder etwas Langweiliges verwenden, aber es stellt sich heraus, dass dies (fast) ein aktuell gültiges Bildformat ist: binäres tragbares PixMap .
Kopieren Sie einfach die Bilddaten von oben (natürlich ohne das Steuerbyte) in die unten stehende Datei, stellen Sie die Breite / Höhe so ein, dass sie gültig sind, und Sie können das Bild in einem geeigneten Viewer wie IrfanView anzeigen, obwohl es einfacher ist (wie die meisten Browser) Built-Ins) können damit nicht umgehen.
Zum Beispiel (Verwenden von Escape-Zeichen für die Rohdaten):
quelle
MATL,
2113 BytesDer Farbkanal ist mit dem folgenden Mapping angegeben werden:
1:red
,2:green
,3:blue
Die Online-Dolmetscher können keine
imread
Bilder lesen, daher ist hier eine leicht geänderte Version, in der ich ein zufälliges Bild in die Quelle fest einprogrammiert habe .Erläuterung
quelle
05AB1E , 16 Bytes
Probieren Sie es online!
Verwendet hexadezimale Farben in einem 2D-Array-Format und [0,1,2] für jeden Kanal.
quelle
Clojure,
421332 Bytes-89 Bytes durch aggressives Inlinen von allem, Ändern von meiner lächerlichen alten Methode zum Entfernen der Kanäle und Entfernen eines unnötigen versehentlichen Imports.
Hat eine halbe Stunde vor Schichtbeginn geklatscht, ohne zu ahnen, was ich tat. Ich habe wenig Erfahrung damit
BufferedImage
, also könnte es einen besseren Weg geben, dies zu tun. Ich missbrauche auchColor
, um zwischen ganzzahligen und einzelnen Kanaldarstellungen von Farben hin und her zu konvertieren.Dies ist im Vergleich zu den anderen Antworten aus mehreren Gründen komisch (abgesehen davon, dass Clojure keine Golfsprache ist):
Anstatt nur ein Byte-Array zu manipulieren, nimmt dies tatsächlich ein Bild als Eingabe, ändert es und gibt es aus.
Ich verwende Java-Interop, das zwar praktisch ist, aber manchmal ziemlich ausführlich sein kann. Allein die Importe sind größer als viele Antworten.
Eine Aufschlüsselung finden Sie im folgenden Code.
quelle
Lua (love2d Framework), 498 Byte
Ich habe dies eher als Übung für mich selbst gemacht, es ist also nicht so kurz, wie es sein könnte (obwohl ich versucht habe, Golf zu spielen), aber ich wollte es hier hinzufügen, weil ich denke, dass ich es gut gemacht habe. Auch wenn ich zu spät bin.
Hier der Golf-Code, darunter die erläuterte und entwirrte Version.
Hier ist der Code, in den eine * .jpg-Datei abgelegt werden muss. Nach dem Einfügen des Bildes können Sie die Zifferntasten für die roten (1) grünen (2) oder blauen (3) Kanäle drücken. Um das Standardbild erneut anzuzeigen, drücken Sie 0. Eigentlich wird nur das Bild im Fenster angezeigt.
Der wichtige Teil, der die ganze Arbeit erledigt, ist der Shader, der die kleine String-Deklaration am Anfang oder untangled ist:
Dadurch wird das tatsächliche Pixel des Bildes abgerufen und die Kanäle werden nur nach Bedarf angezeigt.
Mein Testbild und die verschiedenen Ausgänge für die Kanäle (sicher auch die anderen)
quelle
C,
6058 BytesDie Bildeingabe ist eine Liste von Zahlen (in Dezimalzahl) zwischen 0 und 255
stdin
, zDer Kanal wird als erstes Argument für das Programm angegeben und ist eines von
Beispiel:
quelle