UNITE GRAPHIQUE IMOD, AVEC EXEMPLE

Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 - 27 août 2008 à 14:56
blueperfect Messages postés 234 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 21 novembre 2013 - 31 déc. 2009 à 18:20
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/47775-unite-graphique-imod-avec-exemple

blueperfect Messages postés 234 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 21 novembre 2013
31 déc. 2009 à 18:20
>>moyen de connaître le type du fichier (si c'est un fichier graphique)
GraphicsEx.pas ?
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
17 sept. 2008 à 13:17
Ouais je sais il faudrait trouver un moyen de connaître le type du fichier (si c'est un fichier graphique) avant de l'ouvrir, pour éviter les exceptions ...

Cordialement, Bacterius !

PS : je finirai la fonction du cosmos après mes devoirs maison ^^
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
17 sept. 2008 à 10:13
Salut , bon j'ai telecharge ta source (ici et sur ton site) ,
première remarque , il manque ImageAndMore , je le vire ca marche ...
deuxieme : if (ExtractFileExt(OpenDialog.FileName) '.jpg') or (ExtractFileExt(OpenDialog.FileName) '.jpeg') then

je te laisse deviné ce qui se passe quand un fichier s'appelle monImage.JPG ...

voila , je teste maintenant
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
30 août 2008 à 23:15
Bonsoir,
je ferai cela dès que possible, car je vais déménager à Paris ;) je vais regarder les fonctions dès que j'aurai déménagé (dernier accès à internet jusqu'à [undefined])

Cordialement, Bacterius !
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
30 août 2008 à 21:33
2) J'ai remplacé "case (Y and $1) of" par "case (Y or $1) of" pour obtenir un vrai effet de vision nocturne. Avec le and, le noir devient du blanc, et le blanc du noir, maintenant c'est le contraire.

le (Y and $1) permet de savoir si on travail sur une ligne pair ou impair.
donc
1 (0001) & 1 = case 1
2 (0010) & 1 = case 0
3 (0011) & 1 = case 1
4 (0100) & 1 = case 0
5 (0101) & 1 = case 1
...

en faisant OR tu fait :
1 (0001) + 1 = case 1
2 (0010) + 1 = case 1
3 (0011) + 1 = case 1
4 (0100) + 1 = case 1
5 (0101) + 1 = case 1
...

en gros le case ne sert plus a rien puisque seul la ligne
pPix^[1] := COEF[not pPix^[1]];
est prise en compte.

donc la fonction se reduit a :
pPix^[1] := COEF[not pPix^[1]];
pPix^[0] := COEF[pPix^[1]];
pPix^[2] := COEF[pPix^[1]];
inc(pPix);

ce qui au passage fait sauter l'effet de Scanline. donc tu foire l'effet NV.

3) J'ai protégé le code avec un try..finally

tu n'aurais pas besoin de faire autant de Try Finally (inutile) si tu avais structuré tes fonction correctement :

procedure {bitmap filter}(src, dest: TBitmap; const {args}:{type});

4) J'ai modifié un peu les paramètres et le contour du code pour ne pas trop la faire différente des autres.

Regarde comment mes fonction graphique sont faite. le type ByteQuad me permet de me passer des fonction GetR, GetG etc, cela permet de ne pas avoir de Call dans les filtres ce qui donne de meilleur performances!
de plus ByteQuad permet de travailler aussi bien en RGB qu'en RGBA, ABGR, GRBA, GRB, BGR, etc...
en mode normal l'ordre est :
0 -> blue
1 -> green
2 -> red
3 -> alpha, draw context, reserved/ignored

d'ou le pPix^[1], pPix^[2], pPix^[0] dans mes algo bitmap.

c'est la meilleure methode en pure delphi que j'ai trouvé avec l'aide de florenth.
blueperfect Messages postés 234 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 21 novembre 2013
29 août 2008 à 18:48
En fait le blc try/except qui permets de gérer les exceptions, implique un code compilé dit "lourd", meme si à la lecture du source, cela est lisible....ce code sera exécuté moins rapidement qu'une bonne batterie de if/then...

