AIDE A/S: DÉFILEMENT D'UN TEXTE SOUS FORME D'IMAGE SUR UN AFFICHEUR À LEDS

Résolu
zwail1 Messages postés 17 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 3 décembre 2010 - 10 avril 2010 à 23:46
zwail1 Messages postés 17 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 3 décembre 2010 - 17 avril 2010 à 15:07
Salut aux utilisateurs de cet espace !
Je suis un débutant en DELPHI
J essaye de travailler un soft pour défiler du texte sur un tableau d affichage (à LEDS)
Pour cela, avec la Méthode de ScanLine, j ai fais un Scan sur mon Image qui contiens le Texte(TextOut de Mon Edit), et à l aide de deux boucle j ai l extraction des couleurs différentes du Blanc, c elles qui conçoives mon texte converti en image.
Alors le Bute :
A partir de l image Scannée je veux Obtenir des 1 et des 0 pour les faire défiler sur la grille des leds.
Le probleme : j ai rien pu contre ça ? AIDE SVP ooOOoo S.O.S
J espère que je me suis bien exprimer, et merci
Je m excuse si j ai fais un double TOPIC, normalement j ai lu tout ce qui concerne ce genre d affichage mais Ouuups; j ai pas trouver ce que je cherche
La source:
* unit Unit1;
*
* interface
*
* uses
* Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
* Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons, MarqueeLed, ExtDlgs;
* Const
* sizeLetter =18;
* HeightLetter =28;
* SizeBorder =11;
* HeightComponent =42;
*
* type
* TForm1 = class(TForm)
* Edit1: TEdit;
* Button1: TButton;
* Image1: TImage;
* Button2: TButton;
* procedure Button1Click(Sender: TObject);
* procedure FormDblClick(Sender: TObject);
* private
* { Déclarations privées }
* public
* { Déclarations publiques }
*
* end;
*
* var
* Form1: TForm1;
* Bitmap:TBitmap;
* P: PbyteArray;
* X,Y,FWidth,Fsize,Z,N : Integer;
* FledOff,FLEDOn : TCOLOR;
* Cadre,Cadre1:TRECT;
* Letter,Line,A:Word;
*
* implementation
*
* {$R *.dfm}
*
* procedure TForm1.Button1Click(Sender: TObject);
* begin
* Image1.Picture := Nil;
*
* //*************************************//
* // ** Exportation du Text vers Image**//
* //************************************//
* Image1.Canvas.TextOut(0,0,Edit1.Text);
* Bitmap := TBitmap.create;
*
* //**** Bitmap := Le contenu de l'Image1***//
*
* Bitmap.Assign(Image1.Picture);
* // Bloc Try ***** Finaly **//
* try
* Bitmap.Height := Image1.Height ;
* Bitmap.Width := Image1.Width ;
* // Scan l'Image (X,Y [Height et Width]) **
* for Y := 0 to Bitmap.Height-1 do
* begin
* P := Bitmap.ScanLine[Y];
* for X := 0 to Bitmap.Width-1 do
* P[Y] := X;
* end;
* // Deux Boucles Pour Extraire la Couleur Diff de Blache
* For Z:=0 To Bitmap.Width -1 do
* Begin
* For N:=0 To Bitmap.Height -1 do
* Begin
* If BItmap.Canvas.Pixels [Z,N]<>ClWhite Then
* Begin
* // Dessiner le Texte Sur le Canvas **//
* Canvas.Pixels [10+(Z*2),8+(N*2)]:= FLedOn;
* Canvas.Pixels [Succ(10+(Z*2)),Succ(8+(N*2))]:= FLedOn;
* end;
* end;
* end;
* finally
* //Liberer Espace Bitmap
* Bitmap.free;
* end;
* end;
* //*******************************************//
* //**** DESSIN DE LA GRILLE DES LEDS ****** //
* //******************************************//
* procedure TForm1.FormDblClick(Sender: TObject);
* begin
* Edit1.Enabled := True;
* Button1.Enabled := True;
* Fsize := 35;
* FledOff := ClGreen;
* FledOn := ClLime;
* FWidth := (SizeBorder*2)+(SizeLetter*Fsize);
* Cadre.Left := 0;
* Cadre.Top :=0;
* Cadre.Right := Fwidth;
* Cadre.Bottom := HeightComponent;
* Canvas.Brush.Color := ClBlack;
* Canvas.Pen.Color := ClGreen;
* frame3D(Canvas,Cadre,ClBlack,ClBlack,1);
* frame3D(Canvas,Cadre,ClWhite,ClBtnShadow,3);
* frame3D(Canvas,Cadre,ClBtnFace,ClBtnFace,3);
* frame3D(Canvas,Cadre,ClBtnShadow,Clwhite,2);
* canvas.FillRect(cadre);
* Cadre1.Left := sizeborder;
* Cadre1.Top :=sizeborder;
* Cadre1.Right := FWidth-sizeborder;
* Cadre1.Bottom := HeightComponent-sizeborder;
* Canvas.Brush.Color := ClBlack;
* Canvas.Pen.Color := ClBlack;
* Canvas.FillRect(Cadre1);
* For Letter:= 0 To FSize-1 Do
* for A := 0 to 05 do
* for line := 0 to 6 do
* begin
* canvas.Pixels [(sizeborder+(Letter*SizeLetter)+(A*3)),SizeBorder+(Line*3)]:= FledOff;
* canvas.Pixels [ Succ(sizeborder) +(letter*SizeLetter)+(A*3),Succ(SizeBorder)+(Line*3)]:= FledOff;
* end;
* end;
*
* end.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons, MarqueeLed, ExtDlgs;
Const
sizeLetter =18;
HeightLetter =28;
SizeBorder =11;
HeightComponent =42;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Image1: TImage;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormDblClick(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }

