Générateur de patchwork
Ce wiki a été archivé en 2018.
Le nouveau wiki se trouve à: ressources.labomedia.org Les fonctionnalités sont désactivées: vous pouvez faire une recherche sur Google site:https://wiki.labomedia.org et découvrir La Labomedia. |
De Centre de Ressources Numériques - Labomedia
Ce script python a été écrit pour tenter de proposer des illustrations à certaines des œuvres majeures présentes sur le site d’expérimentation littéralement poétique Serviette Farcie.
Il utilise le moteur de recherche d'image de Bing pour récupérer une image pour chaque mot du texte. Il découpe ensuite un carré aléatoirement dans chacune d'elles puis les assemble en un patchwork.
À titre d'exemple, la description que vous venez de lire (y compris cette phrase) a produit cette image :
# -*- coding: utf-8 -*-
#!usr/bin/python
# Ecrit par Olivier Baudu pour le Labomedia http://labomedia.org/ le 16/03/14
# La partie qui gère le téléchargement est inspirée du script :
# http://daleshort.cc/doku.php?id=blog:python_image_downloader publié en license CC BY-NC-SA 3.0
# Ce script telecharge via Bing des images obtenues par une recherche effectuée à partir de mot clef presents dans un fichier texte.txt externe
# Puis il les crop en carré pour les assembler ensuite patchwork
from BeautifulSoup import BeautifulSoup
from random import randrange
import urllib2
import re
import os
import Image
import sys
nomImage = 0
listeDeMots = []
with open ('texte.txt', 'r') as texte_brut: #Ouvre le fichier texte.txt
listeDeMotsOriginal = texte_brut.readlines()
for ligne in listeDeMotsOriginal:
listeDeMots += ligne.rstrip('\n\r').rstrip('\n').rsplit(" ") #Crée une liste avec chacun des groupes de mot
def imageUrlFind(keyword, numMot):
masterLinks=list()
try:
url = """http://www.bing.com/images/search?q={0}&FORM=AWIR""".format(keyword)
opener = urllib2.build_opener()
request = urllib2.Request(url)
request.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 ( .NET CLR 3.5.30729)')
data = opener.open(request).read()
soup = BeautifulSoup(data)
links = soup.findAll('a', href=True)
strLink= list()
for link in links:
strLink.append(str(link))
for link in strLink:
regex = re.findall('imgurl:(.+)(\.jpg+|\.png+|\.gif)',link)
if regex != []:
lili = regex[0][0]
lili = lili.rsplit('''"''')
#print("====> {0}".format(lili[1]))
masterLinks.append(lili[1])
print ("Mot n°{2} : il y a {0} images disponibles pour || {1} ||".format(len(masterLinks), keyword, numMot))
return masterLinks
except:
return masterLinks
def creaDossier(dossier):
if not os.path.exists(dossier):
os.makedirs(dossier)
def downloadImages(links):
import urllib
imageNumber = 69
nbImagesLinks = len(links)
if nbImagesLinks != 0:
choixImage = randrange(nbImagesLinks)
print("Choix de la {0}ème parmi {1} possibles".format(choixImage, nbImagesLinks))
try:
global nomImage
image = urllib.URLopener()
image.retrieve(links[choixImage],"IMAGES/{0}".format(str(nomImage)))
nomImage += 1
#im = Image.open(str(imageNumber))
#im.save(str(imageNumber)+".tiff", "TIFF")
except:
print '/!\\ Problème à la reception du fichier'
else:
print 'Mot vide'
print("\n---\n")
#Main
creaDossier('IMAGES')
creaDossier('CROP')
print(listeDeMots)
for i in range(len(listeDeMots)):
links = imageUrlFind(listeDeMots[i], i)
numberOfCatsDownloaded = downloadImages(links)
#######################################
#######################################
cropWidth = 100
cropHeight = 100
nbImageOk = 0
# Récupère le nombre d'images dans le dossier "images"
sortie = os.popen('''ls IMAGES/ | wc -l''').read()
# La sortie de os.popen... est un string, il est donc nécessaire de le convertir
nb_images = int(sortie)
for i in range (nb_images):
try:
im = Image.open("IMAGES/{0}".format(str(i)))
width = im.size[0] - cropWidth
height = im.size[1] - cropHeight
xCrop = randrange(width)
yCrop = randrange(height)
portion = im.crop((xCrop, yCrop, xCrop+cropWidth, yCrop+cropHeight))
portion = portion.resize((50, 50), Image.ANTIALIAS)
portion.save("CROP/{0}.tiff".format(str(nbImageOk)), "TIFF")
print("OK pour {0}".format(i))
nbImageOk += 1
except:
pass
print("Il y a {0} images qui ont été traitées".format(nbImageOk))
#################################
#################################
def makeImage(nb_image_par_ligne):
nb_lignes = nb_images/nb_image_par_ligne - 1
if (nb_images%nb_image_par_ligne != 0):
nb_lignes +=1
width = nb_image_par_ligne * 50
height = (nb_lignes+1) * 50
patchwork_par_le_bas = Image.new('RGB', (width, height), "white")
patchwork_par_le_haut = Image.new('RGB', (width, height), "white")
name = 0
y = 0
for i in range(nb_lignes):
x = 0
for j in range(nb_image_par_ligne):
if (name >= nb_images):
break
temp = Image.open('CROP/{0}.tiff'.format(name))
patchwork_par_le_bas.paste(temp, (x, y, x+50, y+50))
patchwork_par_le_haut.paste(temp, (width-50-x, height-50-y, width-x, height-y))
x += 50
name += 1
y += 50
patchwork_par_le_bas.save('matrice{0}.png'.format(str(nb_image_par_ligne)))
makeImage(10)