Les limites de 0 à 255 :

class function TLight.Color( const _red:TReal;
const _green:TReal;
const _blue:TReal
):TColor;

begin
Result := TColor( Windows.RGB( System.Round(_red) mod 256,
System.Round(_green) mod 256,
System.Round(_blue) mod 256
)
);
end;

Le scanline :

class function TPixels.Belongs( _object:TBitmap;
const _point:TPoint
):Boolean;

begin
Result := Assigned(_object)
and (_point.x >=0)
and (_point.y >=0)
and (_point.x < _object.Width)
and (_point.y < _object.Height);
end;

Avec ces deux fonctions au lieu du try/except, tu fais bombarder ton appli à base de scanlines...
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
29 août 2008 à 18:35
Et si tu parles des "debordements" en parlant des dépassements de limites des byte (supérieur à 255, inferieur à 0), les try..except ne sont pas la pour ça (ils sont là pour éviter une erreur concernant les scanline).

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
29 août 2008 à 18:34
Sans vouloir te vexer, je n'ai absolument rien compris.
Pourrais-tu me donner un exemple sur une fonction basique, ou mieux expliquer ton truc ?

Cordialement, Bacterius !
blueperfect Messages postés 234 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 21 novembre 2013
29 août 2008 à 18:00
Sans vouloir t'apprendre :

tu devrais éviter les try et except, le code compilé devient lourd... Pour les tests : OK, mais si tu as des débordements, place les tests de limmites, ils prendront moins de temps CPU que le try/except et seront plus efficaces....
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
29 août 2008 à 14:20
Bon voilà !
Effet vision nocturne, l'algorithme vient d'un snippet de f0xi (http://www.codyx.org/snippet_effets-night-vision-sur-bitmap_646.aspx)

Mais je l'ai un peu retouché à mes besoins :

1) J'ai modifié le titre (XRay) en plus explicite (Night_Vision).

2) J'ai remplacé "case (Y and $1) of" par "case (Y or $1) of" pour obtenir un vrai effet de vision nocturne. Avec le and, le noir devient du blanc, et le blanc du noir, maintenant c'est le contraire.

3) J'ai protégé le code avec un try..finally

4) J'ai modifié un peu les paramètres et le contour du code pour ne pas trop la faire différente des autres.

Merci f0xi ;)

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
29 août 2008 à 13:40
Ouais je vais m'y interesser ... dès que j'ai réussi à coder l'effet X-Ray ... j'ai compris le principe mais j'arrive pas à l'appliquer, quand c'est très blanc on laisse blanc, quand c'est très noir on laisse noir, quand c'est entre les 2 on applique un filtre vert ... mais j'y arrive pas lol.
C'est bien le tangram, il paraît que c'est un empereur chinois qui admirait un carreau, il le fait tomber, et essaye de le reconstruire mais il n'y arrive jamais :)

Cordialement, Bacterius !
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
29 août 2008 à 13:30
Le tangram est un fabuleux jeu chinois très ancien qui avec un minimum de pièces (7) permet la création de puzzles ou la réalisation de toute une série de figures suggestives.
L'idée n'est pas de refaire le jeu en delphi qui existe déjà et de repomper les codes existants, mais plutôt d'enrichir ce jeu par l'ajonction de pièces supplémentaires permettant de faire de faire des figures plus riches : tangram (11)
Avec un peu d'imagination, il serait possible de faire des caricatures des avatars de CS.
soit en puzzle à reconstituer
soit à créer

on pourrait en suite faire un concours sur une caricature..

etc etc etc etc..

