## ## info-223 : sciences informatiques, Pierre Hyvernat ## ## Mini bibliothèque pour créer et manipuler des petites images au formats Netpbm ## Attention, ce n'est pas très efficace et il manque probablement plein de trucs. ## ## Par exemple, je ne gere pas les tailles de lignes (normalement inférieures à 70 ## caractères) et les "commentaires". ## ## class Image(): largeur = 0 hauteur = 0 format = None image = None def __init__(self,format_image,largeur,hauteur,couleur=None): """Initialise une nouvelle image. Les arguments sont : - "largeur" et "hauteur" : les dimensions de l'image - "format_image" : le format de l'image ("PBM" pour noir et blanc, "PGM" pour niveaux de gris ou "PPM" pour couleurs RGB) - "couleur" : la couleur de fond de l'image (0/1 pour PBM, 1--255 pour PGM, (r,g,b) pour PPM)""" assert(largeur > 0) assert(hauteur > 0) assert( format_image == "PBM" or format_image == "PGM" or format_image == "PPM" ) self.largeur = largeur self.hauteur = hauteur self.format = format_image if format_image == "PBM" and couleur == None: couleur = 0 if format_image == "PGM" and couleur == None: couleur = 255 if format_image == "PPM" and couleur == None: couleur = (255,255,255) self.image = [] for j in range(self.hauteur): self.image.append([couleur]*largeur) def couleur_pixel(self,x,y): """Renvoie la couleur du pixel (x,y) dans l'image.""" assert(0 <= x < self.largeur) assert(0 <= y < self.hauteur) return self.image[y][x] def change_pixel(self,x,y,couleur): """Change la couleur du pixel de coordonnées "(i,j)" dans l'image "image".""" assert(0 <= x < self.largeur) assert(0 <= y < self.hauteur) if (self.format == "PBM"): assert(couleur == 0 or couleur == 1) if (self.format == "PGM"): assert(type(couleur).__name__ == "int") assert(0 <= couleur < 256) if (self.format == "PPM"): assert(type(couleur).__name__ == "tuple") assert(len(couleur) == 3) assert(0 <= couleur[0] < 256) assert(0 <= couleur[1] < 256) assert(0 <= couleur[2] < 256) self.image[y][x] = couleur def sauve(self,fichier): """Sauvegarde l'image dans un fichier. L'extension du fichier est automatiquement ajoutée.""" if self.format == "PBM": entete = "P1" extension = ".pbm" elif self.format == "PGM": entete = "P2" extension = ".pgm" elif self.format == "PPM": entete = "P3" extension = ".ppm" else: assert(False) f = open(fichier + extension, "w") f.write(entete + "\n") f.write("{:d} {:d}\n".format(self.largeur,self.hauteur)) if self.format == "PGM" or self.format == "PPM": f.write("255\n") for ligne in self.image: if self.format == "PPM": f.write(" ".join(map(lambda c:"{} {} {}".format(*c) , ligne))+"\n") else: f.write(" ".join(map(str,ligne))+"\n") f.close() def ouvre_image(fichier): """Ouvre et renvoie l'image contenue dans le fichier. Ce fichier doit contenir une image Netpbm "plain"...""" fd = open(fichier) ligne = fd.readline().strip() if ligne == "P1": format_image = "PBM" elif ligne == "P2": format_image = "PGM" elif ligne == "P3": format_image = "PPM" else: raise "type d'image non reconnu" largeur, hauteur = map(int, fd.readline().strip().split(" ")) image = Image(format_image,largeur,hauteur) image.image = [] if format_image == "PGM" or format_image == "PPM": fd.readline() #j'ignore la couleur max for line in fd.readlines(): l = list(map(int, line.strip().split(" "))) if format_image == "PPM": ll = [0]*largeur for i in range(len(l)//3): ll[i] = (l[3*i], l[3*i+1], l[3*i+2]) l = ll image.image.append(l) return image