Bonjour et meilleur voeux à tous et toutes,
Il y a quelqueS annéeS (sic), je programmais en amateur en Delphi (3 à 6).
J'essaye de m'y remettre avec Lazarus, dans un objectif multi-plateforme (Windows et Linux i386 et AMD64, voir Android sur smartphone)
En ce moment, je fais joujou avec du traitement d'image et je souhaite travailler sans librairie extérieure (genre BGRABitmap ou Vampyre) pour essayer de me garantir au maximum le multi-plateforme.
A la lecture de http://wiki.lazarus.freepascal.org/D..._with_Graphics,
je me suis orienté sur l'utilisation de TLazIntfImage.
La form a 2 TImage, un pour l'image d'origine, l'autre pour celle après retraitement.
Un exemple de retraitement est le suivant (conversion en niveau de gris):
Ce traitement prend 1,8s pour une image de 672x676 pixels sur un core i5 et passe à 3,8s sur un Atom. Je vous laisse imaginer dès que je prend une image plus grande.
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 function ConvertToGreyScale(Src: TLazIntfImage): TLazIntfImage; // Direct BGRA access var tmp: TLazIntfImage; lRawImage: TRawImage; X,Y: integer; LSrc, LDst: Pointer; R, G, B, A: byte; Grey: byte; begin tmp:= TLazIntfImage.Create(0,0); Src.GetRawImage(lRawImage); tmp.SetRawImage(lRawImage); for Y:= 0 to Src.Height - 1 do begin LSrc:= Src.GetDataLineStart(Y); LDst:= tmp.GetDataLineStart(Y); for X:= 0 to Src.Width - 1 do begin B:= PByte(LSrc)[X*4]; G:= PByte(LSrc)[X*4+1]; R:= PByte(LSrc)[X*4+2]; A:= PByte(LSrc)[X*4+3]; Grey:= trunc((0.299*R) + (0.587*G) + (0.114*B)); PByte(LDst)[X*4]:= Grey; PByte(LDst)[X*4+1]:= Grey; PByte(LDst)[X*4+2]:= Grey; PByte(LDst)[X*4+3]:= A; Application.ProcessMessages; end; end; end; Result:= tmp; end;
A la place des PByte, j'ai essayé avec des TFPColor ou des TRGBQuad (suite à vos échanges récent), sans avoir gagné en vitesse.
J'en conclus que je m'y prend mal ou que je n'ai pas fait le bon choix avec TLazIntfImage.
Avez-vous des suggestions, des pistes de recherches ?
Merci d'avance.
Jack.R
Partager