« Pygame/Introduction au module Surfarray » : différence entre les versions

Contenu supprimé Contenu ajouté
m Formatage, ajout de code
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
Ligne 25 :
Si la paquet python Numeric n'est pas installé, il est préférable de le faire maintenant. Vous pouvez télécharger le paquet depuis [http://sourceforge.net/project/showfiles.php?group_id=1369 cette adresse]. Pour être certain que Numeric fonctionne chez vous, vous devriez obtenir quelque chose de ce genre à partir du mode interactif de Python.
 
<sourcesyntaxhighlight lang="python">
>>> from Numeric import * #Importer Numeric
>>> a = array((1,2,3,4,5)) #Créer un tableau
Ligne 34 :
>>> a*2 #Un nouveau tableau avec des valeurs doublées
array([ 2, 4, 6, 8, 10])
</syntaxhighlight>
</source>
 
Comme vous pouvez le voir, le module Numeric nous fournit un nouveau type de données, le ''array''. Cet objet contient un tableau de taille fixe, et toutes les valeurs qu'il contient sont du même type. Les tableaux peuvent aussi être multidimensionnels, et c'est de cette manière nous les utiliserons avec les images. Il y aurait un peu plus à dire à leur sujet, mais c'est suffisant pour commencer.
Ligne 40 :
Si vous observez la dernière commande ci-dessus, vous verrez que les opérations mathématiques sur les tableaux du module Numeric s'appliquent à toutes les valeurs du tableau. Ce fonctionnement est appelé ''elementwise operations''. Ces tableaux peuvent également être ''slicés'' (découpés) à la façon des listes normales. La syntaxe du découpage en slice est la même que celle utilisée avec les objets python standards ''(donc révisez-la si besoin)''. Voici quelques exemples de plus sur le fonctionnement des tableaux :
 
<sourcesyntaxhighlight lang="python">
>>> len(a) #Obtenir la taille du tableau
5
Ligne 53 :
File "<stdin>", line 1, in <module>
ValueError: frames are not aligned
</syntaxhighlight>
</source>
 
On obtient une erreur avec la dernière commande, en essayant d'ajouter deux tableaux de tailles différentes. Pour réaliser des opérations impliquant deux tableaux (incluant les comparaisons et les assignations) les deux tableaux doivent avoir les mêmes dimensions. Il est très important de savoir que les valeurs contenues dans un tableau créé depuis le slice d'un original possède les mêmes références que les valeurs du tableau de départ. Donc modifier une valeur dans un slice issue d'un tableau original, modifiera la valeur correspondante du tableau original. Cette propriété des tableaux est très importante à retenir.
 
<sourcesyntaxhighlight lang="python">
>>> a #Afficher le tableau de départ
array([1, 2, 3, 4, 5])
Ligne 74 :
>>> a #Afficher l'original
array([ 1, 2, 13, 4, 5])
</syntaxhighlight>
</source>
 
Maintenant, nous jetterons un coup d'œil à de petits tableau à deux dimensions. Ne soyez pas trop inquiets, c'est la même chose que d'avoir un tuple à deux dimensions (un tuple dans un tuple). Commençons avec des tableaux à deux dimensions.
 
<sourcesyntaxhighlight lang="python">
>>> row1 = (1,2,3) #Créer un tuple
>>> row2 = (3,4,5) #Créer un second tuple
Ligne 91 :
[3, 4],
[5, 6]])
</syntaxhighlight>
</source>
 
