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

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

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

Какво е това?

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

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

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

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

Защо Python? Е, JavaScripts беше добър, но беше бавен и ставаше по-бавен. Чух, че python беше наистина бърз и планирах да хвърля стотици думи в него.

планиране

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

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

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

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

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

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

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

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

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

  • Word е „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 (цикъл (диапазон (лен (цветове))), допълнения): цветове [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). Ето тази функция:

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

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

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

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

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

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

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

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

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

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

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

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

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

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