Bref, une façon de s'amuser un peu et aussi d'offrir un beau sujet de codage à un jeune lion comme Bacterius.
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
29 août 2008 à 12:40
En fait, je souffle presque tout le temps ^^
Je réflechis 10 minutes à comment faire quand je suis bloqué, en jouant sur la console, et dès que j'ai trouvé je code, et puis on se répète ^^
J'ai regardé le jeu de tangram, il faut faire une figure précise à partir de petits polygones c'est ça ?

Cordialement, Bacterius !
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
29 août 2008 à 12:09
Excellent.
Mais cela dit souffle un peu quand même
de temps en temps..
patience, je te confierai d'autres idées de programme..
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
29 août 2008 à 12:01
Bon voilà, j'ai enlevé les DoubleBuffered.

Maintenant je regarde le Tangram (et continuant de réparer les bugs ici si jamais il y en a, et eventuellement ajouter des fonctions).

Ah non d'abord l'effet XRay, et ensuite je regarde le tangram.

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
29 août 2008 à 11:51
Non j'ai pas commencé le tangram j'essaye de comprendre le fonctionnement du jeu, et je dois aussi enlever les doublebuffered.
Sinon pour le renommage des fiches, je mettrai un F devant pour mes prochaines sources, car ici je pense que c'est assez compréhensible, il y a "Form" dans chaque nom de fiche, et les renommer ... voilà ...

Cordialement, Bacterius !
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
29 août 2008 à 11:32
Salut Bacterius,
et le tangram ?
déjà fini ! Whaaaououou...incroyable..
plus rapide que Bacterius tu..
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
29 août 2008 à 02:37
"J'adapterai l'effet demain"

Sous entendu : Demain, j'adapterai l'effet "x-ray"

Cordialement, Bacterius !
blueperfect Messages postés 234 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 21 novembre 2013
29 août 2008 à 02:26
l"effet demain" .... je ne connaissais pas !

lol
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
29 août 2008 à 00:00
Ah non je l'ai pas :/
Moi j'ai l'effet nuit (qui fait comme si c'était la nuit, bleu et noir).
J'adapterai l'effet demain.
Pour le moment je regarde les effets fractaux de ElectricSheep ^^

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
28 août 2008 à 23:59
"image en vert et noir blanc " repete moi ça pour voir ^^
je vais regarder l'image, et je t'engage à regarder mon ocde, il pourra peut-être te servir !

Cordialement, Bacterius !
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
28 août 2008 à 23:38
A je ne sais pas , je n'ai fait que regarder le X-ray ; je n'ai pas regardé à ton code ... si tu veux savoir ce que ca fait , ca te fait ton image en vert et noir blanc ...
http://upload.wikimedia.org/wikipedia/commons/a/a1/Night_vision.jpg

ben si tu l'as deja , autant pour moi ^^
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
28 août 2008 à 23:32
"snippet_effets-night-vision-sur-bitmap_646.aspx"

J'ai déjà mis une option Effet Nuit ... mais peut-être que le snippet ne correspond pas à ca ...

Cordialement, Bacterius !
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
28 août 2008 à 23:29
" Si ça t'interresse, je te livre l'algorythme des rayons X (les fameux X-rays de Ghost Recon) ! "

http://www.codyx.org/snippet_effets-night-vision-sur-bitmap_646.aspx

Pas besoin , ca existe deja ...
blueperfect Messages postés 234 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 21 novembre 2013
28 août 2008 à 19:28
Si ça t'interresse, je te livre l'algorythme des rayons X (les fameux X-rays de Ghost Recon) !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
28 août 2008 à 15:44
Bon, rien ...

Cordialement, Bacterius !
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
28 août 2008 à 15:39
c'est donc une animation..
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
28 août 2008 à 15:36
Bien, je vais les enlever ... je ne pourrais pas en garder 1 pour la toolbar de la fiche principale ? Sinon les boutons clignotent quand on passe dessus, car il y a des images dedans ?

Cordialement, Bacterius !
Utilisateur anonyme
28 août 2008 à 15:32
le DoubleBuffered n'est utile que si l'application doit rafraichir l'affichage très souvent ... Ex. une animation

mais dans ton cas ce n'est pas utile ... c'est une consommation supplémentaire de ressources pour rien !!!
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
28 août 2008 à 15:12
okok

Cordialement, Bacterius !
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
28 août 2008 à 15:10
F risque d'interférer avec les propriétés des composants.

réponse NON
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
28 août 2008 à 14:51
Tu ne penses qu'à ça BluePerfect xD
Je vais essayer d'implémenter cette fonction.

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
28 août 2008 à 14:50
Donc en fait, il n'y a pas besoin de mettre en doublebuffered la fiche, seulement les panneaux et les groupbox ?

Sinon pour le nom des formes, des identifiants comme cela peuvent être bien, mais le F risque d'interférer avec les propriétés des composants (j'ai lu que par convention il fallait mettre la propriété avec un F devant ...).
Et pour le nom de l'appli, en fait ce n'est pas son nom, c'est IMod ^^, mais je vais faire comme cela ...

