задача
Напишите программу или функцию, которая берет изображение ширины w
и высоты h
, а также два целых числа a <= w/2
и b <= h/2
и выводит художественное представление изображения ascii с размерами a
x b
.
Искусство ascii должно быть создано с помощью следующих шагов (или другого процесса с тем же выводом):
Изменение размера
w
хh
изображений на2a
е2b
. Цвет пикселя(x, y)
в измененном изображении должен быть равен среднему значению цветов всех пикселей исходного изображения внутри прямоугольника со следующими углами:(floor[x * w/2a], floor[y * h/2b]) (ceil[(x+1) * w/2a], ceil[(y+1) * h/2b])
Изображение с измененным размером должно быть ненасыщенным, беря среднее значение красного, зеленого и синего компонентов цвета и устанавливая для каждого компонента это среднее значение.
Символ должен быть выведен для каждого блока пикселей 2x2, следуя приведенным ниже правилам:
- Позвольте
e = 3 - floor[color/64]
, где цвет относится к красной составляющей цвета верхнего левого пикселя (в диапазоне 0..255). Позвольтеf
,g
иh
ссылаются на это значение, но для верхнего правого, нижнего левого и нижнего правого пикселей соответственно. - Пусть
z
будет в среднемe
,f
,g
,h
. - Выведите символ, соответствующий следующему (белый представляет пиксель, где
3 - floor[color/64]
ноль, а серый представляет ненулевой). - = Выведите пробел (
)
- или = вывод,
"
еслиe (or f) >= 2
и в'
противном случае. - или = вывод,
,
еслиg (or h) >= 2
и в.
противном случае. - или = Выход
-
- или = Выход
;
- = Выход
\
- = Выход
/
- = Выход
J
- = Выход
L
- = Выход
7
- = Выход
P
-
z = 1
: вывод*
.z = 2
: выводC
.z = 3
: вывод#
.
- Позвольте
Другие примечания: Все средние значения, полученные на вышеуказанных этапах, должны использовать целочисленное деление (т.е. округление до 0).
Вы можете использовать библиотеку для чтения изображений, но библиотеки нельзя использовать для шагов изменения размера и десатурации.
вход
Ваша программа примет три части данных:
- Изображение. Это изображение может быть в любом формате по вашему выбору (например, PNG, PPM)
- Ширина ascii art (в количестве символов)
- Высота искусства ascii (в количестве символов)
Ввод может быть прочитан через STDIN, передан как аргумент командной строки, сохранен как переменная и т. Д.
Выход
Ваша программа выведет ascii art, сгенерированный из изображения и через процесс, описанный выше. Каждая строка должна иметь одинаковую ширину (ширину, переданную в качестве входных данных), и никакие лишние пробелы не могут быть добавлены или удалены. Последняя строка может иметь завершающий символ новой строки, но это не обязательно. Пустые строки (строки только с пробелами) не должны быть пропущены.
Примеры
Все изображения были взяты из Википедии и переданы в общественное достояние. Предполагается, что ваша программа будет работать для всех изображений и допустимых входных данных.
Ширина = 52, Высота = 25:
.-- *** - ----. - ********** L .-- .-- 7 ---- P- .J ****************. . ********* \. ****************** L \ J ********** '. - ********************. J *********** л / J *********************; ./*************.L ; ********************* PJ **************; 7; . ********************** '. *************** ;; * ; **********************; ***************; J *. *********************** *******П********'**; C ********************* C ******* P; *******. **; C ********************** J ***************; **; С *********************; **************** **. **********************' ***************П;** J ********************* P *************** / *** . ********************** 7 ************* 'J **; ; ******************** C "'P *********** PJ ***' "7 ****************** C" '********** P. ** C; '* C *************'; ********* - J ** CP '* C ********** P 7 ** 7 ** P / - **** P - * CCCCC * P- '7 ******** P' '---' --- '
Ширина: 70, Высота: 3:
---------------------------. .---------------- J ***************************** P -J ***************** *** / ** J; ----------*********П---------' -------------------- -»
Ширина: 50, Высота: 25:
.J --- .J * P --- J * L--. J *** 'L -J *********** - J ****; **************** L ; ***** '.J ******************** J **** 7 ************************ P ** CC *; . ********* *********** LJ P- ** C * P 'J ********************** - 7 * C * L **********************; J * С **; **********************; JC ** C **. ; ; ******** CCC * C ** КПКГ ** "7 ***** L. 7 ***** CCCCCC **** CC ** ' - *****. -J - ** C * C * CC ****** CC * ' **; CC ***; «** CCC ***** КПКГ *; '- **** - - *** CCCCC *** - '------'
Ширина: 26, Высота: 17:
-, л J - ** L .C # J '; * PL, C # " .PP 7. JC7P ;; * J ;; , C'C; J; CC; L C "# * L 7-P; *; ПК 7CL *** J * PC '# '7 # C * C # P'; P JC # C- J # CCC # L .JC # CJCC ## C; ; # - - #, CCC # CCCCCCCC ; * .- -.C; ; CCCCCCCCCCCC ; **** J ** L; CCCCCCCCCCCC ; *******; «CCCCCCCCCCCP ******* CCCCCCCCCCC '* P-7 *' "CCCCP '- «---
Это код-гольф , поэтому выигрывает самый короткий ответ.