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
| # -*- coding:utf-8 -*-
from PIL import Image
# loi utilisée pour passer d'un triple RGB à un niveau de gris
# (voir http://bech.free.fr/docs/colorim.htm) :
#
# [...] Les proportions : 2 / 7eme de rouge, 4 / 7eme de vert et 1 / 7eme de bleu
# sont plus réalistes. En télévision, on prend (aux décimales près) 30 % de rouge,
# 59 % de vert et 11 % de bleu. [...]
panchro = lambda rgba: int(float(30*rgba[0]+59*rgba[1]+11*rgba[2])/100.+0.5)
# 256 = 8 (images) * 32 (niveaux de gris)
def main():
# ma référence
# c'est du mode RGBA
cercle = Image.open('cerclechromatique.png')
pixels = tuple(cercle.getdata())
for i in range(8):
# plage recherchée [mini,maxi] en niveau de gris
# nombre de pixels du cercle chromatique qui sont concernées
mini, maxi, changements = i*32, (i+1)*32-1, 0
# je crée un nouvelle image et une liste de nouveaux pixels
new = Image.new(cercle.mode,cercle.size)
new_pixels = list()
for pixel in pixels:
# pixel transparent : on se fout des valeurs RGB
if pixel[-1] == 0:
new_pixels.append(pixel)
else:
# quel niveau de gris selon la loi "panchro pour la télévision"
val = panchro(pixel)
# on est dans la plage recherchée
# je mets un pixel noir (0,0,0) avec la transparence initiale
# pour bien localiser sur le cercle chromatique
if mini <= val <= maxi:
changements += 1
new_pixels.append((0,0,0)+(pixel[-1],))
# on n'y touche pas
else:
new_pixels.append(pixel)
# je sauegarde la nouvelle image correspondante
new.putdata(new_pixels)
new.save('panchro_entre_%03d_et_%03d.png' % (mini,maxi))
print "entre %d et %d, %d pixels ont été modifiés" % (mini,maxi,changements) |
Partager