top of page

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:

Image avant pixelisation
Image avant pixelisation
Image après Pixelisation
Image après Pixelisation

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 Function

Vous pouvez la tester en créant une procédure de test:

Sub Test()

	a = GetScreenPixel(100,100)
	MsgBox a

End Sub

Si vous lancez cette Macro, voici le résultat:

ree

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 = 14

Voici le résultat:

ree

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 Variant

Nous 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
Next

Attention 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
Next

Vous 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


bottom of page