• У дома
  • статии
  • Учене на Python и творчество. Правене на изкуство с код.
публикувано на 05-09-2019

Учене на Python и творчество. Правене на изкуство с код.

Как изглеждат думите като цветове? Как биха изглеждали сонетите на Шекспир като цветове? Този мини проект представя текст като цветове с помощта на Python и ги записва в решетка като изображение.

Всички заглавия на сонетите на Шекспир

Какво е това?

Започна като малко забавно късно една вечер по коден, играейки с начини за правене на изображения с код. По наистина прост начин как цветът може да представлява дума? Лесно ... просто преобразувайте дума в цветен код нали?

Както се оказва, не беше толкова лесно. Подобно на повечето разработчици, аз започнах да търся JS библиотека, която вече го направи, пожелавайки си, тъй като всъщност не е толкова полезна. Смятах, че това от Чарли Коулман е доста готино, но по-интересно ми беше да покажа по-подробно представяне. Цвят за всяка дума, без значение колко букви или думи.

Пропуснете, за да видите кода на github

Защо? И защо Python?

Подобно на много разработчици, които съм срещал по пътя, моята степен не беше в технически предмет. Всъщност това беше чл. По-конкретно, скулптура и илюстрация, но въпреки че кариерата ми е в уеб разработка, все още имам творческа практика. Кодът наистина е просто друг материал, с който да се работи. (И не, не казвам, че кодът е изкуство, защото това е глупаво.)

Защо Python? Е, JS беше добър, но беше бавен и ставаше по-бавен. Чух, че python беше наистина бърз и планирах да хвърля стотици думи в него. (Моля, не преценявайте твърде много любителския ми код) Наистина не знам много Python, така че това беше чудесно извинение да науча.

планиране

След версията на Codepen реших следното:

  • Цветовете, създадени от думите, трябва да получават цветовите стойности, като се използват всяка буква, а не само първите няколко.
  • „Платното“, върху което седят цветовете, трябва да се регулира, трябва да мога да отпечатам огромно изображение на цяла книга или малко изображение на моето име.
  • Окончателното изобразяване трябва да бъде изображение, а не уеб изглед.

Пример: буквите „Abcd“ като дума

Като се има предвид „Abcd“ на всяка буква на думата се присвоява стойност, където тя седи в азбуката така:

# позиция 0 1 2 3 4 5 ...
азбука = ["a", "b", "c", "d", "e", "f", ...]

Тъй като RGB стойностите се нуждаят само от 3 числа, ние използваме останалите букви, за да увеличим стойностите на числата, представляващи първите три букви. Така…

  • Word е „Abcd“
  • Стойностите са [0,1,2]
  • Останалите стойности са [3]
  • Добавете [3] към стойност 1.
Някои малки примери за думи

Какво се случва с големи думи?

Това е мястото, където започна да се затруднява. Искам всички букви в една дума да повлияят на 3-те RGB стойности на цветовете, като ги оставям просто изглеждаха неясни и не честни. Така че използвайки цип цикъл, можем да повторим и добавим съответно всички стойности след третата буква, например:

  • Думата е „Abcdefghij“
  • Стойностите са [0,1,2]
  • Останалите стойности са [3,4,5,6,7,8,9]
  • За всяка от останалите стойности преминете през първоначалните стойности и ги добавете към 3 RGB стойности една по една, така че,
  • Останалата стойност 3 се добавя към val [0]
  • Останалата стойност 4 се добавя към val [1]
  • Останалата стойност 5 се добавя към val [2]
  • Останалата стойност 6 се добавя към val [0]
  • Останалата стойност 7 се добавя към val [1]
  • И т.н.

Тази функция на цикъла ми спести много проблеми:

за i, j in zip (цикъл (диапазон (len (цветове))), допълнения):
    цветове [i] + = j
    цветове [i] = int (цветове [i])

В кода има и други хубави битове, за да се гарантира, че стойностите не надвишават [255,255,255], всъщност просто се появи нещо, което се нуждаеше от размисъл. Ще забележите, че в горния списък първоначалните стойности могат да бъдат малки, като [0,1,2]. Така те се умножават по (255/26) или (ограничение на стойността / букви в азбука). Това дава по-добра база за добавяне на стойности. [0,9.8,19.6].

Когато започнем да добавяме остатъчните стойности, те се умножават, за да се гарантира, че няма да надхвърлим 255, разделяме на 26, за стойности над 3, но по-ниски от 6. Тогава за думи с повече от 6 букви те стават наистина малки стойности чрез разделяне на повече. (x * n / 26) (1/26). Ето тази функция:

(вляво) E.E Cummings - нося сърцето си със себе си (вдясно) Уилям Карлос Уилямс - Червената тачка

Какво ще кажете за големите въвеждане на текст

Направих размерът на платното променлива, така че ако се използват големи текстове, можете да увеличите размера на платното ... той наистина ще обработи всичко. Ето Библията на крал Джеймс:

Библията на крал Джеймс - в квадратчета

Рисуване, начертаване и някои водещи бележки.

Подготвянето на списъка с цветове беше една част, изчертаването на квадратите и рисуването беше друго. Това е доста лесно в мрежата, има библиотеки като масонството, които са успели да позиционират нещата много добре. Но преди това дори не бях гуглила библиотека за рисуване на изображения на Python. Намерих една, наречена Възглавница, която направи трика.

Разработване на графиката на думата квадрати

Така че защо толкова много бележки и изработване? Ами в кода в този момент имаме списък (потенциално огромен) от цветови стойности, например:

[[45,65,221], [36,187,35], [66,84,224] ...]

Този списък трябва да бъде цикличен и да се нарисува квадрат за всеки елемент, като се използват стойностите като цветове. Трудната част тук беше да нарисуваме квадратчетата в хоризонтална линия и да пуснем ред надолу, когато ударим края. Но как да разберем, че сме на края? Какъв размер трябва да бъде падащата стойност?

Ето как се прави с 5 думи като пример:

  • Предвид знам колко квадратчета имам (5) Разработвам каква „решетка“ ще ми трябва. Например за 5 думи ще е необходима мрежа 3 x 3.
  • Сега знам, че всеки ред и колона ще се състои от три квадрата и имам размер на платно 1000. 1000/3 ще бъде ширината и височината на всеки вътрешен квадрат. И също така необходимото количество разстояние, за да изместя моите точки на рисуване хоризонтално и вертикално. Nice!
  • За да намеря каква „решетка“ имам нужда, създадох функция (grid (n, m), която взема списъка с думи и списък с квадратни числа и работи, че:

И накрая, всичко, което остана, е най-объркващата итерация, която съм писал:

Като цяло, това започна като малко забавно, но в крайна сметка научих много за Python и рисуване с код (нещо, което бих искал да правя повече). Една наистина приятна особеност е, че платното може да бъде огромно, а квадратчетата ви да са няколко милиметра. И благодаря на моята партньорка Ашли Бърдет, че ми помогна в замислите по математика :)

Вижте кода на github.

Вижте също

Защо 450 милиона долара за тази картина не са лудиЗлатното яйце: Горката девойкаКак изкуството прави всичко по-добро (затова, моля, направете повече изкуство)Карикатурист Грант Снайдер за изкуството, живота и познаването на разликатаЕто как подобрих живота сиЗащо YouTube от AR няма да бъде YouTube?