ABCDEFGHIJKLMNOPQRSTUVWXYZ

cs_subzero Messages postés 71 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 24 février 2012 - 6 août 2003 à 03:44
cs_subzero Messages postés 71 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 24 février 2012 - 10 août 2003 à 22:28
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/12691-abcdefghijklmnopqrstuvwxyz

cs_subzero Messages postés 71 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 24 février 2012
10 août 2003 à 22:28
Salut!
J'ai trouvé une unité avec pleins de fonctions graphiques!
J'espère que ça te permettra d'évoluer dans ton projet, à+

Citation:
JanFX v.1.0 FWS 19 Kb 03.07.00 By Jan Verhoeven.
JanFX is a library of 89 bitmap transformation routines like: rotate; smooth resize; filters; make seamless; buttonize; color, focus and light effects; fisheye and twist distortions; alpha blending; plasma and many more.

http://homepages.borland.com/torry/vcl/graphics/effects/janfx.zip (19 ko)
cs_bgK Messages postés 131 Date d'inscription vendredi 7 juin 2002 Statut Membre Dernière intervention 19 janvier 2004
7 août 2003 à 09:13
Ce que je te suggère pour obtenir les composantes d'une couleur, c'est d'utiliser un record. Par exemple (pour des couleurs stockées sur 32bits) :
function Convert(Couleur: Cardinal) : TRGBQuad;
begin
Result := TRGBQuad(Couleur);
end;

TRGBQuad est défini dans windows.pas. En utilisant cette méthode, tu évite les opérations logiques.
Pour des couleurs 24 bits => utiliser TRGBTriple.
cs_subzero Messages postés 71 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 24 février 2012
7 août 2003 à 06:17
J'ai essayé ta méthode...
Par exemple dans une de mes sources, j'ai remplacé :
Result.h:=WRec(LRec( lin ).hi).hi;
Result.m:=WRec(LRec( lin).hi).lo;
Result.s:=WRec(LRec( lin ).lo).hi;
Result.t:=WRec(LRec( lin ).lo).lo;
par:
Result.h:=Byte( lin AND $FF000000);
Result.m:=Byte( lin AND $00FF0000);
Result.s:=Byte( lin AND $0000FF00);
Result.t:=Byte( lin AND $000000FF);
Et ça ne fonctionne pas! Ai-je fait une erreur?
cs_bgK Messages postés 131 Date d'inscription vendredi 7 juin 2002 Statut Membre Dernière intervention 19 janvier 2004
6 août 2003 à 12:24
Inversion : Il suffit de remplacer Ligne^[x] := Ligne^[x] and $00FF0000;
par Ligne^[x] := not Ligne^[x];
Couleurs primaires : remplacer Ligne^[x] := Ligne^[x] and $00FF0000;
par Ligne^[x] or $00FF0000; (déplacer le FF pour obtenir les autres couleurs)
Noir et blanc :
Remplacer :
- TRGBTripleArray = array[Word] of Cardinal;
par TRGBTripleArray = array[Word] of TRGBTriple;
- bmp.PixelFormat := pf32bit;
par bmp.PixelFormat := pf24bit;
- Ligne^[x] := Ligne^[x] and $00FF0000;
par
begin
Ligne^[x].rgbtRed := (Ligne^[x].rgbtRed + Ligne^[x].rgbtGreen + Ligne^[x].rgbtBlue) div 3;
Ligne^[x].rgbtGreen := Ligne^[x].rgbtRed;
Ligne^[x].rgbtBlue := Ligne^[x].rgbtRed;
end;

Pour le N&B avec luminosité, de même en intégrant la formule.

Je pense qu'en convertissant en asm, tu ne gagnerais pas enormément ...
cs_subzero Messages postés 71 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 24 février 2012
6 août 2003 à 12:09
Voilà une belle méthode!
Elle mérite d'être optimisé en Assembleur (à mon avis)!
Bravo, continuez comme ça... à+
Emandhal Messages postés 194 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 10 octobre 2006 3
6 août 2003 à 11:45
tu aurais pas un exemple ou les autres méthodes pour les filtres bgK? ca m'interesse...
cs_bgK Messages postés 131 Date d'inscription vendredi 7 juin 2002 Statut Membre Dernière intervention 19 janvier 2004
6 août 2003 à 11:11
Voiçi un exemple de code plus rapide :

