1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| import urllib
filename = 'cat.ppm'
url = 'http://igm.univ-mlv.fr/~incerti/IMAGES/COLOR/CatLogo.128.ppm'
print u'Télécharge %s sur %s' % (filename, url)
urllib.urlretrieve(url, filename)
print u'Voilà, %s écrit...\n' % filename
#3 lignes d'information
lines = open(filename, 'r').readlines()[:3]
for line in lines:
print line,
#longueur du prologue
prologlen = len(''.join(lines))
#extraction nombre de lignes et nombre de colonnes
ncols, nlines = map(int, lines[1].split())
#ouverture puis lecture en mode binaire
buff = open(filename, 'rb').read()
#Je ne connais pas le format ppm, ça marche avec CE fichier
prolog = buff[:prologlen]
imgbuff = buff[prologlen:]
#calcul de la taille du pixel
pixsize = len(imgbuff) / (nlines * ncols)
#et donc de la ligne (en pixels)
linesize = ncols
#image -> liste de pixels (triplets)
pixels = [imgbuff[i:i+pixsize] for i in range(0, len(imgbuff), pixsize)]
#image (liste de pixels) -> lignes (liste de listes de pixels)
lignes = [pixels[i:i+linesize] for i in range(0, len(pixels), linesize)]
#fonction d'affichage du pixel (decimal ou hexa)
def formatPixel(pixel, base=10):
if len(pixel) == 3:
fs = (base == 10 and '[%3u %3u %3u]') or (base == 16 and '[%2x %2x %2x]')
return fs % (ord(pixel[0]), ord(pixel[1]), ord(pixel[2]))
#affichage sous forme de matrice (juste les 10 premières colonnes)
for ligne in lignes:
for pixel in ligne[:10]:
print formatPixel(pixel, 16),
print
#inverser la liste "en place" (symétrie horizontale)
lignes.reverse()
#refabriquer imgbuff à partir de la liste inversée
imgbuff = ''.join([''.join(_) for _ in lignes])
f = open('cat2.ppm', 'wb')
f.write(prolog + imgbuff)
print u'\ncat2.ppm écrit'
#on inverse à nouveau, retour à l'image d'origine
lignes.reverse()
#on inverse chaque ligne (symétrie verticale)
#et on refabrique imgbuff à partir de la liste inversée
imgbuff = ''.join([''.join(ligne[::-1]) for ligne in lignes])
f = open('cat3.ppm', 'wb')
f.write(prolog + imgbuff)
print u'cat3.ppm écrit' |
Partager