Pour la surconsommation du doublebuffered, excuse-moi, je vais essayer de me contrôler mais j'en raffole ^^

Cordialement, Bacterius !
blueperfect Messages postés 234 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 21 novembre 2013
28 août 2008 à 14:47
Une idée :

La lampe torche : tu indiques un rayon, et tu peints le tout en noir, n'éclairant que sur un cercle...
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
28 août 2008 à 14:35
Tu fais une surconsommation du doublebuffered := true;
il y en a beaucoup de trop !
il suffit pas exemple de supprimer le premier dans le create de TBollOpForm pour supprimer le phénomène d'écran noir.

Efforce toi aussi de nommer tes formes par FquelqueChose et l'unité correspondante sans le F.
Conserve également le nom de baptême de ton appli en supprimant le 'exe' à la fin.

bon courage
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
28 août 2008 à 14:07
Voila, annihilation totale du composant, je l'ai enlevé de la clause USES.

Cordialement, Bacterius !
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
28 août 2008 à 14:02
il faut tester ton zip en le dézippant dans un autre dossier..

tu as laissé le nom du composant "ImageAndMore" et delphi le cherche..
mais sur ton poste, il existe et du coup
ca marche encore chez toi.

- 2 sur la note !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
28 août 2008 à 13:59
Voila Cirec suite à ta remarque j'ai mis en try...finally toutes les fonctions :)

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
28 août 2008 à 13:45
Mais dis moi : il n'y aura jamais d'erreur pendant la création d'un bitmap ?
Bmp := TBitmap.Create; // Enclin à déclencher une exception ?

Peut-être OutOfMemory ? M'enfin faut quand même le faire ^^

Cordialement, Bacterius !
Utilisateur anonyme
28 août 2008 à 13:40
ah oui c'est mieux comme ça ... enfin c'est mon avis

mais utilise des Bloc "Try Finally End" pour sécuriser les créations des Bitmap dans tes procédures et Fonctions parce que dans l'état actuel des choses si une erreur survient dans le traitement le Bitmap ne sera jamais libéré alors qu'avec un Bloc Try Finally il le sera à tous les coups. ;)
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
28 août 2008 à 13:25
Bon allez voilà, le tout transformé en unité (IMod.pas), normalement tout est lié vous avez juste à ouvrir le projet et à compiler, j'ai testé, tout passe bien.

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
28 août 2008 à 13:03
Ah oui il n'est libéré que si on clique sur Quitter, mais je pense l'avoir corrigé dans la version là maintenant, car elle est libérée dans le OnClose de la fiche.

Sinon oui une unité avec toutes ces fonctions serait peut-être une meilleure idée ... :)

Cordialement, Bacterius !
Utilisateur anonyme
28 août 2008 à 12:58
Salut,

il n'y a pas que scanline dans la vie ... hein ^^
tu pouvais faire certaines opérations avec d'autres méthodes ... je pense notamment aux rotations par bloc (PlgBlt) à l'inversion de couleurs

