Ce projet essai, en partant d'une IMAGESOURCE de : - appliquer des effets à l'image - la redimmensionner - changer son mode de couleur - la HAACHEER...
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

haacheuur.daube.py 7.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. #!/usr/bin/python
  2. # coding: utf-8
  3. # haacheuur 0.24
  4. # port industriel de port la nouvelle - couleur - 60cm*30cm
  5. # image source : pln.jpg
  6. # image obtenue : pln..20150910-11h59m53s.jpg
  7. # pln.png 3936x1024 pix
  8. '''
  9. image input puredata : 16384 width x 768 height
  10. donc par exemple, pour 3 images :
  11. 3 x 16384 = 49152 pixels en tout
  12. '''
  13. import sys
  14. import Image
  15. import random
  16. import os
  17. import ImageDraw
  18. import ImageFont
  19. import ImageFilter
  20. from time import gmtime, strftime
  21. import time
  22. if not len(sys.argv) > 1:
  23. raise SystemExit("Usage: %s image_source" % sys.argv[0])
  24. # modifs du 30/10/2013
  25. import ImageEnhance
  26. #rapport d'allongement de la nouvelle image par rapport à la largeur de l'image originale
  27. allongement = 1
  28. #ouverture de l'image source et conversion en mode couleur 1bit
  29. #1 bit (sys.argv[1])).convert('1') et niveaux de gris : (sys.argv[1])).convert('L')
  30. im1 = Image.open(str(sys.argv[1]))
  31. im2 = im1.copy()
  32. im3 = Image.new("RGBA",(im1.size[0], im1.size[1]))
  33. im5 = Image.new("RGBA",(im1.size[0], im1.size[1]))
  34. im4 = Image.new("RGBA",(im1.size[0]*allongement, im1.size[1]))
  35. #im4 = Image.new("RGBA",(49152, im1.size[1]))
  36. Larg = im1.size[0]
  37. Haut = im1.size[1]
  38. import pickle
  39. loadfile = False
  40. class Sequence:
  41. def __init__(s):
  42. randomCoupeHauteur = []
  43. s.randomCopyPosi =[]
  44. s.proportions=[]
  45. s.choix=[]
  46. s.sizeOutput=None
  47. s.sizeInput=None
  48. """
  49. seq = dict()
  50. seq["randomCoupeHauteur"] = []
  51. seq["randomCopyPosi"] = []
  52. seq["proportions"] = []
  53. seq["choix"] = []
  54. seq["sizeOutput"]= im4.size
  55. seq["sizeInput"] = im1.size
  56. """
  57. if loadfile:
  58. seq=pickle.load(open("test.pickle"))
  59. else :
  60. seq=Sequence()
  61. for i in range(1):
  62. # constitution de la liste des tranches horizontales
  63. # genre comme si qu'on avait un 16 pistes :)
  64. # nombre aleatoire compris dans les limites de l'image
  65. def randHaut():
  66. return random.randint(0, im1.size[1]/8)*8
  67. if loadfile:
  68. randomCoupeHauteur = seq.randomCoupeHauteur
  69. else:
  70. randomCoupeHauteur = [0, \
  71. randHaut(),randHaut(),randHaut(),randHaut(), \
  72. randHaut(),randHaut(),randHaut(),randHaut(), \
  73. randHaut(),randHaut(),randHaut(),randHaut(), \
  74. randHaut(),randHaut(),randHaut(),randHaut(), \
  75. randHaut(),randHaut(),randHaut(),randHaut(), \
  76. randHaut(),randHaut(),randHaut(),randHaut(), \
  77. randHaut(),randHaut(),randHaut(),randHaut(), \
  78. randHaut(),randHaut(),randHaut(),randHaut(), \
  79. im1.size[1]]
  80. # rangement des valeurs des plus petites au plus grandes
  81. randomCoupeHauteur.sort()
  82. seq.randomCoupeHauteur = randomCoupeHauteur
  83. # les hachures
  84. def Hacheur(haut, bas) :
  85. n=0
  86. i=0
  87. #!!!!!!!!!!
  88. while n<im4.size[0] :
  89. if loadfile:
  90. proportions = seq.proportions
  91. choix_rnd = seq.choix[i]
  92. randomCopyPosi = seq.randomCopyPosi[i]
  93. else:
  94. '''
  95. 8 16 24 32 40 48 56 64 72 80 88 96 104 112 120 128 136 144 152 160 168
  96. '''
  97. #proportions = [(160,6),(120,4),(120,8),(80,16),(60,16),(20,32),(8,24),(8,16),(5,64),(3,24),(2,24),(1,256),(1,128),(1,64),(1,32),(1,16),(1,8)]
  98. #proportions = [(160,6),(120,4),(120,8),(80,16),(60,16),(20,32),(8,24),(8,16),(5,64),(3,24),(2,24),(1,256),(1,128),(1,64),(1,32),(1,16),(1,8)]
  99. #proportions = [(1280,1),(800,1),(800,2),(640,1),(640,2),(640,4),(320,4),(320,2),(320,1),(160,1),(120,2),(120,3),(80,6),(64,12),(64,6),(32,4),(32,8),(32,16),(32,32),(32,64)]
  100. proportions = [(16,2),(8,2),(4,2),(2,2),(1,2)]
  101. #proportion pln pour output final avec puredata/gem (decalage phase 32pix)
  102. '''
  103. proportions = [ (768,2),\
  104. (512,4),\
  105. (256,8),\
  106. (128,4),(128,16),\
  107. (64,4),(64,8),(64,16),\
  108. (32,8),(32,16),(32,32),(32,32),(32,64),(32,128),\
  109. (16,1),(16,4),(16,16),(16,64)]
  110. '''
  111. #proportions = [(512,1),(256,2),(128,4),(64,8),(64,4),(32,16),(32,32),(32,8),(16,8),(16,32),(8,64),(8,32),(8,16)]
  112. #proportions = [(32,1),(32,2),(32,3),(32,4),(32,5),(32,6),(32,8),(32,12),(32,16),(32,24),(32,32),(32,64)]
  113. seq.proportions = proportions
  114. #proportions = seq.proportions[]
  115. choix_rnd = random.randint(0, len(proportions)-1)
  116. #choix_rnd = random.randint(0, len(proportions)-1)
  117. seq.choix.append(choix_rnd)
  118. largeur = proportions[choix_rnd][0]
  119. # positionnement de la copie, aleatoirement, entre 0 et la largeur totale de l'image
  120. randomCopyPosi = random.randint(0, (im1.size[0]-largeur))
  121. #randomCopyPosi = seq.randomCopyPosi
  122. seq.randomCopyPosi.append(randomCopyPosi)
  123. i+=1
  124. # tirage au sort
  125. #seq["choix"].append(choix_rnd)
  126. # assignation des valeurs (paires) finales choisies
  127. largeur = proportions[choix_rnd][0]
  128. repeat = proportions[choix_rnd][1]
  129. #seq["randomCopyPosi"].append(randomCopyPosi)
  130. # pixellisation : choix de la taille du pixel = pixelSize
  131. #pixelSizeList = [1,1,1,1,1,1,1,1,4,8]
  132. pixelSizeList = [1,2,4,8]
  133. pixelSizeIndex = random.randint(0,len(pixelSizeList)-1)
  134. pixelSize = pixelSizeList[pixelSizeIndex]
  135. cropfinal = [largeur,bas-haut]
  136. hauteur = bas-haut
  137. '''
  138. haut gauche(0,0).
  139. haut droit (largeur-1 , 0).
  140. bas gauche (0 , hauteur-1).
  141. bas droit (largeur-1, hauteur-1)
  142. '''
  143. if largeur % pixelSize != 0:
  144. croop = largeur / pixelSize
  145. largeur = (int(croop) + 1 ) * pixelSize
  146. if hauteur % pixelSize != 0:
  147. croop2 = hauteur / pixelSize
  148. hauteur = (int(croop2) + 1 ) * pixelSize
  149. # decoupage du sample
  150. im5 = im2.crop((randomCopyPosi,haut,randomCopyPosi+largeur,haut+hauteur))
  151. '''COLLAGE DU SAMPLE '''
  152. loop = 0
  153. while loop<repeat:
  154. px1 = n
  155. px2 = n + largeur
  156. # draw = ImageDraw.Draw(im3)
  157. ''' PIXELISATION'''
  158. im5 = im5.resize((im3.size[0]/pixelSize, im3.size[1]/pixelSize), Image.NEAREST)
  159. im5 = im5.resize((im3.size[0]*pixelSize, im3.size[1]*pixelSize), Image.NEAREST)
  160. im3 = im5.crop(0,0,cropfinal[0]-1,cropfinal[1]-1)
  161. #lignes colorées de 1 pix
  162. draw.line((im3.size[0]-1, 0, im3.size[0]-1, im3.size[1]-1), fill="rgb(255,255,255)")
  163. im4.paste(im3, (px1, haut, px2, bas))
  164. n = n + largeur
  165. loop = loop + 1
  166. ''' OPTIONS'''
  167. def TrancheHorizontale() :
  168. # tirage au hasard de la bande copiee
  169. pos = random.randint(0, im1.size[1]-im1.size[1]/20)
  170. # copiage
  171. im5 = im2.crop((0,pos,im1.size[0],pos+im1.size[1]/20))
  172. # le soulignage en blanc
  173. draw = ImageDraw.Draw(im5)
  174. draw.line((0, im5.size[1]-1, im5.size[0], im5.size[1]-1), fill="black")
  175. draw.line((0, 1, im5.size[0], 1), fill="black")
  176. # collage
  177. im4.paste(im5, (0,pos,im1.size[0],pos+im1.size[1]/20))
  178. # HAACHEUUR
  179. for j in range(len(randomCoupeHauteur)-1):
  180. Hacheur(randomCoupeHauteur[j], randomCoupeHauteur[j+1])
  181. ''' SAUVEGARDE
  182. '''
  183. # CTRL + S
  184. #chemin du script : scriptpy = sys.argv[0]
  185. #chemin de l'image : str(sys.argv[1])
  186. scriptpy = str(sys.argv[1])
  187. script = scriptpy[:-3]
  188. n = "%05d" % i
  189. im4.save(script+"."+n+"_"+strftime("%Y%m%d-%Hh%Mm%Ss", gmtime())+".png",'PNG', quality=100)
  190. #pickle.dump(seq, open("test.pickle","w"))
  191. pickle.dump(seq, open(script+"."+n+"_"+strftime("%Y%m%d-%Hh%Mm%Ss", gmtime())+".pickle","w"))
  192. #print script+"."+str(i)+"_"+strftime("%Y%m%d-%Hh%Mm%Ss", gmtime())+".jpg"
  193. #millis = int(round(time.time() * 1000))
  194. #print "millis-secondes : "+str(millis)
  195. #obtenir les valeurs RGB des pixels de l'image
  196. '''
  197. from PIL import Image
  198. im = Image.open('test.png')
  199. pixels = list(im.getdata())
  200. width, height = im.size
  201. pixels = [pixels[i * width:(i + 1) * width] for i in xrange(height)]
  202. for r in range(0, height-⁠1) :
  203. print "pixels = "+str(pixels[r])
  204. print " "
  205. print "len(pixels) = "+str(len(pixels))
  206. print "width = "+str(width)
  207. print "height = "+str(height)
  208. print " "
  209. #tintin = im.tostring( "raw", "RGBA", 0, -⁠1)
  210. #print "tostring = "+tintin
  211. '''