Для данного изображения, либо в качестве входных данных (возможно, в триблетах RGB), либо с именем файла в качестве входных данных (можно предположить, что изображение имеет определенное имя файла, возможно, без расширения), выведите изображение, представляющее один цветной канал изображения.
Вы также возьмете другой вход, представляющий, какой канал вывести. Ввод может быть одним из 3 различных символов. Однако символы должны быть либо строкой, либо числом. Однако вы не можете использовать матрицу для применения к массиву в качестве входных данных. (например {1, 0, 0}
, или{0, 1, 0}
).
Вы выведете <input>
канал входного изображения. Вы можете сохранить его в файл или вывести набор пар RGB.
Ваша программа не должна иметь никаких ограничений на размер изображения (в РХ), и должны поддерживать либо .png
, .jpg
/ .jpeg
/ .JPG
, или RGB тройня в качестве графических форматов. (однако он может поддерживать столько, сколько вы хотите)
Прецедент:
Красный канал:
Зеленый коридор:
Синий канал:
И еще один тестовый пример, полностью красного цвета. Оригинальное фото , красный , зеленый и синий . (предупреждение: на простой и красный канал больно смотреть слишком долго)
Еще 2 теста:
Оригинальный , красный , зеленый , синий .
Оригинальный , красный , зеленый , синий .
Последние два контрольных примера взяты из изображений со всеми цветами .
Ответы:
APL (Дьялог) , 7 байт
I / O: массив триплетов RGB
Попробуйте онлайн!
⍳3
первые три целых числа⎕=
сравнить числовой ввод (выбранный канал) с этим⊂
заключить (таким образом, каждый триплет изображения объединяет весь этот триплет)⎕×
умножить числовой ввод (массив триплетов) с этимисточник
JavaScript (ES6), 29 байт
Ввод представляет собой двумерный массив из 24-битных целых чисел (например
[[0x0000ff,0x00ff00],[0xff0000,0xffffff]]
) и16711680
для красного,65280
для зеленого,255
для синего. Если это не так, попробуйте это:JavaScript (ES6), 48 байт
Ввод представляет собой трехмерный массив значений цвета и
0
для красного,1
для зеленого,2
для синего.источник
Mathematica, 13 байт
Это должно быть законной версией ответа JungHwan Min. Эта функция принимает изображение и один из
Red
,Green
, вBlue
качестве входных данных. Например:В качестве забавного факта есть также то,
ColorSeparate
что дает вам отдельные каналы, но возвращает их в виде одноканальных / полутоновых изображений, так что вам все равно придется умножать их на цвет впоследствии.источник
Bash + ImageMagick,
353227 байтПредполагает изображение в файле
i
и сценарий занимает один изRG
,BG
,BR
для синего, красного и зеленого; выводит в файлi
.источник
Спектр , неконкурентный, 1 байт
(Не конкурирует, потому что этот вызов вдохновил этот язык.) На самом деле Spectrum - это библиотека npm с языковым интерфейсом для команд.
Принимает ввод как:
Назовите программу как:
Кроме того, вы можете предоставить информацию для подсказок:
Это оставляет изображение в стеке. Для просмотра добавьте
O
в конце примерно так:Для дополнительного удовольствия попробуйте
echo filename | node spectrum.js "wO"
. Он выполняет все три изоляции каналов одновременно:источник
n[d1=`[d1-P*][],.g!]#Pdd1-P~%-1=p
JavaScript (ES6), 29 байт
Очень похоже на ответ ETHproductions, но с более гибким вводом, чем первый метод, и меньшим, чем второй.
Это определяет функцию, которая принимает изображение как одномерный массив числовых интенсивностей цвета. Затем эта функция возвращает другую функцию, которая принимает целочисленное значение, представляющее желаемый цветовой канал.
Цвета могут быть представлены любым числовым диапазоном, если 0 указывает на полное отсутствие цвета. Например
0.0 - 1.0
или0 - 255
Примеры:
Если данные изображения имеют формат RGB, то вызывается функция с аргументами
(imageData)(0)
вернет изображение только с красным каналом.Если данные изображения имеют формат BGR, то вызов функции с аргументами
(imageData)(2)
также вернет изображение только с красным каналом.источник
i%3==b&&v
также работает.Python 2, 69 байт
Все еще играю в гольф.
Принимает ввод как
filename, n
(гдеn
0, 1 или 2). Сохраняет новое изображение поверх старого.0
зеленый,1
красный и2
синий. Спасибо @ovs, @Mikhail и @Rod за отключение байтов.источник
k[:,:,x[i][0]]=k[:,:,x[i][1]]=0
сk[:,:,[1,2,0][i]]=k[:,:,i]=0
from cv2 import*
чтобы сохранить несколько байтовk[:,:,i-1]=k[:,:,i]=0
наk[:,:,[i,i-1]]=0
CJam , 12 байт
Анонимный блок, который ожидает трехмерный массив RGB-триплетов и число от 0 до 2 включительно в стеке. Оставляет извлеченный массив в стеке впоследствии.
Возможно, можно играть в гольф, используя причудливый формат ввода, но я чувствую, что это немного обманывает.
Попробуйте онлайн!
Тестовый пример составлен только для демонстрации того, что использование триплетов из реального изображения было бы слишком большим.
объяснение
источник
PowerShell , 282 байта
Ничего из этого необычного «игры в гольф» или «использования встроенных модулей». Фу на это. ;-)
Здесь используется полный путь входного PNG (хотя, строго говоря, это не обязательно должен быть PNG, поскольку JPG, BMP и т. Д. Поддерживаются .NET, но я пробовал только на PNG), и один из
(R, G, B)
для цветного канала, затем сохраняет их в$x
и$y
. Затем мы создаемNew-Object
типаSystem.Drawing.Bitmap
из$x
и магазина , что в$a
.Затем мы делаем двойной цикл по всем пикселям. Во- первых от
1
до$a
-х.Height
, установка$h
каждой итерации (это нулевой индекс, так вот почему мы--$_
, что экономит байткоды( .height-1)
. Внутри мы рамочные от1
до$a
'с.Width
.Каждую итерацию мы выполняем с
.GetPixel
определеннымиw,h
координатами, которые возвращаютSystem.Drawing.Color
объект. Мыselect
внеR G B
их значения.iex
Здесь аккуратный трюк , который превращает это в хэш - таблице (например, что - то вроде@{R=34; G=177; B=76}
) , поэтому мы можем индексировать в том , что непосредственно на нужный канал цвета[$y]
. Это значение сохраняется в$i
.Далее мы устанавливаем три значения
$r, $g, $b
как результат некоторых псевдо-троичных операторов, основанных на буквенном значении$y
. Так, например, если$y
естьR
, то результат здесь есть$r=$i, $g=0, $b=0
.Затем мы
.SetPixel
возвращаемся к этой конкретнойw,h
координате, создавая новуюSystem.Drawing.Color
с использованием статикиFromARGB
(которая предполагает, что альфа полностью непрозрачна). Как только мы закончили цикл, мы просто.Save
добавляем PNG в новый файл.Примечание. Это занимает много времени, поскольку он полностью независимо проходит по каждому пикселю, выполняет несколько вычислений и вызывает каждую итерацию.
тесты:
источник
Bash + ImageMagick, 41 байт
Ввод - это файл с именем
x
, параметр командной строки один изR
илиG
илиB
Выход перезаписывает входной файл
Отличается от ответа betseg принятием более естественного однобуквенного параметра канала. Также перезаписываем вместо вывода нового файла, который бетсег может украсть :)
источник
$1
нуждается в кавычки, имена файлов могут содержать пробелыx
за 1 байт.Чип , 78 байт
Попробуйте онлайн!
Chip - это двумерный язык, который работает с компонентными битами каждого байта в потоке байтов.
обзор
Это конкретное решение предполагает, что первый байт ввода будет управляющим символом, чтобы определить, какой канал (каналы) следует сохранить, а следующие - это байты данных изображения. Данные изображения должны быть RGB-триплетами, один байт на канал, 24 бита на пиксель:
Управляющий символ интерпретируется как битовое поле, хотя только три младших бита имеют значение:
Это означает, что мы можем использовать символы ASCII, чтобы выбрать, какой канал мы хотим:
1
означает красный2
означает синий4
означает зеленыйИли сделай что-нибудь более замысловатое
5
оставить красный и синий, но не зеленый7
сохранить все каналы (изображение не изменилось)0
удалить все каналы (изображение черное)Как это работает
Это решение довольно запутано из-за игры в гольф, но здесь идет:
C
:B
иA
, и сохраните эти биты в соответствующихM
ячейках памяти. Кроме того,S
подавить вывод для первого цикла./
переключатели для вывода текущего входного байта, если он выключен, откройте переключатели, чтобы мы вывели нулевой байт.Просмотр результатов
Конечно, вы могли бы использовать hexdump или что-то скучное, но оказывается, что это (почти) действительно действительный формат изображения: двоичный Portable PixMap .
Просто вставьте данные изображения сверху (за исключением, конечно, управляющего байта) в файл ниже, отрегулируйте ширину / высоту, чтобы быть действительными, и вы можете просмотреть изображение в надлежащем средстве просмотра, таком как IrfanView, хотя и в более простых (как большинство браузеров). встроенные) не может справиться с этим.
Например (используя экранирование для необработанных данных):
источник
MATL,
2113 байтЦветовой канал должен быть определен с использованием следующего отображения:
1:red
,2:green
,3:blue
Онлайн-переводчики не могут использовать
imread
для чтения изображений, поэтому здесь есть слегка измененная версия, в которой я жестко закодировал случайное изображение в источнике .объяснение
источник
05AB1E , 16 байтов
Попробуйте онлайн!
Использует шестнадцатеричные цвета в формате 2D-массива и [0,1,2] для каждого канала.
источник
Clojure,
421332 байта-89 байтов , агрессивно вставляя все, меняя старый нелепый метод удаления каналов и избавляясь от ненужного случайного импорта.
Поправил это за полчаса до начала моей смены, не зная, что я делаю. У меня мало опыта
BufferedImage
, так что может быть лучший способ сделать это. Я также злоупотребляю,Color
чтобы преобразовать назад и вперед между целочисленным и отдельным представлением цветов канала.Это очень много по сравнению с другими ответами по нескольким причинам (помимо очевидного, что Clojure не является языком игры в гольф):
Вместо того, чтобы просто манипулировать байтовым массивом, он фактически принимает в качестве входных данных изображение, изменяет его и выводит его.
Я использую Java-взаимодействие, которое иногда может быть довольно многословным. Только импорт больше, чем многие ответы.
Смотрите код ниже для разбивки.
источник
Lua (love2d Framework), 498 байт
Я сделал это больше как упражнение для себя, так что оно не такое короткое, как могло бы быть (хотя я и пытался играть в гольф), но я хотел добавить его сюда, потому что я думаю, что справился хорошо. Даже если я опоздаю.
Вот код для игры в гольф, под ним - объясненная и распутанная версия.
Вот код, в который нужно вставить файл * .jpg. После вставки изображения вы можете нажимать цифровые кнопки для красного (1) зеленого (2) или синего (3) каналов. Также, чтобы снова увидеть изображение по умолчанию, нажмите 0. На самом деле он просто показывает изображение в окне.
Важной частью, которая выполняет всю работу, является шейдер, который является небольшим строковым объявлением в начале или не распутан:
который получает фактический пиксель изображения и просто показывает каналы по мере необходимости.
Мое тестовое изображение и различные выходы для каналов (также наверняка другие)
источник
С,
6058 байтВвод изображения представляет собой список чисел (в десятичном виде) от 0 до 255 на
stdin
, напримерКанал указан в качестве первого аргумента программы и является одним из
Пример:
источник