Je suis aussi du même avis que Cantador ... à savoir que la création d'un composant n'était pas utile voir même pénalisant !!!

à ta place j'aurai opté pour une unité regroupant toutes les procédures et fonctions de traitement de l'image ce qui permettrait une utilisation en dehors d'un TImage

Les options d'affichage de l'image (Center, Stretch, proportional etc) sont cumulatives ce qui n'est plus le cas chez toi !

et le plus important :
---------------------------
Unexpected Memory Leak
---------------------------
An unexpected memory leak has occurred. The unexpected small block leaks are:

53 - 60 bytes: TBitmap x 1

109 - 116 bytes: TBitmapImage x 1

Il ne faut pas oublier de liberer les objets que l'on crée !!!
BackupImg n'est pas libéré à la fin !!!!!!!
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
28 août 2008 à 12:06
je connais pas le tangram7 ... je vais me renseigner.

Cordialement, Bacterius !
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
28 août 2008 à 12:01
conseil : teste bien tout avant de reposter.

sujet de jeu que j'avais commencé mais faute de temps :
faire un tangram11 c'est-à-dire prolonger les directions des pièces du tangram7 et faire un carré un peu plus grand.
Le reste, choix des pièces, rotation, inversion,
liste de figures (caricature des avatars), test des pièces choisies etc etc..
quelque chose d'amusant et de passionnant à la fois..
je peux de donner le début de mon code par MP si tu le souhaites.
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 23:06
Bon voilà, j'ai mis la version corrigée du composant.
En fait je corrigeais constamment sur la version "a publier" du composant, et donc le composant original (celui dans les repertoires Delphi) n'était jamais modifié ...
Le composant est corrigé, je vais voir de ce pas si il n'y a pas de problème dans la démo ...

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 22:51
Ah mince !
C'est vrai !
J'ai remplacé par TRGBQuad.
Bon alors fait un remplacement global :

rgbtRed en rgbRed
rgbtGreen en rgbGreen
rgbtBlue en rgbBlue

Voilà

Cordialement, Bacterius !
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
27 août 2008 à 22:49
non c'est le rgbtRed qui coince..
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 22:48
Ou alors, pour t'eviter de tout réécrire, crées dans le composant une fonction InRange :

function InRange(AMin, AMax, AValue): Boolean;
begin
Result := (AValue in [AMin..AMax]);
end;

Ou un truc dans ce genre, je n'ai pas testé sous Delphi ...

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 22:47
Tu ne reconnais pas InRange ?
Utilise alors :

if (P[Y].rgbtRed in [R - Tolerance, R + Tolerance]) then ...

Je modifierai toutes les routines de cette façon car je crois que le InRange n'est pas reconnu par tous les Delphis, mais que la technique in [] l'est.

Cordialement, Bacterius !
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
27 août 2008 à 22:40
plantage à l'install sur :

if (InRange(P[Y].rgbtRed,R - Tolerance,R + Tolerance))
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 22:23
En tout cas mon composant va sûrement bien me servir pour mes prochains jeux ;)

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 22:22
xD (erf mon navigateur bug)

Cordialement, Bacterius !
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
27 août 2008 à 22:19
une petite mémoire d'annulation des coups (pour revenir jusqu'a 10 fois en arrière !

pendant un instant, je me suis cru au solitaire
ou à reversi ! (lol)
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 22:13
Bon voilà un petit ajout vite fait de la démo : une petite mémoire d'annulation des coups (pour revenir jusqu'a 10 fois en arrière ! mais il suffit de changer l'étendue de l'array pour en avoir plus). Les routines de gestion de la mémoire sont tout en haut de l'unité Main ;)
J'ai fait cet ajout car j'en avais assez de devoir réouvrir l'image quand j'avais fait plus de 2 changements lol.

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 19:48
Boh ce n'est pas bien grave ... après tout ...
Sinon pour l'image PNG, je ne sais pas si c'est une bonne idée de mêler la PNGLib à cette source ... mais je pourrais faire des trucs interessants avec la transparence ;) comme par exemple un effet de brume, avec un bitmap 32 bits (celui de la brume) qui vient s'appliquer délicatement sur le bitmap destination, en appliquant la transparence, et les photomasques (voir photofiltre, photoshop) lol.

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 19:33
Bon voilà c'est corrigé ;)
Je réflechis à quoi faire avec rgbtReserved (lol)

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 19:29
Lol structure du TRGBQuad :