procedure FiltreRouge(var bmp: TBitmap);
Type
TRGBTripleArray = array[Word] of Cardinal; // Type représentant une
PRGBTripleArray = ^TRGBTripleArray; // ligne de pixels
var
x,y: Integer;
Ligne: PRGBTripleArray;
begin
bmp.PixelFormat := pf32bit;
For y := 0 to bmp.Height - 1 do
begin
Ligne := bmp.ScanLine[y];
For x := 0 to bmp.Width - 1 do
Ligne^[x] := Ligne^[x] and $00FF0000; // On ne laisse que le rouge
end;
end;

Pourquoi est il plus rapide : Il utilise la méthode ScanLine, qui est 5 fois plus rapide que la méthode Pixels. Ensuite, il utilise une seule opération logique pour appliquer le filtre.

Pour ce qui est des autres filtres, il y a : (entre autres)
Inversion : Application de l'opérateur not à la couleur
Noir et blanc : Rn Gn Bn = (R+G+B)/3
Noir et blanc avec respect de la luminosité :
Rn=Gn=Bn=(R*0.3086+ G*0.6094+B*0.0820)
Pour avoir les couleurs primaires de peinture :
utiliser l'opérateur or
...
TheWhiteShadow Messages postés 135 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 7 avril 2006
6 août 2003 à 04:28
la luminosité je pense qu'il faut rajouter autant pour R, G et B (plus clair) et enlever a chacun autant pour foncer... je pense par deduction je garanti pas...

les 2 autres j'vois franchement pas, mais ouais ca peut se trouver sur des sites

sinon y'a aussi negatif....

ouais a+ v au pieu !
cs_subzero Messages postés 71 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 24 février 2012
6 août 2003 à 04:24
ok, ça roule!
Je te tiens au courant si je trouve les procédés...
Bonne continuation, à+
TheWhiteShadow Messages postés 135 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 7 avril 2006
6 août 2003 à 04:21
euh si j'avais une ptite idée de comment faire ptet...
et pour le test sur gros bitmap c envisageable mais pas ce soir :d
cs_subzero Messages postés 71 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 24 février 2012
6 août 2003 à 04:19
Ouais possible... J'aimagine qu'il faut traîter un gros bmp et mesurer le temps mis par les deux méthodes pour voir une différence...
Tu envisages de coder d'autres filtres? comme la luminosité, le contraste, convertion en niveaux de gris?
TheWhiteShadow Messages postés 135 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 7 avril 2006
6 août 2003 à 04:11
ben un pointeur je pense que c'est plus rapide... tu lis l'octet et paf, ta méthode il y a 2 lectures

enfin je sais pas, ptet que le temps d'augmenter mon pointeur tu m'as déjà dépassé... arf j'pense que c'est équivalent ;)
cs_subzero Messages postés 71 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 24 février 2012
6 août 2003 à 04:06
Faudrait voir si ma méthode est plus rapide...
Enfin choisir celle qui donne les meilleures performances, à+
TheWhiteShadow Messages postés 135 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 7 avril 2006
6 août 2003 à 03:57
oui effectivment c'est BGR, mais bon...
pour ce qui est du calcul, je trouve c'est cool en utilisant les octets de poids forts/faible ;)
cs_subzero Messages postés 71 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 24 février 2012
6 août 2003 à 03:44
Salut! Je me suis fait aussi un code pour décomposer une couleur.
Voici les sources de mon exemple à télécharger ici:
http://site.voila.fr/subut/data4/rgb.zip (3 ko)

Code:
TYPE TRGB=RECORD R,G,B:Byte;END;
LRec=RECORD Lo,Hi:Word;END;
WRec=RECORD Lo,Hi:Byte;END;

{----------------------------------------------------------------}
{ CONVERTION COLOR -> RGB }
{----------------------------------------------------------------}
FUNCTION GetRGB(Col:Longint):TRGB;
BEGIN
Result.R:=WRec(LRec(Col).Hi).Lo;
Result.G:=WRec(LRec(Col).Lo).Hi;
Result.B:=WRec(LRec(Col).Lo).Lo;
END;

{----------------------------------------------------------------}
{ CONVERTION RGB -> COLOR }
{----------------------------------------------------------------}
FUNCTION RGB(R,G,B:Byte):Longint;
BEGIN
Result:=(B*$10000)+(G*$100)+R;
END;

As-tu remarqué que c'est du BGR, et non pas du RGB?
Rejoignez-nous