Les Snippets

Connexion

Réduire le nombre de Couleurs d'une Image

Niveau requis pour utiliser/comprendre cette source : 1 ( Débutant )
Créé le 12/04/2006 14:43:22 et initié par Gobillot [Liste]
Date de mise à jour : 12/04/2006 15:03:56
Vue : 6133
Catégorie(s) : Graphique
Langages dispo pour ce code :
- VB6



Langage : VB6
Date ajout : 12/04/2006
Posté par Gobillot [Liste]

 Const BI_RGB = 0&
 Const DIB_RGB_COLORS = 0&
 Const DIB_PAL_COLORS = 1&
 
 Private Type BITMAPINFOHEADER
     biSize          As Long
     biWidth         As Long
     biHeight        As Long
     biPlanes        As Integer
     biBitCount      As Integer
     biCompression   As Long
     biSizeImage     As Long
     biXPelsPerMeter As Long
     biYPelsPerMeter As Long
     biClrUsed       As Long
     biClrImportant  As Long
 End Type
 
 Private Type RGBQUAD
     rgbBlue      As Byte
     rgbGreen     As Byte
     rgbRed       As Byte
     rgbReserved  As Byte
 End Type
 
 Private Type BITMAPINFO
     bmiHeader    As BITMAPINFOHEADER
     bmiColors    As RGBQUAD
 End Type
 
 Private Type PALETTEENTRY
    peRed         As Byte
    peGreen       As Byte
    peBlue        As Byte
    peFlags       As Byte
 End Type
 
 Private Type LOGPALETTE
    palVersion    As Integer
    palNumEntries As Integer
    palPalEntry(255) As PALETTEENTRY
 End Type
 
 Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
        (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
 Private Declare Function GetDIBits Lib "gdi32" _
        (ByVal aHDC As Long, ByVal hBitmap As Long, _
         ByVal nStartScan As Long, ByVal nNumScans As Long, _
         lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
 Private Declare Function SetDIBits Lib "gdi32" _
        (ByVal hdc As Long, ByVal hBitmap As Long, _
         ByVal nStartScan As Long, ByVal nNumScans As Long, _
         lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
 Private Declare Function GetNearestPaletteIndex Lib "gdi32.dll" _
        (ByVal HPALETTE As Long, ByVal crColor As Long) As Long
 Private Declare Function CreatePalette Lib "gdi32" _
        (lpLogPalette As Any) As Long
 Private Declare Function DeleteObject Lib "gdi32" _
        (ByVal hObject As Long) As Long
 
 Private Sub ReduireNombreCouleurs(PicDest As PictureBox, palette() As Long)
     Dim bw     As Integer
     Dim bh     As Integer
     Dim NColor As Integer
     Dim x      As Integer
     Dim y      As Integer
     Dim hPal   As Long
     Dim Logpal As LOGPALETTE
     Dim Bmp    As BITMAPINFO
 
     bw = PicDest.ScaleWidth
     bh = PicDest.ScaleHeight
     
     With Bmp.bmiHeader
         .biSize = 40
         .biWidth = bw
         .biHeight = -bh
         .biPlanes = 1
         .biCompression = BI_RGB
         .biBitCount = 32
          End With
          
     ReDim pix(bw - 1, bh - 1) As Long
     GetDIBits PicDest.hdc, PicDest.Image, 0, bh, pix(0, 0), Bmp, DIB_RGB_COLORS
  
     NColor = (UBound(palette) + 1)
     If NColor > 256 Then NColor = 256
     
     Logpal.palVersion = &H300
     Logpal.palNumEntries = NColor
 
     CopyMemory Logpal.palPalEntry(0), palette(0), NColor * 4
     hPal = CreatePalette(Logpal)
  
 '// attention le Rouge et le Bleu sont inversés
 '// pour la recherche ça n'a aucune importance
 '// mais pour comparer une couleur faudra en tenir compte
 '// &HFF0000 représente le Rouge et &H0000FF représente le Bleu
 
     For y = 0 To bh - 1
         For x = 0 To bw - 1
             pix(x, y) = palette(GetNearestPaletteIndex(hPal, pix(x, y)))
             Next
         Next
 
     DeleteObject hPal
 
     SetDIBits PicDest.hdc, PicDest.Image, 0, bh, pix(0, 0), Bmp, DIB_RGB_COLORS
     PicDest.Picture = PicDest.Image
     Beep
     
 End Sub
 
 
 '// UTILISATION:
 '// il faut: - une PictureBox avec une image
 '//          - une palette de couleurs (pas plus de 256 couleurs)
 
 
 '// 1er exemple:
 '// création d'une palette de 256 couleurs au hasard
 '// les couleurs sont dans le format RVB
 '// la palette n'est pas optimisée, les doubles ne sont pas traités
 Private Sub Command1_Click()
     Dim pal1()  As Long
     Dim NbCol   As Integer
     Dim i       As Integer
     
     Picture1.Picture = LoadPicture(VotreImage)
     Randomize Timer
     NbCol = 256
     ReDim pal1(NbCol - 1)
     For i = 0 To NbCol - 1
         pal1(i) = Rnd * 255 * 65536 + Rnd * 255 * 256 + Rnd * 255
         Next
     ReduireNombreCouleurs Picture1, pal1()
 End Sub
 
 
 '// 2ème exemple:
 '// création d'une palette de 256 couleurs en niveau de gris
 '// toutes les couleurs sont présentes et pas de doubles
 Private Sub Command2_Click()
     Dim pal2()  As Long
     Dim NbCol   As Integer
     Dim i       As Integer
 
     Picture1.Picture = LoadPicture(VotreImage)
     NbCol = 256
     ReDim pal2(NbCol - 1)
     For i = 0 To NbCol - 1
         pal2(i) = i * 65793
         Next
     ReduireNombreCouleurs Picture1, pal2()
 End Sub
 
 '// 3ème exemple:
 '// création d'une palette de 16 couleurs en niveau de gris
 '// la palette n'est pas optimisée, les doubles ne sont pas traités
 Private Sub Command3_Click()
     Dim Pal3()  As Long
     Dim NbCol   As Integer
     Dim i       As Integer
     
     Picture1.Picture = LoadPicture(VotreImage)
     Randomize Timer
     NbCol = 16
     ReDim Pal3(NbCol - 1)
     For i = 0 To NbCol - 1
         Pal3(i) = Int(Rnd * 256) * 65793
         Next
     ReduireNombreCouleurs Picture1, Pal3()
 End Sub
 
 
 

Snippets en rapport avec : Image, Couleur, Réduire, Réduction, Palette



Codes sources en rapport avec : Image, Couleur, Réduire, Réduction, Palette

{C / C++ / C++.NET} GÉNÉRATION D'UNE PALETTE OPTIMALE POUR LA RÉDUCTION DE COULEURS
J'ai repris une de mes anciennes sources pour produire celle-ci, le programme éffectue une capture ...

{Visual Basic, VB6, VB.NET, VB 2005} CLASSER DES IMAGES EN FONCTION DE LEUR COULEUR DOMINANTE/CONTIENT UNE FONCTION DÉTECTANT LA COULEUR MOYENNE D'UNE IMAGE
Bonjour, Je poste ma première source : elle permet de classer des images en fonction de leur couleu...

{Delphi} MINIMISER LES COULEURS D' UNE IMAGE VENANT DU SCANNER OU AUTRE
Dans le même esprit que ma source : http://www.delphifr.com/codes/CHANGER-COULEUR-PIXEL-PIXELS-COUL...

{PHP} CRÉATION DE MINIATURE D'UNE IMAGE
Cette fonction enregistre une miniature d'une image. Les paramètres sont : - le chemin complet de ...

{C# / C#.NET} APPLICATION CRÉÉ UN SPIROGRAPHE
voici un petit code qui permet de créé un petit spirographe .J'utilise deux boutons un pour la coule...

{Visual Basic, VB6, VB.NET, VB 2005} TRANSFORMATION IMAGE COULEURS A IMAGE NOIR SUR BLANC
Tranformation d'une image couleurs a une image Noir sur blanc. Code bien commente pour les debutants...

{Flash} CONVERTISSEUR RVB - HEXA
Salut à tous les flashkodeurs ! et mes respects... Cette source permet de convertir une couleur R...

{Delphi} CHANGER LA COULEUR D' UN PIXEL+PIXELS DE COULEUR VOISINE
Cette fonction permet de changer la couleur d' un pixel d' un bitmap para une autre tout en respecta...

{Flash} NEGATION D'UNE IMAGE BITMAP (FLASH 8 BETA)
Voila un petit exemple suite à la source déposée concernant flash player 8 et sa gestion des pixels....

{Flash} COLORPICKER
Un colorpicker complet, c'est à dire avec TOUTES les couleurs (comme on peut trouver dans Flash MX)....