end;

var
Form1: TForm1;
Bitmap:TBitmap;
P: PbyteArray;
X,Y,FWidth,Fsize,Z,N : Integer;
FledOff,FLEDOn : TCOLOR;
Cadre,Cadre1:TRECT;
Letter,Line,A:Word;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture := Nil;

//*************************************//
// ** Exportation du Text vers Image**//
//************************************//
Image1.Canvas.TextOut(0,0,Edit1.Text);
Bitmap := TBitmap.create;

//**** Bitmap := Le contenu de l'Image1***//

Bitmap.Assign(Image1.Picture);
// Bloc Try ***** Finaly **//
try
Bitmap.Height := Image1.Height ;
Bitmap.Width := Image1.Width ;
// Scan l'Image (X,Y [Height et Width]) **
for Y := 0 to Bitmap.Height-1 do
begin
P := Bitmap.ScanLine[Y];
for X := 0 to Bitmap.Width-1 do
P[Y] := X;
end;
// Deux Boucles Pour Extraire la Couleur Diff de Blache
For Z:=0 To Bitmap.Width -1 do
Begin
For N:=0 To Bitmap.Height -1 do
Begin
If BItmap.Canvas.Pixels [Z,N]<>ClWhite Then
Begin
// Dessiner le Texte Sur le Canvas **//
Canvas.Pixels [10+(Z*2),8+(N*2)]:= FLedOn;
Canvas.Pixels [Succ(10+(Z*2)),Succ(8+(N*2))]:= FLedOn;
end;
end;
end;
finally
//Liberer Espace Bitmap
Bitmap.free;
end;
end;
//*******************************************//
//**** DESSIN DE LA GRILLE DES LEDS ****** //
//******************************************//
procedure TForm1.FormDblClick(Sender: TObject);
begin
Edit1.Enabled := True;
Button1.Enabled := True;
Fsize := 35;
FledOff := ClGreen;
FledOn := ClLime;
FWidth := (SizeBorder*2)+(SizeLetter*Fsize);
Cadre.Left := 0;
Cadre.Top :=0;
Cadre.Right := Fwidth;
Cadre.Bottom := HeightComponent;
Canvas.Brush.Color := ClBlack;
Canvas.Pen.Color := ClGreen;
frame3D(Canvas,Cadre,ClBlack,ClBlack,1);
frame3D(Canvas,Cadre,ClWhite,ClBtnShadow,3);
frame3D(Canvas,Cadre,ClBtnFace,ClBtnFace,3);
frame3D(Canvas,Cadre,ClBtnShadow,Clwhite,2);
canvas.FillRect(cadre);
Cadre1.Left := sizeborder;
Cadre1.Top :=sizeborder;
Cadre1.Right := FWidth-sizeborder;
Cadre1.Bottom := HeightComponent-sizeborder;
Canvas.Brush.Color := ClBlack;
Canvas.Pen.Color := ClBlack;
Canvas.FillRect(Cadre1);
For Letter:= 0 To FSize-1 Do
for A := 0 to 05 do
for line := 0 to 6 do
begin
canvas.Pixels [(sizeborder+(Letter*SizeLetter)+(A*3)),SizeBorder+(Line*3)]:= FledOff;
canvas.Pixels [ Succ(sizeborder) +(letter*SizeLetter)+(A*3),Succ(SizeBorder)+(Line*3)]:= FledOff;
end;
end;