Maintenant, avec ce tableau à deux dimensions (que l'on appellera à partir de maintenant un '''2D'''), nous pouvons récupérer des valeurs spécifiques par leur index et slicer dans les deux dimensions. L'utilisation d'une virgule pour séparer les indices, nous permet de chercher/slicer dans plusieurs dimensions. L'utilisation de "''':'''" comme un index (afin de ne pas fournir tous les indices) nous renvoie toutes les valeurs contenues sur cette dimension. Voyons son fonctionnement :
 
<sourcesyntaxhighlight lang="python">
>>> b #Afficher la tableau précédent
array([[1, 2, 3],
Ligne 110 :
array([[1, 2],
[3, 4]])
</syntaxhighlight>
</source>
 
Bon, restez avec moi, c'est à peu près aussi dur que ça. En utilisant Numeric, il existe une fonctionnalité supplémentaire pour effectuer des slices. Le slice de tableau nous permet de spécifier un ''incrément de slice''. La syntaxe pour un slice avec incrément est <code>index_debut : index_fin : increment</code>.
 
<sourcesyntaxhighlight lang="python">
>>> c = arange(10) #Comme range(), mais pour faire un tableau
>>> c #Afficher le tableau
Ligne 124 :
>>> c[8:1:-1] #Slice de 1 à 8 inversé
array([8, 7, 6, 5, 4, 3, 2])
</syntaxhighlight>
</source>
 
Voilà. Vous en savez suffisamment pour vous permettre de commencer à utiliser Numeric avec le module Surfarray. Les propriétés du module Numeric sont certainement plus consistantes, mais il ne s'agit que d'une introduction. Par ailleurs, on veut seulement faire des trucs marrants, pas vrai ?
Ligne 132 :
Pour utiliser le module Surfarray, nous avons besoin de l'importer. Les modules Surfarray et Numeric étant des composants optionnels de Pygame, il est judicieux de s'assurer de les importer correctement avant de les utiliser. Dans ces exemples, j'importerai le module Numeric dans une variable nommée N. Vous verrez ainsi quelles fonctions utilisées provient du module Numeric (et de plus c'est légèrement plus court que de taper Numeric devant chaque fonction).
 
<sourcesyntaxhighlight lang="python">
try:
import Numeric as N
Ligne 138 :
except ImportError:
raise ImportError, "Numeric and Surfarray are required."
</syntaxhighlight>
</source>
 
== Introduction à Surfarray ==
Ligne 201 :
=== Création d'une image noire ===
 
<sourcesyntaxhighlight lang="python">
allblack = N.zeros((128, 128))
surfdemo_show(allblack, 'allblack')
</syntaxhighlight>
</source>
 
[[Image:Pygame-allblack.png|left]]
Ligne 213 :
=== Tableaux de 3 dimensions (séparation des composantes RGB) ===
 
<sourcesyntaxhighlight lang="python">
striped = N.zeros((128, 128, 3))
striped[:] = (255, 0, 0)
striped[:,::3] = (0, 255, 255)
surfdemo_show(striped, 'striped')
</syntaxhighlight>
</source>
 
[[Image:Pygame-striped.png|left]]
Ligne 227 :
=== Extraction des données d'une image depuis un fichier ===
 
<sourcesyntaxhighlight lang="python">
imgsurface = pygame.image.load('surfarray.jpg')
imgarray = surfarray.array2d(imgsurface)
surfdemo_show(imgarray, 'imgarray')
</syntaxhighlight>
</source>
 
[[Image:Pygame-imgarray.png|left]]
Ligne 240 :
=== Retournement ''miroir'' vertical ===
 
<sourcesyntaxhighlight lang="python">
flipped = imgarray[:,::-1]
surfdemo_show(flipped, 'flipped')
</syntaxhighlight>
</source>
 
[[Image:Pygame-flipped.png|left]]
Ligne 252 :
=== Miniaturisation d'une image ===
 
<sourcesyntaxhighlight lang="python">
scaledown = imgarray[::2,::2]
surfdemo_show(scaledown, 'scaledown')
</syntaxhighlight>
</source>
 
[[Image:Pygame-scaledown.png|left]]
Ligne 264 :
=== Augmentation de la taille d'une image ===
 
<sourcesyntaxhighlight lang="python">
size = N.array(imgarray.shape)*2
scaleup = N.zeros(size)
Ligne 271 :
scaleup[:,1::2] = scaleup[:,::2]
surfdemo_show(scaleup, 'scaleup')
</syntaxhighlight>
</source>
 
[[Image:Pygame-scaleup.png|left]]
Ligne 280 :
=== Filtrage de canaux ===
 
<sourcesyntaxhighlight lang="python">
rgbarray = surfarray.array3d(imgsurface)
redimg = N.array(rgbarray)
redimg[:,:,1:] = 0
surfdemo_show(redimg, 'redimg')
</syntaxhighlight>
</source>
 
[[Image:Pygame-redimg.png|left]]
Ligne 294 :
=== Filtrage par convolution ===
 
<sourcesyntaxhighlight lang="python">
soften = N.array(rgbarray)
soften[1:,:] += rgbarray[:-1,:]*8
Ligne 302 :
soften /= 33
surfdemo_show(soften, 'soften')
</syntaxhighlight>
</source>
 
[[Image:Pygame-soften.png|left]]
Ligne 312 :
=== Décoloration ===
 
<sourcesyntaxhighlight lang="python">
src = N.array(rgbarray)
dest = N.zeros(rgbarray.shape)
Ligne 319 :
xfade = src + diff.astype(N.Int)
surfdemo_show(xfade, 'xfade')
</syntaxhighlight>
</source>
 
[[Image:Pygame-xfade.png|left]]