Эта задача заключается в постепенном изменении оттенков на изображении, чтобы сделать красивые картинки, подобные этой:
( оригинал )
Вызов
Напишите программу или функцию, которая принимает два неотрицательных целых числа и изображение в любом общем формате файла изображения по вашему выбору (вы можете указать путь к изображению или необработанным данным изображения).
Мы назовем первое целое число циклами, а второе целое - смещением .
Мы также определим шаг с плавающей точкой как 360-кратные циклы, деленные на площадь изображения, или step = 360 * cycles / (image width * image height)
.
Для каждого пикселя P в изображении, перемещая по одной строке за раз, слева направо, сверху вниз (т.е. в порядке чтения, если пиксели были буквами), выполните следующие действия:
Увеличение цветового тона от Р по офсетным градусам (цикл вокруг от 360 до 0 , если это необходимо).
Затем увеличьте смещение за шагом .
Сохраните, отобразите или выведите исходное изображение в любом общем формате файла изображения.
Эта процедура постепенно увеличивает оттенок всех пикселей в изображении, делая циклы полных циклов вокруг радуги оттенка , начиная с первоначального смещения оттенка смещением .
Когда число циклов равно 1, а смещение равно 0, как на приведенном выше изображении «Звездная ночь», верхний и нижний ряды пикселей практически не имеют сдвига оттенка, но между ними существует полный цветовой цикл.
Детали
Циклы могут быть любым неотрицательным целым числом, но вы можете предположить, что смещение составляет от 0 до 359 включительно.
Когда число циклов равно 0, оттенок каждого пикселя в изображении будет смещен на точное смещение, поскольку шаг также должен быть равен 0. (В этом случае, если смещение равно 0, изображение не изменяется вообще.)
При желании вы можете предположить, что циклы и смещение вводятся как числа с плавающей запятой (т.е.
1.0
вместо1
). (Я понимаю, что они вовсе не должны быть целыми числами, это просто упрощает задачу.)«Оттенок» относится к версии цветового пространства RGB, распространенной в цветовых моделях HSL / HSV .
Примеры
Оригинал:
Cycles = 1, offset = 0:
Циклы = 1, смещение = 180:
Оригинал:
Cycles = 2, offset = 60:
Оригинал:
(Спасибо ArtOfCode .)
Циклы = 1, смещение = 120:
Оригинал:
(Спасибо дверная ручка .)
Cycles = 1, offset = 0:
Cycles = 4, offset = 0:
Cycles = 200, смещение = 0:
Cycles = 30000, смещение = 0:
(Эти изображения могут быть не идеальными из-за сжатия изображений imgur.)
счет
Самый короткий код в байтах побеждает. Ответ Tiebreaker выше.
Ответы, которые публикуют свои собственные классные тестовые изображения, получат от меня больше баллов
источник
Ответы:
Pyth, 86 байт, полная программа
Pyth не имеет встроенных преобразований цветового пространства - это реальная сделка.
Принимает ввод в следующем формате на стандартный ввод:
Выходное изображение записывается в
o.png
.Это работает, вращая цветной куб вокруг его диагонали, а затем зажимая любые значения за пределами диапазона.
Если
a
угол поворота иr, g, b
входной цвет, мы вычисляем новый цветr', g', b'
по:источник
Python, 379 байт
Это принимает путь к
.jpg
входу. Он не будет работать с PNG, хотя вы можете изменить ,r,g,b=i.split();
чтобыr,g,b=i.split()[:3];
загрузить изображение PNG.Вот несколько изображений:
Оригинал:
Смещение: 0, циклов: 4
Оригинал:
Смещение 0, 1 цикл:
Оригинал:
Смещение 0, 2,5 цикла:
источник
Java (полная программа),
491488 байт (спасибо @Geobits)Ungolfed
объяснение
Использование: Довольно просто. Компилировать с
java -c Q.java
. Беги сjava Q <cycles> <offset> <imagepath>
. Переопределит существующее изображение, поэтому будьте осторожны.Сначала я собирался найти решение, основанное только на методах, но я не совсем знал, как обрабатывать импорт этих файлов, поэтому я решил, что пойду на полную Java , это, вероятно, в любом случае не победит: ^)
Полученные результаты:
Image 1: 1 cycle, 0 offset
Image 1: 1 cycle, 180 offset
Image 2: 2 cycles, 60 offset
Image 3: 1 cycle, 120 offset
Image 4: 1 cycle, 0 offset
Image 4: 4 cycles, 0 offset
Image 4: 200 cycles, 0 offset
Bonus: The Starry Night, 1 cycle, 0 offset
источник
java.io.File
вместоjava.io.*
?import
**static
**, а не толькоimport
?ImageIO::read
иImageIO::write
без необходимости добавлятьImageIO.
: Это добавляет 9 байт (static .*
), но сохраняет 16 (ImageIO.
дважды).