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
Aller à : navigation, rechercher

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 :

Description.jpg
# -*- 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)