from text_tree import insert
from treesort import measure_tree
from visualizer import visualize_node
from descriptions import descriptions
from graph_utils import make_name_generator, wrapped
from graphviz import Graph
from random import shuffle
import datetime
import exifread
from PIL import Image
def get_image_date (path):
f = open(path, 'rb')
# Return Exif tags
tags = exifread.process_file(f)
if 'EXIF DateTimeOriginal' in tags.keys():
return datetime.datetime.strptime(str(tags['EXIF DateTimeOriginal']), '%Y:%m:%d %H:%M:%S')
elif 'Image DateTime' in tags.keys():
return datetime.datetime.strptime(str(tags['Image DateTime']), '%Y:%m:%d %H:%M:%S')
else:
print('No date for "{}"'.format(path))
return datetime.datetime.now()
def count_trees (text):
count = 0
words = ['tree', 'forest', 'leave', 'branch', 'stump', 'grass', 'nature', 'flower', 'rock', 'mushroom', 'nature', 'plant']
neg_words = ['computer', 'microphone', 'screen', 'laptop', 'machine', 'pool', 'project', 'text', 'culture', 'board', 'wire', 'chip', 'technology']
text = text.lower()
for word in words:
count += text.count(word)
for word in neg_words:
count -= text.count(word)
return count
def make_tree (values, key = lambda word: word):
tree = None
for value in values:
tree = insert(tree, value, key)
return tree
def make_image_node(graph, generate_node_name, image):
node_name = generate_node_name()
im = Image.open(image[1])
w, h = im.size
sw = 4.75 if w < h else 3.75
graph.node(node_name,
image=image[1],
label='',
shape='box',
color='transparent',
width=str(sw*(w/h)),
height=str(sw),
imagepos='mc',
fixedsize='true',
fillcolor='transparent',
imagescale='height'
)
return node_name
def make_text_node(graph, generate_node_name, image):
node_name = generate_node_name()
graph.node(node_name,
label='<{}
>'.format(wrapped(image[0], 35, join="
")),
fontname='Fira Mono',
fontcolor='black',
shape='plaintext',
color='black',
fontsize='14'
)
return node_name
if __name__ == '__main__':
generate_node_name = make_name_generator(length=3)
images = [(description, image, color, get_image_date(image)) for image, description, color in descriptions]
shuffle(images)
description_tree = make_tree(images, lambda image: count_trees(image[0]))
date_tree = make_tree(images, lambda image: image[3])
color_tree = make_tree(images, lambda image: image[2][0])
while measure_tree(description_tree) > 8 or measure_tree(date_tree) > 9 or measure_tree(color_tree) > 9:
print(measure_tree(description_tree), measure_tree(date_tree), measure_tree(color_tree))
shuffle(images)
description_tree = make_tree(images, lambda image: count_trees(image[0]))
date_tree = make_tree(images, lambda image: image[3])
color_tree = make_tree(images, lambda image: image[2][0])
graph = Graph(name='images_description', format='svg', engine='dot')
graph.attr('graph', splines='line', rankdir='BT', ranksep='1', nodesep='0.15')
graph.attr(label="<36 Images, ordered by mentions of nature in their description
Listen to the descriptions at frart.algoliterarypublishing.net/treesort>", labelloc='b', labeljust='l', fontname='Fira mono', fontsize='14', fontcolor='black')
visualize_node(graph, make_image_node, generate_node_name, description_tree)
graph.render('description_images_random')
graph = Graph(name='descriptions_description', format='svg', engine='dot')
graph.attr('graph', splines='line', rankdir='BT', ranksep='2', nodesep='0.15', margin='1,1')
graph.attr(label="<36 Image descriptions, ordered by mentions of nature
Listen to the descriptions at frart.algoliterarypublishing.net/treesort>", labelloc='b', labeljust='l', fontname='Fira mono', fontsize='14', fontcolor='black', image='qr.gif')
visualize_node(graph, make_text_node, generate_node_name, description_tree)
graph.render('description_text_random')
graph = Graph(name='images_colors', format='svg', engine='dot')
graph.attr('graph', splines='line', rankdir='BT', ranksep='1')
graph.attr(label="<36 Images, ordered by dominant color
Listen to the descriptions at frart.algoliterarypublishing.net/treesort>", labelloc='b', labeljust='l', fontname='Fira mono', fontsize='12', fontcolor='black')
visualize_node(graph, make_image_node, generate_node_name, color_tree)
graph.render('images_colors')
graph = Graph(name='images_dates', format='svg', engine='dot')
graph.attr('graph', splines='line', rankdir='BT', ranksep='1', nodesep='0.15')
graph.attr(label="<36 Images, ordered by date
Listen to the descriptions at frart.algoliterarypublishing.net/treesort>", labelloc='b', labeljust='l', fontname='Fira mono', fontsize='12', fontcolor='black')
visualize_node(graph, make_image_node, generate_node_name, date_tree)
graph.render('images_dates')
# Insert later into the SVG's
# style="position: absolute;bottom: 1vh;"
#