[Bitmaps]Générer des référentiels de teinte
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:
1 2 3 4
|
PALETTEENTRY E;
HPALETTE H;
AnsiString Filepath; |
Dans le constructeur de la form principale :
Code:
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:
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:
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:
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:
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:
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 !