end.

11 réponses

cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
12 avril 2010 à 13:54
Bj
Qu'elle dimension ta matrice de Leds?
Jean_Jean
0
zwail1 Messages postés 17 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 3 décembre 2010
13 avril 2010 à 19:17
alors salut Jean_Jean, j'ai dû modifier le code définitivement, en fonction de ce que je rencontre, alors j'ai fait extraire des 1 et des 0 a partir des couleurs de l'image texte ===> si la couleur est blanche le memo recevra le chiffre 0 sinon il recevra le chiffre 1
comme-ça j'aurai des lignes de 1 et de 0 qui me donneront un aperçu de l'image. alors j'ai modifié le programme comme suit:

var
Form1: TForm1;
Bitmap:TBitmap;
P: PbyteArray;
FledOff,FLEDOn,FLED : TCOLOR;
Cadre,Cadre1:TRECT;
S: String;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var
X,Y,Z,N,K,Line : INTEGER;
begin
FLEDOn := ClLime;
FLEDOFF := ClGray;
Image1.Picture := Nil;
S:= '';
MEMO1.Lines.Clear ;
Image1.Canvas.TextOut(0,0,Edit1.Text) ;
Bitmap := TBitmap.create;
try
Bitmap.Height := Image1.Height -1 ;
Bitmap.Width := Image1.Width ;
Bitmap.Assign(Image1.Picture);
Bitmap.Canvas.Font.Name :='Tahoma';
Bitmap.Canvas.Font.Size :=5;
for Y := 0 to Bitmap.Height-1 do
Begin
P := Bitmap.ScanLine[Y];
for X := 0 to Bitmap.Width-1 do
P[Y] := X;
end;
For Z:=0 To Bitmap.Width -1 do
For N:=2 To (Bitmap.Height-11) do
Begin
FLED:= BItmap.Canvas.Pixels [Z,N];

// Extraire la Couleur Diff du Blanc // Image en 1 et 0
If FLED <> ClWHite Then
S := S +'1'
Else
S := S +'0';

// Chaque ligne du memo1 recevra une S (String) ayant length de 12

If Length(S) = 12 Then
Begin
Memo1.Lines.Add(S);
S := '';
end;
end;

finally
Bitmap.free;
end;
// une boucle pour effacer les 00 inutiles = plus de six (06) lignes de 00 effacer le reste des Memo.Lines

K:=0;
For Line := 0 To Memo1.Lines.Count -1 do
Begin
If Memo1.Lines[Line]='000000000000' Then
K:=K+1
else K := 0;
While (K = 6) And (Memo1.Lines[Line]='000000000000') do
Memo1.Lines.Delete(Line);
end;
end;

Pour la matrice des laids elle va avoir les dimensions de 12 Lignes en fonctions de la taille de la lettre 12 Pix, mais les colonnes je ne sais pas encore, peut-être pour la boucle de défilement je donnerai 100 Pix, pour que l'exécution ne soit pas lente? comme suit:

Var M,A : INTEGER;
begin
For M:= 30 to 130 do
For A := 10 To 22 do begin
Canvas.Pixels [M*4,A*4]:= FLedOff;
end;

end;

maintenant il me reste de faire le défilement des 1 et des 0 sur le canvas?

ex:
soit tbl un array of Integer
dont sont length(tbl,12)

