Salut !

Voici une méthode pour générer un bitmap 8 bits dont la palette sera organisée de manière à correspondre à un référentiel de teinte.

On part d'un nouveau projet dans un nouveau dossier (dans le quel sera enregistré ce projet).
Sur la form principale on place un TImage qu'il faudra charger avec un bitmap 8 bit quelconque (peu importe le contenu de sa palette du moment que c'est un 8 bit).
L'image est renommée en tant que GreyLevels puisque c'est le référentiel qui va être généré ici !
Le principe est de modifier la palette du bitmap 8 bit, de réaliser un remplissage du bitmap pour en afficher le dégradé et de sauvegarder ce bitmap dans le dossier de cet exécutable.

On déclare en global :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
PALETTEENTRY E;
HPALETTE H;
AnsiString Filepath;
Dans le constructeur de la form principale :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
Filepath = ExtractFilePath(Application->ExeName);
H = GreyLevels->Picture->Bitmap->Palette;
for(int j = 0; j < 256; j++)
    {
    E.peRed   = (Byte)j;
    E.peGreen = (Byte)j;
    E.peBlue  = (Byte)j;
    E.peFlags = 0;
    SetPaletteEntries(H,j,1,&E);
    }
Dans la OnShow de cette form principale :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
FillAndSave(GreyLevels, "GreyLevels.bmp");
Voici la méthode FillAndSave qu'il suffira de déclarer dans la class de la Form, en public :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
void __fastcall FillAndSave(TImage *Image, AnsiString Filename);
J'ai utilisé une compilation conditionnelle pour générer des rubans soit horizontaux soit verticaux :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
// Fixer à false pour générer des rubans verticaux
#define Horizontal true
La méthode qui va faire usage de cette compilation conditionnelle :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
void __fastcall TForm1::FillAndSave(TImage *Image, AnsiString Filename)
{
Graphics::TBitmap *Dest = Image->Picture->Bitmap;
 
#if Horizontal
    int we = 256;
    int he = 16;
#else
    int we = 16;
    int he = 256;
#endif
 
Dest->Width = we;
Dest->Height = he;
Byte *pB;
for(int y = 0; y < he; y++)
    {
    pB = (Byte*)Dest->ScanLine[y];
    for(int x = 0; x < we; x++)
        {
        #if Horizontal
            pB[x] = (Byte)x;
        #else
            pB[x] = (Byte)y;
        #endif
        }
    }
Dest->SaveToFile(Filepath + Filename);
}
Il suffit d'exécuter le programme.
L'image affichera un dégradé.
Le bitmap sera automatiquement stocké dans le dossier de cet exécutable et sera donc disponible pour d'autres programmes.
Il ne restera plus qu'à fermer l'application puisque tout est terminé.

On peut générer ainsi tous les référentiels 8 bits dont on pourrait avoir besoin (Rouge, Vert, Bleu, Niv de gris inversés ...) !

Voici les algos pour ces référentiels basiques, en partant d'images renommées :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
H = RedLevels->Picture->Bitmap->Palette;
for(int j = 0; j < 256; j++)
    {
    E.peRed   = (Byte)j;
    E.peGreen = 0;
    E.peBlue  = 0;
    E.peFlags = 0;
    SetPaletteEntries(H,j,1,&E);
    }
 
H = GreenLevels->Picture->Bitmap->Palette;
for(int j = 0; j < 256; j++)
    {
    E.peRed   = 0;
    E.peGreen = (Byte)j;
    E.peBlue  = 0;
    E.peFlags = 0;
    SetPaletteEntries(H,j,1,&E);
    }
 
H = BlueLevels->Picture->Bitmap->Palette;
for(int j = 0; j < 256; j++)
    {
    E.peRed   = 0;
    E.peGreen = 0;
    E.peBlue  = (Byte)j;
    E.peFlags = 0;
    SetPaletteEntries(H,j,1,&E);
    }
 
H = NegGreyLevels->Picture->Bitmap->Palette;
for(int j = 255; j >= 0; j--)
    {
    E.peRed   = (Byte)j;
    E.peGreen = (Byte)j;
    E.peBlue  = (Byte)j;
    E.peFlags = 0;
    SetPaletteEntries(H,255 - j,1,&E);
    }
Pour info, je génère mes cinq référentiels d'un coup d'un seul, donc avec 5 TImage !
J'utilise BCB3 Pro donc si vous rencontrez des problèmes, faites le savoir de manière à ce que ceux qui disposent d'autres versions puissent participer à l'amélioration de ce code !

A plus !