Значение цвета RGB #00FF00
является довольно важным: оно используется для создания фильмов, телевизионных шоу, объявлений о погоде и многого другого. Это знаменитый «зеленый экран» или «зеленый экран».
Соревнование
Ваша задача - написать программу, которая принимает два входных изображения, как в формате PNG (или в типе изображения в вашей библиотеке изображений), так и одинакового размера. Одно изображение может быть любым старым изображением. Другое изображение - это фон с цветом #00FF00
. Выходное изображение будет состоять из второго изображения, наложенного поверх первого, без #00FF00
присутствия цвета (кроме первого изображения). Ввод и вывод могут выполняться с помощью файлов, графического интерфейса пользователя и т. Д. Вы можете принимать массив значений RGB в качестве входных данных, как показано здесь . Вы можете предположить, что изображение имеет только пиксели с полной непрозрачностью.
В основном...
Создайте программу, которая берет каждый #00FF00
пиксель в одном изображении и заменяет его соответствующим пикселем на фоновом изображении.
Тестовые случаи
Предоставлено @dzaima: Справочная информация:
Передний план:
Вывод:
Конечно, стандартные лазейки строго запрещены . Это включает в себя использование интернет-ресурса, чтобы сделать это для вас.
Это код-гольф , так что может победить самый короткий код и лучший программист ...
источник
Ответы:
машинный код x86-64 (и x86-32),
131513 байтСписок изменений:
Исправление: первая версия проверяла только G = 0xff, не требуя, чтобы R и B равнялись 0. Я перешел на модификацию фона на месте, чтобы я мог использовать
lodsd
на переднем плане, чтобы использовать пиксели fgeax
для краткогоcmp eax, imm32
кодирования (5 байт) ) вместоcmp dh,0xff
(3 байта).Сохранить 2 байта: заметил, что изменение bg на месте позволило использовать операнд памяти для
cmov
сохранения 2-байтовойmov
загрузки (и сохранения регистра в случае, если это имеет значение).Это функция, соответствующая соглашению о вызовах x86-64 System V, вызываемая непосредственно из C или C ++ (в системах x86-64, отличных от Windows), с такой сигнатурой:
Формат изображения - RGB0 32bpp, с зеленым компонентом на 2-м младшем адресе памяти в каждом пикселе.
На переднем планефоновое изображение изменяется на месте.pixel_count
это строки * столбцы. Это не заботится о строках / столбцах; он просто сочетает ChromeKey с любым количеством мечей памяти, которые вы укажете.RGBA (с A требуется равным 0xFF) потребует использования другой константы, но без изменения размера функции. DWORD переднего плана сравниваются на предмет точного равенства с произвольной 32-битной константой, хранящейся в 4 байтах, поэтому любой цвет в пиксельном порядке или цветность ключа цвета могут быть легко поддержаны.
Тот же машинный код также работает в 32-битном режиме. Для того, чтобы собрать как 32-бит, изменения ,
rdi
чтобыedi
в источнике. Все остальные регистры, которые становятся 64-битными, являются неявными (lodsd / stosd и loop), а другие явные регистры остаются 32-битными. Но обратите внимание, что вам понадобится оболочка для вызова из 32-битного C, потому что ни одно из стандартных соглашений о вызовах x86-32 не использует те же regs, что и x86-64 SysV.Список NASM (машинный код + исходный код), прокомментированный для начинающих asm с описанием того, что делают более сложные инструкции. (Дублирование справочного руководства - плохой стиль при обычном использовании.)
Чтобы получить исходный источник NASM из этого списка, зачеркните первые 26 символов каждой строки
<chromakey.lst cut -b 26- > chromakey.asm
. Я сгенерировал это с помощьюnasm -felf64 chromakey-blend.asm -l /dev/stdout | cut -b -28,$((28+12))-
списков NASM, которые оставляют больше пустых столбцов между машинным кодом и исходным кодом. Чтобы создать объектный файл, вы можете связать с C или C ++, используйтеnasm -felf64 chromakey.asm
. (Илиyasm -felf64 chromakey.asm
)непроверенный , но я вполне уверен, что основная идея загрузки / загрузки / cmov / store - это звук, потому что это так просто.
Я мог бы сохранить 3 байта, если бы потребовал, чтобы вызывающая сторона передавала константу хроматического ключа (0x00ff00) в качестве дополнительного аргумента вместо жесткого кодирования константы в функцию. Я не думаю, что обычные правила позволяют писать более общую функцию, в которой вызывающий объект устанавливает для нее константы. Но если это так, третий аргумент (в настоящее время
dummy
) передается вedx
x86-64 SysV ABI. Просто изменитеcmp eax, 0x0000ff00
(5B) наcmp eax, edx
(2B).С SSE4 или AVX вы могли бы сделать это быстрее (но с большим размером кода) с помощью
pcmpeqd
иblendvps
сделать 32-разрядное изменение размера элемента, управляемое маской сравнения. (С помощьюpand
вы можете игнорировать старший байт). Для упакованного RGB24 вы можете использовать,pcmpeqb
а затем 2xpshufb
+,pand
чтобы получить ИСТИНА в байтах, где совпадают все 3 компонента этого пикселяpblendvb
.(Я знаю, что это код-гольф, но я решил попробовать MMX, прежде чем переходить к скалярному целому числу.)
источник
nasm -felf32
. (Для 32-битных вам также понадобится функция-обертка для вызова из C, потому что она все еще использует те же регистры, что и x86-64 SysV ABI.)Mathematica
5735 байтобновление: по умолчанию зеленый фон удаляется с помощью
RemoveBackground
. Первое представление включало ненужный второй параметр, `{" Background ", Green}".Удаляет фон изображения 2 и объединяет результат с изображением 1.
пример
Ниже в префиксе, а не в инфиксной форме, более четко показано, как работает код.
источник
Python 3 + NumPy , 59 байт
Попробуйте онлайн!
Входные данные даны в формате
numpy
массива, с целочисленными триплетами, представляющими пиксели (где#00FF00
в шестнадцатеричном коде цвета эквивалентно[0, 255, 0]
). Входной массив изменяется на месте, что разрешено для каждой мета .Примеры изображений
Вход (из вопроса)
Задний план:
Передний план:
Изображение переднего плана после запуска функции:
Реализация ссылок (используется
opencv
для чтения файлов изображений)Выводит изображение на экран и записывает его в выходной файл.
источник
lambda f,b:[x[list(x[0])==[0,255,0]]for x in zip(f,b)]
. Если список списков целых чисел на самом деле тоже приемлем, то вы можете сделать это в 48 сlambda f,b:[x[x[0]==[0,255,0]]for x in zip(f,b)]
G == 255
значение заменяется, даже если R и B не равны нулю, что приводит к появлению красных точек. Это также случается для других групп, даже жестких, которые менее заметны. Таким образом, он выполняет логические проверки независимо друг от друга и заменяет отдельные каналы, даже если выполняется только одно из условий. Например, если пиксель -[0 255 37]
красная и зеленая полосы будут заменены.Обработка,
11699 байтК сожалению, обработка не поддерживает java 8, например лямбды.
Пример реализации: (сохраняет изображение как
out.png
и рисует его на экране)источник
settings()
иsetup()
функций и просто запустить код непосредственно.#ff00
или так0xff00
же, как#00ff00
в обработке?0x0000FF00
что это битовый шаблон, который вы ищете?Bash + ImageMagick, 45 байт
Принимает два изображения в качестве аргументов и отображает вывод на экране. Изменение
x:
к$3
записи в третьем аргументе файла вместо этого. Способ прост: прочитайте «фоновое» изображение; читать изображение на переднем плане; повторно интерпретировать цвет «лайм» (# 00ff00) как прозрачность во втором изображении; затем скомпонуйте второе изображение на первое и выведите.ImageMagick: 28 байт?
Я мог бы представить это как ответ ImageMagick, но не ясно, как бороться с аргументами. Если вы хотите утверждать, что ImageMagick является языком, основанным на стеке (что-то вроде не совсем верно, но почти ... это странно), то
-transparent lime -composite
это функция, которая ожидает два изображения в стеке и оставляет одно объединенное изображение в стеке. Может быть, это достаточно хорошо, чтобы сосчитать?источник
MATL ,
403731 байтПример запуска с офлайновым переводчиком. Изображения вводятся по их URL-адресам (также могут быть указаны локальные имена файлов).
объяснение
источник
Pyth , 27 байт
Требуется процитированный ввод. Входными данными являются два пути файлов изображений. Вывод файла
o.png
К сожалению, это не может быть проверено на онлайн-переводчике по соображениям безопасности ('
на нем отключено). Вам нужно будет установить Pyth на свой компьютер, чтобы проверить это.объяснение
источник
Matlab 2016b и Octave,
6259 байтВход: A = MxNx3 unit8 матрица переднего плана, B = MxNx3 unit8 фоновая матрица.
Выход: матрица A = MxNx3 unit8
Образец использования:
источник
C ++, 339 байт
При этом используется CImg, и он может принимать файлы и в других форматах. Результат отображается в окне.
Компилировать с
g++ chromakey.cpp -g -L/usr/lib/i386-linux-gnu -lX11 -o chromakey -pthread
.источник
R 135 байтов
Анонимная функция, принимает 2 пути файла png в качестве аргументов и выводит изображение png с именем
a.png
.Слегка разгульный, с объяснениями:
источник
SmileBASIC, 90 байт Что ключ
I
это передний план и вывод,J
это фон. Оба являются целочисленными массивами пикселей в 32-битном формате ARGB.Ungolfed
Объяснение:
ARYOP - это функция, которая применяет простую операцию к каждому элементу в массиве.
Это называется как
ARYOP mode, output_array, input_array_1, input_array_2, ...
Сначала, чтобы определить, какие пиксели в изображении являются зелеными,
-16711936
(представление RGBA зеленого цвета) вычитается из каждого пикселя на переднем плане изображения. Это дает массив, где0
представляет зеленые пиксели, а любое другое число представляет не зеленые пиксели.Чтобы преобразовать все ненулевые значения в
1
, они возводятся в квадрат (для удаления отрицательных чисел), а затем зажимаются между0
и1
.Это приводит к массиву только
0
с s и1
s.0
s представляют зеленые пиксели на переднем плане изображения и должны быть заменены пикселями с фона.1
s представляют не зеленые пиксели, и их нужно будет заменить пикселями с переднего плана.Это легко сделать с помощью линейной интерполяции.
источник
PHP, 187 байт
предполагает 24-битные файлы PNG; берет имена файлов из аргументов командной строки, пишет в стандартный вывод.
Беги с
-r
.сломать
источник
JavaScript (ES6), 290 байт
Принимает ввод как два
Image
объекта (в синтаксисе карри), которые могут быть созданы с помощью<image>
элемента HTML . Возвращает Promise, который разрешает URL-адрес данных Base64 конечного изображения, который может быть применен кsrc
переменной<image>
.Идея здесь состояла в том, чтобы установить альфа-значение для каждого
#00FF00
пикселя,0
а затем закрасить передний план с выделенным фоном поверх фона.Тестовый фрагмент
Включение переднего плана и фона по URL-адресам данных было слишком велико для размещения здесь, поэтому оно было перемещено в CodePen:
Попробуйте онлайн!
источник
OSL , 83 байта
Принимает два входа. Первый - это передний план, а второй - фон.
источник