Faire du Pixel Art grâce à Excel VBA
- bertrandleplay
- 31 août
- 3 min de lecture
Je vous propose dans ce post un programme pour faire du Pixel Art à partir d'une image, c'est à dire la pixeliser plus ou moins grossièrement comme ci-dessous:


Etape 1: Récupérer la couleur des pixels
La première étape consiste à créer une fonction permettant de récupérer la couleur d'un pixel donnée sur l'écran.
J'ai trouvé cette fonction directement sur internet sur ce forum:
Voici la fonction que vous pouvez recopier directement dans votre éditeur VBA:
Private Declare PtrSafe Function GetDC Lib "user32" (ByVal hWnd As LongPtr) As LongPtr
Private Declare PtrSafe Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As LongPtr) As LongPtr
Private Declare PtrSafe Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As LongPtr, ByVal nWidth As Long, ByVal nHeight As Long) As LongPtr
Private Declare PtrSafe Function SelectObject Lib "gdi32" (ByVal hdc As LongPtr, ByVal hObject As LongPtr) As Long
Private Declare PtrSafe Function BitBlt Lib "gdi32" (ByVal hDestDC As LongPtr, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As LongPtr, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare PtrSafe Function GetPixel Lib "gdi32" (ByVal hdc As LongPtr, ByVal x As Long, ByVal y As Long) As Long
Private Declare PtrSafe Function DeleteObject Lib "gdi32" (ByVal hObject As LongPtr) As Long
Private Declare PtrSafe Function DeleteDC Lib "gdi32" (ByVal hdc As LongPtr) As Long
Private Const srccopy = &HCC0020
Public Function getScreenPixel(x As Long, y As Long) As Variant
Dim desktopDC As LongPtr: desktopDC = GetDC(0)
Dim memDC As LongPtr: memDC = CreateCompatibleDC(desktopDC)
Dim memBMP As LongPtr: memBMP = CreateCompatibleBitmap(desktopDC, 1, 1)
If SelectObject(memDC, memBMP) <> 0 And BitBlt(memDC, 0, 0, 1, 1, desktopDC, x, y, srccopy) <> 0 Then
getScreenPixel = GetPixel(memDC, 0, 0)
End If
DeleteObject memBMP
DeleteDC memDC
End FunctionVous pouvez la tester en créant une procédure de test:
Sub Test()
a = GetScreenPixel(100,100)
MsgBox a
End SubSi vous lancez cette Macro, voici le résultat:

Il s'agit du code couleur en décimal, vous pouvez vérifier à quelle couleur il correspond sur un site internet, par exemple:
Le code couleur 16777215 correspond au Blanc.
Etape 2: Ecrire le programme de lecture des pixels
Maintenant que nous arrivons à récupérer la couleur d'un pixel donné, nous allons stocker chacune des valeurs dans un tableau pour les mémoriser.
Avant cela, nous allons modifier la largeur des colonnes et la hauteur des lignes afin de créer un quadrillage de Pixel Art uniforme:
Cells.Select
Selection.ColumnWidth = 2
Selection.RowHeight = 14Voici le résultat:

Nous pouvons ensuite écrire le programme qui permet de stocker les valeurs de couleurs à un échantillonnage donnée dans un tableau.
Pour cela, il faut d'abord déclarer un tableau de valeurs:
Dim couleur_pixel(100, 100) As VariantNous déclarons un tableau de 100 valeurs en x et 100 valeurs en y pour avoir suffisamment de place.
Ensuite, nous allons stocker la valeur de couleur de chaque point de l'image dans le tableau déclaré en utilisant une double boucle:
For i = 1 to 100
For j = 1 to 100
couleur_pixel(j,i)=getScreenPixel (10 + 15*i, 10 + 15*j)
Next
NextAttention j'ai inversé les x et les y entre le tableau couleur_pixel et la fonction getScreenPixel car getScreenPixel récupère la couleur d'un pixel en précisant la colonne puis la ligne et non pas l'ordre ligne, colonne comme sur Pixel. Sinon votre image apparaîtra tournée à 90° !
Après avoir stocké les valeurs des couleurs de pixel, il faut les répartir dans le fichier Excel de la feuille en cours:
For i = 1 to 100
For j = 1 to 100
Cells(i, j).Interior.Color = couleur_pixel(i, j)
Next
NextVous pouvez tester votre programme avec une photo. Attention à bien mettre la photo en haut à gauche et au premier plan avant de lancer la macro.
Vous trouverez le détail de la présentation du tutoriel sur la vidéo youtube ici:
Vous pouvez également téléchargé le fichier Excel VBA contenant la macro ici:
N'hésitez-pas à me dire en commentaire si vous avez réussi à créer votre programme, si vous l'avez personnalisé ou amélioré.
Merci !


Commentaires