Biorąc pod uwagę obraz, jako dane wejściowe (możliwie w trypletach RGB) lub z nazwą pliku jako danymi wejściowymi (możesz założyć, że obraz ma określoną nazwę pliku, być może bez rozszerzenia), wyślij obraz reprezentujący pojedynczy kanał koloru obrazu.
Weźmiesz także inne dane wejściowe, które reprezentują kanał do wysłania. Wejście może być jednym z 3 dowolnych symboli. Jednak symbole muszą być ciągiem lub liczbą. Jednak nie można pobrać macierzy, aby zastosować ją do tablicy jako danych wejściowych. (takie jak {1, 0, 0}
lub {0, 1, 0}
).
Wyprowadzisz <input>
kanał obrazu wejściowego. Możesz zapisać go do pliku lub wypisać zestaw par RGB.
Twój program nie powinien mieć żadnych ograniczeń co do wielkości obrazu (w px) i musi obsługiwać tryplety .png
, .jpg
/ .jpeg
/ .JPG
lub RGB jako formaty obrazów. (może jednak obsłużyć tyle, ile chcesz)
Przypadek testowy:
Kanał czerwony:
Kanał zielony:
Niebieski kanał:
I kolejny przypadek testowy, całkowicie czerwony. Oryginalne zdjęcie , czerwony , zielony i niebieski . (ostrzeżenie: zwykły i czerwony kanał boli, aby patrzeć zbyt długo)
2 kolejne przypadki testowe:
Oryginalny , czerwony , zielony , niebieski .
Oryginalny , czerwony , zielony , niebieski .
Dwa ostatnie przypadki testowe pochodzą z obrazów we wszystkich kolorach .
Odpowiedzi:
APL (Dyalog) , 7 bajtów
I / O: tablica trypletów RGB
Wypróbuj online!
⍳3
pierwsze trzy liczby całkowite⎕=
porównaj z tym wejście numeryczne (wybrany kanał)⊂
załącz (tak, aby każdy obraz triplet tworzy cały ten triplet)⎕×
pomnóż przez to wejście numeryczne (tablicę tripletów)źródło
JavaScript (ES6), 29 bajtów
Dane wejściowe to tablica 2D 24-bitowych liczb całkowitych (np.
[[0x0000ff,0x00ff00],[0xff0000,0xffffff]]
) I16711680
czerwona,65280
zielona,255
niebieska. Jeśli to nie jest poprawne, spróbuj zamiast tego:JavaScript (ES6), 48 bajtów
Dane wejściowe to trójwymiarowa tablica wartości kolorów i
0
dla czerwieni,1
dla zieleni i2
dla niebieskiego.źródło
Mathematica, 13 bajtów
To powinna być uzasadniona wersja odpowiedzi JungHwan Min. Funkcja ta zajmuje obraz i jeden
Red
,Green
,Blue
jako wejście. Na przykład:Ciekawostką jest też
ColorSeparate
to, że dajesz poszczególne kanały, ale zwraca je jako obrazy jednokanałowe / w skali szarości, więc i tak będziesz musiał pomnożyć je przez kolor.źródło
Bash + ImageMagick,
353227 bajtówZakłada, że obraz znajduje się w pliku,
i
a skrypt przyjmuje odpowiednio jedenRG
, odpowiednioBG
,BR
niebieski, czerwony i zielony; dane wyjściowe do plikui
.źródło
Widmo , niekonkurencyjne, 1 bajt
(Nie konkuruje, ponieważ to wyzwanie zainspirowało ten język.) W rzeczywistości Spectrum jest biblioteką npm z interfejsem językowym dla poleceń.
Pobiera dane wejściowe jako:
Wywołaj program jako:
Alternatywnie możesz podać informacje w podpowiedziach:
To pozostawia obraz na stosie. Aby go wyświetlić, dodaj
O
na końcu, tak:Aby uzyskać dodatkową zabawę, spróbuj
echo filename | node spectrum.js "wO"
. Wykonuje wszystkie trzy izolacje kanałów jednocześnie:źródło
n[d1=`[d1-P*][],.g!]#Pdd1-P~%-1=p
JavaScript (ES6), 29 bajtów
Bardzo przypomina odpowiedź ETHproductions, ale z bardziej elastycznym wejściem niż pierwsza metoda i mniejsza niż druga.
Definiuje to funkcję, która akceptuje obraz jako jednowymiarową tablicę liczbowych intensywności kolorów. Ta funkcja zwraca następnie inną funkcję, która przyjmuje wartość całkowitą reprezentującą pożądany kanał koloru.
Kolory mogą być reprezentowane przez dowolny zakres liczbowy, o ile 0 oznacza całkowity brak koloru. np
0.0 - 1.0
lub0 - 255
Przykłady:
Jeśli dane obrazu mają format RGB, wówczas wywołanie funkcji z argumentami
(imageData)(0)
zwróci obraz tylko z czerwonym kanałem.Jeśli dane obrazu są w formacie BGR, wówczas wywołanie funkcji z argumentami
(imageData)(2)
zwróci również obraz tylko z czerwonym kanałem.źródło
i%3==b&&v
też działa.Python 2, 69 bajtów
Wciąż gra w golfa.
Pobiera dane wejściowe jako
filename, n
(gdzien
jest 0, 1 lub 2). Zapisuje nowy obraz nad starym.0
jest zielony,1
czerwony i2
niebieski. Dzięki @ovs, @Mikhail i @Rod za bajty wyłączone.źródło
k[:,:,x[i][0]]=k[:,:,x[i][1]]=0
zk[:,:,[1,2,0][i]]=k[:,:,i]=0
from cv2 import*
aby zaoszczędzić kilka bajtówk[:,:,i-1]=k[:,:,i]=0
zk[:,:,[i,i-1]]=0
CJam , 12 bajtów
Anonimowy blok, który oczekuje na układ 3D trójki RGB i liczby od 0 do 2 włącznie na stosie. Następnie pozostawia wyodrębnioną tablicę na stosie.
Można by grać w golfa za pomocą dziwnego formatu wejściowego, ale wydaje mi się, że to trochę oszukuje.
Wypróbuj online!
Przypadek testowy ma na celu jedynie wykazanie, że użycie trojaczków z rzeczywistego obrazu byłoby zbyt duże.
Wyjaśnienie
źródło
PowerShell , 282 bajty
Żadne z tych wymyślnych „gry w golfa” lub „używania wbudowanych”. Fooey w tej sprawie. ;-)
To zajmuje pełną ścieżkę wejściowego PNG (choć ściśle mówiąc, nie musi to być PNG, ponieważ JPG, BMP itp. Są obsługiwane przez .NET, ale próbowałem go tylko na PNG), i jeden
(R, G, B)
dla kanału kolorów, a następnie przechowuje je w$x
i$y
. Następnie utworzyćNew-Object
typuSystem.Drawing.Bitmap
z$x
i sklepu, który w$a
.Następnie wykonujemy podwójną pętlę nad wszystkimi pikselami. Pierwszy z
1
przygotowań do$a
„s.Height
, ustawienie$h
każdej iteracji (to zero-indeksowane, tak dlatego--$_
, co oszczędza bajtów ciągu( .height-1)
. Wewnątrz, my pętli z1
przygotowań do$a
” s.Width
.W każdej iteracji wykonujemy a
.GetPixel
dla określonychw,h
współrzędnych, które zwracająSystem.Drawing.Color
obiekt. Myselect
się naR G B
ich wartości.iex
Tutaj jest schludny trik, który zamienia to w hashtable (na przykład coś takiego@{R=34; G=177; B=76}
), więc możliwe, że do indeksu bezpośrednio z danego kanału koloru[$y]
. Ta wartość jest przechowywana w$i
.Następnie ustawiamy trzy wartości, które
$r, $g, $b
mają być wynikiem niektórych pseudo-trójskładnikowych operatorów na podstawie wartości literowej$y
. Na przykład, jeśli$y
takR
, to wynik jest następujący$r=$i, $g=0, $b=0
.Następnie cofamy się
.SetPixel
do tej konkretnejw,h
współrzędnej, konstruując nowąSystem.Drawing.Color
za pomocą wartości statycznejFromARGB
(która zakłada, że alfa jest całkowicie nieprzezroczysta). Po zakończeniu zapętlania, po prostu.Save
PNG do nowego pliku.Uwaga: zajmuje to dużo czasu, ponieważ jest całkowicie niezależnie zapętlany przez każdy piksel i wykonuje szereg obliczeń i wywołuje każdą iterację.
Testy:
źródło
Bash + ImageMagick, 41 bajtów
Dane wejściowe to plik o nazwie
x
, parametr wiersza polecenia jeden zR
lubG
lubB
Dane wyjściowe nadpisują plik wejściowy
Różni się od odpowiedzi betsega na przyjęcie bardziej naturalnego parametru kanału jednoliterowego. Również nadpisywanie zamiast wysyłania nowego pliku, który betseg może ukraść :)
źródło
$1
potrzebuje cudzysłowów, nazwy plików mogą mieć miejscax
na 1 bajt.Chip , 78 bajtów
Wypróbuj online!
Chip to język 2D, który działa na bitach składowych każdego bajtu w strumieniu bajtów.
Przegląd
To szczególne rozwiązanie oczekuje, że pierwszy bajt danych wejściowych będzie znakiem kontrolnym - w celu określenia, które kanały należy zachować - a następnie bajty danych obrazu. Dane obrazu muszą być trojaczkami RGB, jeden bajt na kanał, 24 bity na piksel:
Znak kontrolny jest interpretowany jako pole bitowe, chociaż znaczenie mają tylko trzy najniższe bity:
Oznacza to, że możemy użyć znaków ASCII, aby wybrać kanał, który chcemy:
1
oznacza czerwony2
oznacza niebieski4
oznacza zielonyLub zrób coś bardziej wymyślnego:
5
zachowaj czerwony i niebieski, ale nie zielony7
zachowaj wszystkie kanały (obraz pozostaje niezmieniony)0
upuść wszystkie kanały (obraz jest czarny)Jak to działa
To rozwiązanie jest raczej pomieszane z powodu gry w golfa, ale oto:
C
,B
iA
i przechowywania tych bitów w odpowiadających imM
komórek Emory. RównieżS
uppress wyjścia dla pierwszego cyklu./
przełączniki, aby wyprowadzić aktualny bajt wejściowy, jeśli jest wyłączony, otwórz przełączniki, abyśmy wyprowadzili bajt zerowy.Wyświetlanie wyników
Jasne, możesz użyć zrzutu heksadecymalnego lub czegoś nudnego, ale okazuje się, że jest to (prawie) aktualny prawidłowy format obrazu: binarna Portable PixMap .
Po prostu umieść dane obrazu z góry (minus bajt kontrolny, oczywiście) do pliku poniżej, dostosuj szerokość / wysokość, aby była poprawna, i możesz oglądać obraz w odpowiedniej przeglądarce, takiej jak IrfanView, chociaż prostsze (jak większość przeglądarek wbudowane) nie może sobie z tym poradzić.
Na przykład (użycie znaków ucieczki dla surowych danych):
źródło
MATL,
2113 bajtówKanał kolor powinien być określony za pomocą następującego odwzorowanie:
1:red
,2:green
,3:blue
Tłumacze online nie są w stanie
imread
czytać obrazów, więc tutaj jest nieco zmodyfikowana wersja, w której na stałe zapisałem losowy obraz w źródle .Wyjaśnienie
źródło
05AB1E , 16 bajtów
Wypróbuj online!
Używa kolorów szesnastkowych w formacie macierzy 2D i [0,1,2] dla każdego kanału.
źródło
Clojure,
421bajtów-89 bajtów , agresywnie wprowadzając wszystko, zmieniając moją niedorzeczną starą metodę usuwania kanałów i pozbawiając się niepotrzebnego przypadkowego importu.
Znalazłem to na pół godziny przed rozpoczęciem mojej zmiany, nie mając pojęcia, co robię. Mam niewielkie doświadczenie
BufferedImage
, więc może istnieć lepszy sposób na rozwiązanie tego problemu. Nadużywam równieżColor
do konwertowania tam iz powrotem między liczbami całkowitymi i reprezentacjami poszczególnych kanałów.Jest to komicznie ogromne w porównaniu z innymi odpowiedziami z kilku powodów (poza oczywistym, że Clojure nie jest językiem golfa):
Zamiast po prostu manipulować tablicą bajtów, tak naprawdę pobiera jako obraz wejściowy, zmienia go i wysyła.
Używam Java-interop, który choć przydatny, może być czasem bardzo gadatliwy. Sam import jest większy niż wiele odpowiedzi.
Podział znajduje się w poniższym kodzie.
źródło
Lua (framework love2d), 498 bajtów
Zrobiłem to bardziej jako ćwiczenie dla siebie, więc nie jest tak krótkie, jak mogłoby być (chociaż próbowałem grać w golfa), ale chciałem dodać to tutaj, ponieważ myślę, że zrobiłem dobrze. Nawet jeśli się spóźnię.
Oto kod do gry w golfa, pod nim wyjaśniona i nieplątana wersja.
Oto kod, który należy upuścić w pliku * .jpg. Po wstawieniu obrazu możesz naciskać przyciski numeryczne dla kanałów czerwonego (1) zielonego (2) lub niebieskiego (3). Aby ponownie zobaczyć domyślny obraz, naciśnij 0. W rzeczywistości po prostu pokazuje obraz w oknie.
Ważną częścią, która wykonuje całą pracę, jest moduł cieniujący, który jest deklaracją małego ciągu na początku lub nieplątaną:
który pobiera rzeczywisty piksel obrazu i pokazuje kanały w razie potrzeby.
Mój obraz testowy i różne wyniki dla kanałów (również na pewno innych)
źródło
C,
6058 bajtówWprowadzanie obrazu to lista liczb (dziesiętnie) od 0 do 255
stdin
, npKanał jest określony jako pierwszy argument programu i jest jednym z nich
Przykład:
źródło