> Tbl[0]:= le 1er Index de la 1 ere ligne
du memo1
Tbl[1]:= le 2eme Index de la 1 ere
ligne du memo1
.
.
.
Tbl[11]:= le 11eme Index de la 1 ere
ligne du memo1
Prog: Tbl[0]:= StrToInt(Copy(Memo1.Lines[0],0;1));
mais j'ai pas su comment exploiter ça? !!! Car j'ai 12 Index dans chaque ligne du memo(c'est pas un probleme avec une boucle de 0 à 11), mais le probleme c'est de concevoir un tableau de dimension [X,y] dont X:= 0..11 et Y:= Memo1.Lines.Count-1
et d'allumer les pixels du canvas en fonction des 0 et des 1, je ne veux pas faire du défilement en copiant des cadres. merci de votre intention.

Amicalement
0
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
13 avril 2010 à 20:28
bj zwail1
Le fait de passer par un mémo me semble une mauvaise idée! C'est trop lent et troP de code pour si peu.
Il vaudrait mieux que tu travaille DIRECTEMENT à partir de ton tableau de bits!
Où tu veux en venir avec ce code. Il ne fait que recopier ton texte saisi dans le Edit en Image. Traduire du texte en image, c'est ton but?
Bonne prog
Jean_Jean
0
zwail1 Messages postés 17 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 3 décembre 2010
13 avril 2010 à 21:08
merci jean_jean de ta réponse
avec ce code la, je veux défiler un texte sur des un tableau de leds, mais je ne veux pas défiler directement le texte, je veux défiler l'image du texte, qlq soit les caractères écris de X langue même du chinois ou hindous, je veux avoir ce défilement, sans passer par la méthode des ASCII des caractères
c'est pour cela j'ai fais convertir le texte en image, puis faire la différence entre le blanc et une autre couleur (blanc=0 sinon =1), et l'image de défilement sera conçue a partir des 1 et des 0 (Bytes), alors si j'envoi un 1 la led correspondante s'allume, sinon elle reste éteinte, en ce qui concerne le memo, il n'est qu'une phase pour que je puisse voir le résultat devant moi, et que je vais remplacer par un TString sans forcement l'afficher sur l'écran

Amicalement
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
13 avril 2010 à 23:43
Donc si j'ai bien compris, ton tableau de led, c'est en fait ton image, c'est-à-dire ton tableau de pixels.
Evidamment faire un scanline à chaque fois serait peut-être long bien que ta matrice est très petite.
Où alors, il faut que tu copies ta nouvelle image (caractère illuminé décalé) soit en fait un deuxième bitmap. Puis tu affiche ton 2ème bitmap avec une tempo courte pour l'effet.
Jean_Jean
0
zwail1 Messages postés 17 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 3 décembre 2010
16 avril 2010 à 21:59
excuse pour mon retard, j'étais en mission de travail de deux (02) Jours

OK, j'ai réussi le défilement, dont j'ai fait un tableau multidimensionnel array of array of Integer, et j'ai changé complétement le code comme suit:(un bouton et un timer)


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons, ExtDlgs, Spin;
Const
FLedOn =ClLIme;
FledOff=ClGray;
type
TForm1 = class(TForm)
SEND: TButton;
Image1: TImage;
Memo1: TMemo;
Timer1: TTimer;
Label1: TLabel;
Edit2: TEdit;
UpDown1: TUpDown;
Edit1: TEdit;
procedure SENDClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure Timer1Timer(Sender: TObject);

private
{ Déclarations privées }

public
{ Déclarations publiques }

end;

var
Form1: TForm1;
Bitmap:TBitmap;
P: PbyteArray;
FLED : TCOLOR;
Cadre,Cadre1:TRECT;
S: String;
D:Integer;
Tbl: Array Of Array of Integer;
implementation

{$R *.dfm}

procedure TForm1.SENDClick(Sender: TObject);
Var
X,Y,Z,N,K,Line : INTEGER;
begin
Bitmap := TBitmap.create;
Image1.Picture := Nil;
S:= '';
Image1.Width := (Length(Edit1.Text)*5)+1;
MEMO1.Lines.Clear ;
Image1.Canvas.TextOut(0,0,Edit1.Text) ;
try
Bitmap.Height := Image1.Height -1 ;
Bitmap.Width := Image1.Width ;
Bitmap.Assign(Image1.Picture);
Bitmap.Canvas.Font.Name :='Tahoma';
Bitmap.Canvas.Font.Size :=5;
for Y := 0 to Bitmap.Height-1 do
Begin
P := Bitmap.ScanLine[Y];
for X := 0 to Bitmap.Width-1 do
P[Y] := X;
end;
For Z:=0 To Bitmap.Width -1 do
For N:=2 To (Bitmap.Height-11) do
Begin
FLED:= BItmap.Canvas.Pixels [Z,N];
If FLED <> ClWHite Then
S := S +'1'
Else
S := S +'0';
If Length(S) = 12 Then
Begin
Memo1.Lines.Add(S);
S := '';
end;
end;
finally
Bitmap.free;
end;
K:=0;
For Line := 0 To Memo1.Lines.Count -1 do
Begin
If Memo1.Lines[Line]='000000000000' Then
K:=K+1
else K := 0;
While (K = 6) And (Memo1.Lines[Line]='000000000000') do
Memo1.Lines.Delete(Line);
end;
Timer1.Enabled := True;
end;





procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text :='Tapez Votre Journal ici !';
D:=0;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
Timer1.Enabled := False;
Memo1.Clear;
S:= '';
end;


procedure TForm1.Timer1Timer(Sender: TObject);
Var H,J,F : Integer;
begin
While D<J Do Begin
For J:= 1 To Memo1.Lines.Count -1 do
begin
For H := 0 to 11 do
Begin
SetLength(Tbl,Memo1.Lines.Count,12);
If Memo1.Lines [J]<>'' Then
Begin
Tbl[J,H]:= StrToINT(Copy(Memo1.Lines[J],H,1));
F:= Tbl[J,H];
If F=0 Then
FLED:= FLedOff
else
FLED := FLEDON;
Canvas.Pixels[((1+J)-D)*5, (10+H)*5]:= FLED;
Canvas.Pixels[Succ(((1+J)-D)*5), Succ((10+H)*5)]:= FLED;
Canvas.Pixels[Succ(Succ(((1+J)-D)*5)), Succ(Succ((10+H)*5))]:= FLED;
Canvas.Pixels[((3+J)-D)*5, (10+H)*5]:= FLEDOFF;
Canvas.Pixels[Succ(((3+J)-D)*5), Succ((10+H)*5)]:= FLEDOFF;
Canvas.Pixels[Succ(Succ(((3+J)-D)*5)), Succ(Succ((10+H)*5))]:= FLEDOFF;
end ;
end;
end;
D:=D+2; end; If D >= J Then D:=0;
end;

end.

mais le problème est ke le défilement est soit très rapide ou très lent, en fontion de la taille du texte !

Amicalement
0
zwail1 Messages postés 17 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 3 décembre 2010
16 avril 2010 à 23:41
Remarque:

à propos de la Variable D: Integer;
elle est pour déterminer le nombre de colonnes à sauter durant le défilement de l'image

Amicalement
0
Utilisateur anonyme
17 avril 2010 à 12:03
zwail1 : t'es prié de pas emmerder les gens en MP pour qu'on t'aide à faire ton code ou que l'on te le corrige. Si tu as une question, tu vas sur le forum. Pas la peine de pourrir les bals des gens .
0
zwail1 Messages postés 17 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 3 décembre 2010
17 avril 2010 à 14:09
Amicalement
0
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
17 avril 2010 à 14:47
Tiens francky qui se fache!
@ zwail1
C'est vrai que tu gagnerais à poser une question précise soit en terme de méthodologie, soit sur un bout de code.
Ton code en ligne, c'est pas simple à lire. Et j'avoue que je n'ai pas bien compris ce que tu veux. Il faut dire que je passe très peu de temps en Delphi en ce moment...
J'ai tester ton code à un moment, à la limite, tu aurais pu en faire une publication modeste (il a son originalité). Tu aurais pu avoir des remarques de gens qui le testent. Bien sûr il faut accepter les critiques...
Bonne prog
Jean_Jean
0
zwail1 Messages postés 17 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 3 décembre 2010
17 avril 2010 à 15:07
A Jean_Jean (le sage), f0xi, Delphiprog et à Francky23012301(qui m’a rappelé à l’Ordre)

Excusez moi de vous avoir embêtés par mes MP, j’espère qu’une telle attitude ne ce reproduira plus de ma part.
Cela fait maintenant presque plus d’une semaine que je suis sur ce truc, et je vois que ça n’avance pas, je ne veux baisser les bras aussi facilement, mais je vois aussi que j’y arrive même pas à résoudre ce problème.

Voila ! sur ce topic vous trouverez toutes les étapes que j’ai fait de ma première vue conceptuelle jusqu’à présent, j’espère trouver quelqu’un qui a déjà passé par ces étapes, ou vous pouvez me guider vers un autre topic qui a déjà étudié cette difficulté.

Alors 1000 excuse de ma conduite aussi bête !

Jean-Jean, tu penses que je pourrai publier un code qui n’est pas acheminé ?
Pour les critiques, c’est normal tant que je veux apprendre
0
Rejoignez-nous