rgbtBlue, rgbtGreen, rgbtRed: Byte;
rgbtReserved: Byte;

Lol à croire que Windows a oublié de mettre à jour depuis 98 !

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 19:27
Pas bête le TRGBQuad ... ça ne nécessite que de changer un seul truc dans le code (dans les types) et je pourrais trouver des routines pour la gestion du byte Alpha ?)

Cordialement, Bacterius !
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
27 août 2008 à 19:25
Le fait d'avoir passer tes bitmaps en pf32bits, il faudrait plutôt employé TRGBQuad !! (Pour pouvoir un jour exploiter le dernier byte en canal Alpha...)

Cordialement.
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 19:19
Oui, je ne faisais que le remarquer. ^^
En revanche un type Integer est requis pour les calculs (ou bien une routine genre IntToByte pour eviter 6 lignes de "clamp". Je vais peut-être en faire une dans le composant ...
Sinon c'est cool pour le flou, j'étais parti pour faire une pixellisation et je suis tombé sur un flou (j'arrivais pas à le faire) en fait c'est simple.

Cordialement, Bacterius !
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
27 août 2008 à 19:16
Tu ne peux pas dépasser les limites, puisque tu ne fais qu'échanger les composantes dans les fonctions que j'ai précédemment citées. Je n'ai pas parlé des fonctions qui nécessitaient des calculs.

Cordialement.
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 19:11
"le test du "clamp" peut être supprimé si tu déclares les variables R, G, B de type BYTE." oui mais attention : si tu les appelles de type Byte et que tu dépasses les limites, Delphi, pour ne pas être coincé, passera automatiquement à l'endroit ou il pourra continuer.

Par exemple, 255 + 1 = 0
0 - 1 = 255

Cela entraîne des artéfacts plus que regrettables sur une image (pixels totalement rouges, verts ...) je crois que l'on appelle cela de la poussière.

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 19:10
Et voilà, les bugs signalés par WhiteHippo sont corrigés, (oui oui aussi le pixelformat, j'ai tout mis en pf32Bit en attendant mieux, au moins on ne perdra aucune information).
Mais si l'on s'adapte au format initial du bitmap, si jamais il est en 8 bits (256 couleurs), j'ai peur qu'il n'y ait beaucoup de bugs sur ScanLine :/
J'essaye de faire une documentation présentable.
Vous me direz certainement <oh il prend ça trop au serieux> mais moi je trouve que c'est toujours une bonne source d'enseignement, et c'est toujours bien une doc ;)

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 19:04
"Faire un composant c'est répondre à un besoin et offrir un outil nouveau et portable.
Ce dernier doit être compatible avec la plupart des versions de delphi et des systèmes d'exploitation et être accompagné d'une doc"

Hmm outil nouveau ... pas vraiment lol ... sinon portable c'est juste une image ...
Il est compatible avec toutes les versions de Delphi (sauf la 1 et la 2, pour ScanLine).

Et des systèmes d'exploitation je suppose que il peut tourner sur tous les Windows (peut être pas 95, ni 98).

Et pour la doc, c'est vite fait ça !

Mais c'est vrai que l'utilité de cette source en tant que composant est plus que douteuse ...

Cordialement, Bacterius !
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
27 août 2008 à 18:57
Faire un composant c'est répondre à un besoin et offrir un outil nouveau et portable.
Ce dernier doit être compatible avec la plupart des versions de delphi et des systèmes d'exploitation et être accompagné d'une doc.

Ce n'est pas facile du tout..
C'est la raison pour laquelle, je suis très circonspect lors de l'utilisation professionnelle des composants réalisés ici.

En revanche, ton source est riche d'enseignements et pour ca tu mérites un 8/10.

toujours un petit souci avec les écrans noirs..

Salut Bacterius et bon codage pour le suite
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 18:57
Ah oui je n'ai pas fait attention pour la limite (j'ai majoritairement fait du copier coller depuis ma première routine, et j'ai juste modifié le centre du code ... je vais arranger cela. Et je vérifierai tout également, car cela ne se situe pas forcement que dans les inversions permutatives (rho quel beau mot !).

Pour le format du bitmap, c'est vrai qu'avec un bitmap supérieur à 24 bits y'a des informations qui vont se faire écraser dans un "nil" béant ^^
Mais pourquoi ne pas vérifier si le bitmap original est en pf32bit ?
Ou bien tout simplement effectuer tous les traitements en 32 bits ? (c'est le format le plus grand de nos jours je pense). Ca ne ralentirait pas vraiment les calculs :p

"P.S. Quand j'aurais un peu plus de temps, je regarderais un peu plus précisemment le code (du composant et du projet)"
oh le code du projet est peu interessant en lui-même, il ne fait que de se servir des routines ^^

Merci pour ces remarques, je vais arranger tout ça.

Cordialement, Bacterius !
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
27 août 2008 à 18:49
Bonjour

En regardant rapidement le code du composant, j'ai 2 petites remarques.

Premièrement, dans les fonctions d'"inversion" comme tu les appelles ( BGR, RBG, GBR, GRB ) le test du "clamp" peut être supprimé si tu déclares les variables R, G, B de type BYTE.

B := P[Y].rgbtRed;
G := P[Y].rgbtGreen; // On se contente de permuter
R := P[Y].rgbtBlue;
// début clamp inutile
if R < 0 then R := 0;
if R > 255 then R := 255;
if G < 0 then G := 0;
if G > 255 then G := 255;
if B < 0 then B := 0;
if B > 255 then B := 255;
// Fin clamp inutile

P[Y].rgbtRed := R;
P[Y].rgbtGreen := G;
P[Y].rgbtBlue := B;

Deuxièmement, ton composant change le format du bitmap (SetPixelFormat(pf24Bit, Bmp);) ce qui n'est pas toujours souhaitable. Si tu avait un bitmap 32bits, tu perds obligatoirement des informations. Le mieux est quand même de s'adapter au format initial du bitmap.

P.S. Quand j'aurais un peu plus de temps, je regarderais un peu plus précisemment le code (du composant et du projet)

Cordialement.
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 18:43
Bon voilà, encore un bug (pas très méchant). Je n'avais affecté aucune action au bouton menu Seuil RGB. C'est réparé ;)

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 18:22
Oui c'est vrai, je me disais justement que faire un composant était peut-être inutile pour ceci ...
Mais voilà 2 raisons :

1) Je voulais absolument faire un composant pour ma prochaine source

2) Cela peut être utile pour la gestion de la sélection (un rectangle par composant), alors que sous forme d'unité, il aurait fallu créer un array de sélections, et c'est lourd à gérer.

Sinon qu'en penses-tu ?

Cordialement, Bacterius !
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
27 août 2008 à 18:01
Gros boulot, mais la création d'un composant se justifiait
elle ?
car celui-ci ne modifie aucune des propriétés et évènements de celui d'origine.
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 16:42
Petit bug dans les opérations booléennes (de l'exemple), l'image de prévisualisation n'était jamais affichée, et cela causait des problèmes d'indice hors limites en prime.
Mais c'est réparé.

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 août 2008 à 14:56
Codé sous Delphi 6 !

Cordialement, Bacterius !
Rejoignez-nous