Ascii Art
Résolu
Bonsoir! J'ai un mini problème avec mon programme pour créer un Ascii Art à partir d'une image.
Je voudrais savoir comment régler ce problème et surtout savoir si mon programme présente un problème (même si je suis sûre qu'il y en a sinon je ne serai pas ici).
Je sais qu'il faut que je convertisse d'abord l'image en niveaux de gris (c'est fait) mais la partie la plus compliquée reste la suite, transformer un pixel en caractère Ascii. Et c'est là où je bloque. Il faut aussi que j'ouvre l'image en fichier texte mais, je suis également bloquée dessus.
Lorsque je lance ce programme, on m'affiche comme message d'erreur à la ligne 22: "list indices must be integers, not str"
Je pense que c'est le mieux que je puisse faire avec mes compétences actuelles.
Merci d'avance pour votre aide ^^ (si vous voulez bien m'aider)
Je voudrais savoir comment régler ce problème et surtout savoir si mon programme présente un problème (même si je suis sûre qu'il y en a sinon je ne serai pas ici).
Je sais qu'il faut que je convertisse d'abord l'image en niveaux de gris (c'est fait) mais la partie la plus compliquée reste la suite, transformer un pixel en caractère Ascii. Et c'est là où je bloque. Il faut aussi que j'ouvre l'image en fichier texte mais, je suis également bloquée dessus.
Lorsque je lance ce programme, on m'affiche comme message d'erreur à la ligne 22: "list indices must be integers, not str"
Je pense que c'est le mieux que je puisse faire avec mes compétences actuelles.
from PIL import Image
imageAscii= Image.open("Capture.jpg")
largeur, hauteur=imageAscii.size
imageBut=Image .new( "RGB" , ( largeur , hauteur ) )
for i in range (hauteur):
for j in range (largeur):
p=imageAscii.getpixel((j,i))
gris=int((p[0]+p[1]+p[2])/3)
p=(gris,gris,gris)
imageBut.putpixel((j,i),p)
ascii =['@','%','#','*','+','=',':','.',' ']
f=open("asciiTest.txt","w")
for x in range (hauteur):
for y in range (largeur):
p=imageAscii.getpixel((x,y))
if 225<gris<255:
print(ascii[' '])
if 200<gris<225:
print(ascii['.'])
if 175<gris<200:
print(ascii[':'])
if 150<gris<175:
print(ascii['='])
if 125<gris<150:
print(ascii['+'])
if 100<gris<125:
print(ascii['*'])
if 75<gris<100:
print(ascii['#'])
if 25<gris<50:
print(ascii['%'])
if 0<gris<25:
print(ascii['@'])
f.close()
imageBut.save("Test.jpg")
imageBut.show()
Merci d'avance pour votre aide ^^ (si vous voulez bien m'aider)
5 réponses
-
ModérateurBonjour,
Si on essaie de comprendre
- à partir de l'image originale tu crées une nouvelle image niveau de gris
- donc pour transformer en ascii, ce sont les pixels de la nouvelle image qu'il faudrait traiter, pas l'image originale
- et imagebut, c'est l'image niveau de gris, pour afficher l'ascii, c'est le fichier .txt qu'il faut afficher
-
D'accord! Je vais essayer de le modifier avec vos conseilles.
Si possible, pourriez vous me dire pourquoi je reçois comme message d'erreur à ligne 22:"list indices must be integers, not str" ?
Ah et aussi, mon programme fait-il sens? Je veux dire, si je règle le problème à la ligne 22, aurais-je une image en fichier txt, en ascii ou pas du tout ?
Merci d'avance si vous pouviez me répondre ^^ -
Modérateur@Luminaen 22 soit
print(ascii[8])
soit, le tableau ascii ne servant à rienprint(' ')et pareil pour tous les caractères
un programme sans erreur aura toujours plus de chance de donner un résultat qu'un programme contenant des erreurs ;-) -
@jee peeOui forcément ah ah...
J'ai d'ailleurs modifié mon programme mais je reçois un autre message d'erreur :
Traceback
<module>
getpixel
"IndexError: image Index out of range"
Pourriez vous peut-être m'aider à trouver l'erreur?
from PIL import Image
imageAscii= Image.open("Capture.jpg") #ouvrir image à modifier
largeur, hauteur=imageAscii.size #récupérer les dimensions de l'image
imageBut=Image .new( "RGB" , ( largeur , hauteur ) )
for i in range (hauteur):
for j in range (largeur):
p=imageAscii.getpixel((j,i))
gris=int((p[0]+p[1]+p[2])/3)
p=(gris,gris,gris)
imageBut.putpixel((j,i),p)
f=open("asciiTest.txt","r")
for x in range (hauteur):
for y in range (largeur):
p=imageBut.getpixel((x,y))
if 225<gris<255:
print(' ')
if 200<gris<225:
print('.')
if 175<gris<200:
print(':')
if 150<gris<175:
print('=')
if 125<gris<150:
print('+')
if 100<gris<125:
print('*')
if 75<gris<100:
print('#')
if 25<gris<50:
print('%')
if 0<gris<25:
print('@')
imageBut.save("Test.jpg")
f.close()
f.read() -
Modérateur@LuminaEt toi tu penses quoi de l'erreur ? pour suivre il faut mettre des traces, des print pour avoir les valeurs des variables.
moi je vois soit getpixel c'est hauteur, largeur pas largeur, hauteur
ou range va de 0 à n-1, donc il faudrait hauteur-1 -
@jee peeJe vous avoue que je ne comprends pas très bien le message d'erreur de base. Mais sachant qu'il dit "out of range" cela doit venir de la boucle (je pense). Par contre, pourquoi mettre hauteur-1? Je ne comprends pas vraiment cela.
Ah et également il me dit 'getpixel' il doit y avoir une erreur venant de celui-ci mais je ne vois pas trop où. Excusez moi de poser autant de question par ailleurs ><'
-
