Сейчас зима, и пришло время года, чтобы оно стало холодным (и чтобы странные разноцветные головные уборы начали появляться ... скоро). Давайте напишем некоторый код, чтобы сделать картинки аватара и другие изображения замороженными, чтобы соответствовать теме!
вход
Входными данными для подачи заявки на участие в этом конкурсе должны быть изображение (изображение, которое нужно сделать замороженным) и число (порог, который будет объяснен позже).
Вы можете вводить изображение любым способом, которым поддерживает их ваш язык (путь к файлу или URL-адрес в качестве аргумента, извлечение его из буфера обмена, перетаскивание изображения и т. Д.), А также в любом из перечисленных здесь форматов, который выражает цвета в RGB (вы вместо этого может поддерживать / требовать RGBA, но это не является обязательным требованием).
Вы можете также ввести число любым удобным для вас способом (аргумент командной строки, STDIN, диалоговое окно ввода и т. Д.), За исключением жесткого кодирования его в вашей программе (например n=10
). Если вы используете путь к файлу / URL для изображения, его также необходимо ввести таким же образом.
Выход
Программа должна обработать изображение в соответствии с описанием ниже, а затем вывести его любым удобным для вас способом (в файл, показать его на экране, поместить в буфер обмена и т. Д.).
Описание
Материалы должны обработать изображение с помощью следующих трех шагов. n
относится к числу, которое ваша программа получила в качестве входных данных вместе с изображением.
Примените размытие радиуса
n
к входному изображению, заменив значения R, G и B каждого пикселя средними значениями R, G и B для всех пикселей на расстоянииn
пикселей от Манхэттена , игнорируя все координаты за пределами границ. (Т.е. все пиксели, в которых сумма разности по X и разности по Y меньше или равнаn
.)(примечание: я использовал размытие по Гауссу для изображений выше, потому что для него была удобная встроенная функция, поэтому ваши изображения могут выглядеть немного иначе.)
Установите для каждого пикселя случайный пиксель в пределах расстояния от
n/2
пикселей («расстояние» определяется так же, как и на предыдущем шаге).Это должно быть сделано путем циклического прохода по изображению и установки каждого пикселя на случайный пиксель в этом диапазоне, чтобы некоторые пиксели могли полностью исчезнуть, а некоторые могли бы дублироваться.
Все изменения должны применяться одновременно. Другими словами, используйте старые значения пикселей (после шага 1, но до этого шага), а не новые значения после установки их в случайный пиксель.
Умножьте «синее» значение RGB каждого пикселя на 1,5, ограничив его значением 255 (или любым другим максимальным значением для полосы пикселей) и округлив вниз.
правила
Вы можете использовать библиотеки изображений / функции, связанные с обработкой изображений, встроенные в ваш язык; тем не менее, вы не можете использовать какие-либо функции, которые выполняют одну из трех основных задач, упомянутых в описании. Например, вы не можете использовать
blur
функцию, ноgetPixel
функция в порядке.Это код-гольф , поэтому выигрывает самый короткий код в байтах!
источник
dx <= n && dy <= n
это точное представление о расстоянии Манхэттена, не так ли?Ответы:
Python 2 - 326
339 358Принимает участие от пользователя. Сначала файл, потом
n
.Это, вероятно, может быть гораздо лучше: P Спасибо @ SP3000 за идеи гольфа!
Пример ввода: (Windows)
Редактировать : Исправлена ошибка, когда синий размножался (Мартин с n = 20 больше не река; _;)
Мартин с n = 2:
Мартин с n = 10:
Мартин с n = 20:
источник
Python 2 - 617 байт
РЕДАКТИРОВАТЬ: игра в гольф некоторые, похоже, FryAmTheEggMan заставил меня победить, хотя
источник
Java - 1009 байт
да, я думал, что мог бы сделать лучше, чем это ...
Мартин с n = 5:
п = 20:
Мне с 10
источник
k&0xFF00
? Кроме того, вы не могли бы использовать255
вместо0xFF
?C, 429 (391 + 38 для определения флагов)
Формат ввода:
pam
файл без комментариев или лишних пробелов в заголовке, содержимое передается через STDIN.n
аргументы обязательны (они могут быть чем угодно).Формат вывода:
pam
файл в STDOUT.Скомпилировать:
-Wl,--stack,33554432
увеличивает размер стека; это может быть изменено или удалено в зависимости от размера обрабатываемого изображения (программе требуется размер стека, превышающий число пикселей в 4 раза).-funsigned-char
имеет использование GCCunsigned char
вместоsigned char
дляchar
. Стандарты C допускают любую из этих опций, и эта опция нужна только здесь, потому что gcc используетsigned char
по умолчанию.Для запуска (n = 5):
Примечание: Если компиляции на Windows,
stdio.h
,fcntl.h
иio.h
должны быть включены, и следующий добавляется в начале кодаmain()
для того , чтобы программа для чтения / записи на STDIN / STDOUT в двоичный, а не текст, потоки (это не имеет значения , на Linux, но Windows использует\r\n
вместо\n
текстовых потоков).Комментируемая версия
Мартин с n = 10:
Мартин с n = 20:
Мартин с n = 100:
источник
R, 440 символов
С разрывами строки для удобочитаемости:
Пример ввода:
f(2,"avatar.png")
Результаты с n = 2
... с n = 10
... с n = 20
источник