Developpez.com - Kylix
X

Choisissez d'abord la catégorieensuite la rubrique :

Composant graphique TWebBitmap
pour les applications Web avec Kylix.

22 Avril 2003

Par "Lionel Siero" (nucleus@ls-interactive.com)

ORIGINE DU COMPOSANT :

Ceux, qui comme moi, ont developpé des applications web importantes avec Delphi ont eu recours a une action web renvoyant une image. Une image, qui bien sur, n'existe pas sur le disque, mais qui est génerée par un TBitmap.create dans l'action du TWebModule.

Mais..., sous Kylix, y a un probleme, l'unité QGraphics, qui contient le TBitmap et autres, genere une erreur lors du démarrage du serveur APACHE : Cannot Open X Windows, ou un truc dans le genre.

En effet, la librairie QT de TrollTech se base sur X-Window, donc, il est impossible de l'utilisé avec un module apache, car ce dernier ne peux charger un contexte X windows.
Donc, on est apparement coincé avec Kylix... pas vraiment heureusement.

Comme je le disais plus haut, on renvoit un flux de données et ça Kylix sait faire sans QGraphics.
Donc l'idée est d'utiliser la mémoire pour y créer une structure de données correspondant à une image sans utiliser QGraphics :
C'est le composant TWebBitmap
LE FORMAT EN MEMOIRE :

Pour faciliter la structure en mémoire, j'ai utilisé celle d'une image BMP 8bits. Ce format a pour avantage d'etre composé d'un tableau de byte qui composent l'image en 256 couleurs. Il est donc facile de modifié l'image en modifiant directement le tableau de Byte.

Pour les couleurs, j'ai fixé une palette par défaut lors de la création de l'objet :
Remarque : Quand vous chargez une image depuis un fichier, c'est la palette du fichier qui devient active.

MANIPULER L'IMAGE :

Il y 9 ans, j'avais realisé une bibliotheque de fonction pour manipuler l'écran VGA 320x200 avec TurboPascal 6.0. Je n'ai eu qu'a recopier les fonctions comme methode de mon objet

PROPRIETES :
Brush            : TWebBrush;
{Comme un TBrush, il propose les propriétes methode et style (seulement bsSolid et bsClear)}

Pen              : TWebPen;
{Comme un TPen, il propose les propriétes methode et style (seulement bsSolid et bsClear)}

Transparent      : Boolean;
{Indique si l'image possede une couleur transparente (utile pour la methode Draw et SaveToGifStream)}

TransparentColor : Byte;
{Numero de la couleur transparente}

Property Data    : TWebData; 
{Accès au tableau de Byte en lecture seulement}

Property Colors  : TWebPalette;
{Accès au tableau de couleur en lecture seulement}

Property Width   : Integer;
{Largeur de l'image en pixel en lecture seulement}

Property Height  : Integer;
{Hauteur de l'image en pixel en lecture seulement}

METHODES :
Function GetPixel(const X,Y:Word):byte;
{Recupere la couleur d'un pixel}

Procedure PutPixel(const X,Y:Integer;c:byte);
{Fixe la couleur d'un pixel}

Procedure SetRGB(const Color,r,g,b:Byte);
{Fixe les composante Rouge Vert Bleu d'une couleur de la palette}

Procedure Rectangle(const X1,Y1,X2,Y2:Integer);
{Dessine un rectangle en utilisant le Brush et Pen définis}

Procedure Ellipse(const X1,Y1,X2,Y2:Integer);
{Dessine une ellipse en utilisant le Brush et Pen définis}

Procedure MoveTo(Const X,Y:Integer);
{Positionne le curseur de dessin a la position (X,Y)}

Procedure LineTo(Const X,Y:Integer);
{Dessine une ligne depuis la position du curseur jusqu'a (X,Y) en utilisant le Pen défini}

Procedure FillRect;
{Efface l'image en utilisant le Brush défini}

Procedure Textout(X,y:Integer;Const text:String);
{Affiche du texte en utilisant la fonte systeme a la position (X,Y) }

Procedure Draw(X,Y:Integer;Acopier:TWebBitMap);
{Dessine dans l'image une autre image TWebBitmap a la position (X,Y)}

Procedure NewBitmap(Const Width,height:Integer;Const C,P:Integer);
{Initialise une nouvelle image, en fixant la taille, la couleur de fond (C) et la couleur du stylo (P)}

Procedure LoadFromFile(Const filename:String);
{Charge une image BMP 8Bits (256 couleurs)}

Procedure SaveToFile(Const filename:String);
{Sauvegarde sur le disque une image BMP 8Bits (256 couleurs)}

EXPEDIER LE RESULTAT :

Bon, on a une image BMP prete en mémoire, mais il faut l'envoyer, et pour cela il vaut mieux utilise un format compressé comme le gif.

Grace a l'aide de Paul Toth, j'ai ajouté une nouvelle methode tres utile :

Procedure SaveToGIFStream(Stream:TStream);
{Sauve l'image au format Gif dans un flux en utilsant les infos de transparence}

CONCLUSION :

Le composant est basique mais fonctionnel, vous pouvez l'ameliorer en ajoutant de nouvelle fonction graphique, style TeeChart, par exemple. Pour que qui est de l'export, il est possible d'ecrire une methode SaveToJpegStream par exemple.

Vous trouverez les sources du composant en cliquant ici

Bon développement sous Linux
Lionel
Contacter le responsable de la rubrique Kylix