begin process at 2010 02 09 21:21:31
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > UNITE GRAPHIQUE IMOD, AVEC EXEMPLE

UNITE GRAPHIQUE IMOD, AVEC EXEMPLE


 Information sur la source

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Graphique Classé sous :graphique, scanline, bitmap, unité, image Niveau :Initié Date de création :27/08/2008 Date de mise à jour :29/08/2008 14:17:48 Vu / téléchargé :4 162 / 392

Auteur : Bacterius

Ecrire un message privé
Commentaire sur cette source (74)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Bonjour,

Voici une unité graphique, reprenant la plupart des opérations et des manipulations sur une image. C'est IMod.
J'ai fourni un exemple très complet (en fait, une application complète, je me suis un peu emporté), avec l'unité.
L'unité prend également en charge la sélection rectangulaire (juste rectangulaire pour le moment ...), mais vous pouvez dire à l'unité de ne pas prendre en compte cette sélection. L'exemple fourni ne prend pas en charge la sélection, car je n'ai pas réussi à l'intégrer correctement ^^' mais je le ferai dans la prochaine mise à jour.
Voici un résumé de ces capacités (par groupe).

Ajout/Otage de composantes RGB
Ajout/Otage de saturation
Ajout/Otage de luminosité
Différents types de flou
Binarisation/Pixellisation
Inversion simple
Inversions permutatives
Filtres
Seuils
Modification des valeurs RGB
Recherche d'une couleur
Remplacement d'une couleur
Reconstruction d'une couleur
Niveaux de gris
Précision des couleurs
...
Pas mal des routines au dessus sont fournies avec un paramètre de tolérance.

D'autres routines peuvent s'émuler à partir de plusieurs routines de base.
Par exemple, effet nuit :

Vous faites un filtre bleu (ce qui a pour effet de le laisser que la composante bleue), et vous enlevez 75 à 95 au bleu, et vous obtiendrez un joli effet nuit ! ;)

Ah ah j'ai oublié de vous dire la meilleure : LE TOUT AVEC SCANLINE !

Je sais qu'il existe une source sur DelphiFr, qui effectue des retouches d'image, mais tout est fait en Pixels[X, Y] et je voulais qu'un exemple avec ScanLine soit posté ici.

J'ai mis beaucoup de temps à rédiger, renommer les composants de l'exemple, coder, réflechir, commenter, les 1700 lignes de l'unité, et toutes les fiches de l'exemple, et j'espère que vous n'allez pas me jeter une pierre :]

J'inclus une capture de l'exemple, ainsi qu'une photo pour ceux qui n'auraient pas d'image sous la main.


 Conclusion

Tous remarques, commentaires, critiques, conseils ... sont les bienvenus.

Cordialement, Bacterius !

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

27 août 2008 16:40:39 :
// Petit bug dans les opérations booléennes
27 août 2008 18:42:43 :
// Aucune affectation sur Seuil RGB
27 août 2008 19:07:30 :
// Correction de certains problèmes signalés par WhiteHippo.
27 août 2008 19:32:52 :
// Utilisation de TRGBQuad plutôt que TRGBTriple
27 août 2008 22:10:20 :
// Ajout d'une mémoire d'annulation des coups
27 août 2008 23:05:03 :
// Correction des bugs du composant
28 août 2008 13:24:42 :
// Transformation en unité
28 août 2008 13:57:21 :
// Protection du code avec try...finally
28 août 2008 14:06:04 :
// Eradication définitive du composant
29 août 2008 11:58:41 :
// Et voilà : plus de doublebuffered
29 août 2008 14:17:48 :
// Effet vision nocturne (algorithme de f0xi retouché à mes besoins)

 Sources du même auteur

Source avec Zip Source avec une capture UNITÉ DE SUPPORT VISTA
Source avec Zip Source avec une capture GESTION DES "CRASHS D'APPLICATION"
Source avec Zip Source avec une capture CONJECTURE DU CARRÉ DES FACTEURS
Source avec Zip Source avec une capture EFFET VITRE ET THUMBNAILS SOUS VISTA
Source avec Zip Source avec une capture UTILISER UNE DLL INCLUSE EN RESSOURCES

 Sources de la même categorie

Source avec Zip Source avec une capture EFFET VITRE ET THUMBNAILS SOUS VISTA par Bacterius
Source avec Zip Source avec une capture ANAGLYPHEUR OU COMMENT VOIR EN RELIEF LES STÉRÉOSCOPES ANCES... par jfs59
Source avec Zip Source avec une capture DÉFORMER UNE IMAGE AUX DIMENSIONS D'UN QUADRANGLE QUELCONQUE... par FFCAST
Source avec Zip Source avec une capture THREAD ET BITMAP (DESSIN AU CRAYON) par barbichette
Source avec Zip Source avec une capture ÉCRAN DE VEILLE FEU D'ARTIFICE par barbichette

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture ANAGLYPHEUR OU COMMENT VOIR EN RELIEF LES STÉRÉOSCOPES ANCES... par jfs59
Source avec Zip Source avec une capture BONNE ANNEE ! par cantador
Source avec Zip SCANNER ALEATOIREMENT TOUS LES PIXELS D'UN BITMAP par Caribensila
Source avec Zip Source avec une capture COMPOSANT TSWITCHLED (UNE LED) par Bacterius
Source avec Zip Source avec une capture MINIMISER LES COULEURS D' UNE IMAGE VENANT DU SCANNER OU AUT... par MAURICIO

Commentaires et avis

Commentaire de Bacterius le 27/08/2008 14:56:56

Codé sous Delphi 6 !

Cordialement, Bacterius !

Commentaire de Bacterius le 27/08/2008 16:42:14

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 !

Commentaire de cantador le 27/08/2008 18:01:27

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.

Commentaire de Bacterius le 27/08/2008 18:22:18

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 !

Commentaire de Bacterius le 27/08/2008 18:43:26

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 !

Commentaire de WhiteHippo le 27/08/2008 18:49:28

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.

Commentaire de Bacterius le 27/08/2008 18:57:44

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 !

Commentaire de cantador le 27/08/2008 18:57:46 8/10

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




Commentaire de Bacterius le 27/08/2008 19:04:18

"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 !

Commentaire de Bacterius le 27/08/2008 19:10:08

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 !

Commentaire de Bacterius le 27/08/2008 19:11:55

"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 !

Commentaire de WhiteHippo le 27/08/2008 19:16:41

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.

Commentaire de Bacterius le 27/08/2008 19:19:16

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 !

Commentaire de WhiteHippo le 27/08/2008 19:25:05

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.

Commentaire de Bacterius le 27/08/2008 19:27:36

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 !

Commentaire de Bacterius le 27/08/2008 19:29:23

Lol structure du TRGBQuad :

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

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

Cordialement, Bacterius !

Commentaire de Bacterius le 27/08/2008 19:33:56

Bon voilà c'est corrigé ;)
Je réflechis à quoi faire avec rgbtReserved (lol)

Cordialement, Bacterius !

Commentaire de WhiteHippo le 27/08/2008 19:34:59

Pour le clamp, mis à part faire une procedure comme celle donnée ici (http://www.delphifr.com/infomsg_PERFORMANCES-POINTEURS_1143590.aspx) il n'y a pas beaucoup d'autres méthodes.
Pour le channel alpha, tu peux regarder du côté du format PNG par exemple(http://delphi.pjh2.de/articles/graphic/png.php)

Cordialement.

Commentaire de Bacterius le 27/08/2008 19:48:51

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 !

Commentaire de Bacterius le 27/08/2008 22:13:22

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 !

Commentaire de cantador le 27/08/2008 22:19:35

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)

Commentaire de Bacterius le 27/08/2008 22:22:10

xD (erf mon navigateur bug)

Cordialement, Bacterius !

Commentaire de Bacterius le 27/08/2008 22:23:00

En tout cas mon composant va sûrement bien me servir pour mes prochains jeux ;)

Cordialement, Bacterius !

Commentaire de cantador le 27/08/2008 22:40:45

plantage à l'install sur :

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

Commentaire de Bacterius le 27/08/2008 22:47:38

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 !

Commentaire de Bacterius le 27/08/2008 22:48:54

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 !

Commentaire de cantador le 27/08/2008 22:49:47

non c'est le rgbtRed qui coince..

Commentaire de Bacterius le 27/08/2008 22:51:28

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 !

Commentaire de Bacterius le 27/08/2008 23:06:32

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 !

Commentaire de cantador le 28/08/2008 12:01:06

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.

Commentaire de Bacterius le 28/08/2008 12:06:30

je connais pas le tangram7 ... je vais me renseigner.

Cordialement, Bacterius !

Commentaire de cirec le 28/08/2008 12:58:52 administrateur CS

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 !!!!!!!

Commentaire de Bacterius le 28/08/2008 13:03:29

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 !

Commentaire de Bacterius le 28/08/2008 13:25:44

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 !

Commentaire de cirec le 28/08/2008 13:40:58 administrateur CS

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. ;)

Commentaire de Bacterius le 28/08/2008 13:45:07

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 !

Commentaire de Bacterius le 28/08/2008 13:59:42

Voila Cirec suite à ta remarque j'ai mis en try...finally toutes les fonctions :)

Cordialement, Bacterius !

Commentaire de cantador le 28/08/2008 14:02:28

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 !

Commentaire de Bacterius le 28/08/2008 14:07:00

Voila, annihilation totale du composant, je l'ai enlevé de la clause USES.

Cordialement, Bacterius !

Commentaire de cantador le 28/08/2008 14:35:15

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

Commentaire de blueperfect le 28/08/2008 14:47:52

Une idée :

La lampe torche : tu indiques un rayon, et tu peints le tout en noir, n'éclairant que sur un cercle...

Commentaire de Bacterius le 28/08/2008 14:50:51

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 !

Commentaire de Bacterius le 28/08/2008 14:51:30

Tu ne penses qu'à ça BluePerfect xD
Je vais essayer d'implémenter cette fonction.

Cordialement, Bacterius !

Commentaire de cantador le 28/08/2008 15:10:37

F risque d'interférer avec les propriétés des composants.

réponse NON

Commentaire de Bacterius le 28/08/2008 15:12:33

okok

Cordialement, Bacterius !

Commentaire de cirec le 28/08/2008 15:32:41 administrateur CS

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 !!!

Commentaire de Bacterius le 28/08/2008 15:36:39

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 !

Commentaire de cantador le 28/08/2008 15:39:22

c'est donc une animation..

Commentaire de Bacterius le 28/08/2008 15:44:08

Bon, rien ...

Cordialement, Bacterius !

Commentaire de blueperfect le 28/08/2008 19:28:13

Si ça t'interresse, je te livre l'algorythme des rayons X (les fameux X-rays de Ghost Recon) !


Commentaire de Nicolas___ le 28/08/2008 23:29:03

"  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 ...

Commentaire de Bacterius le 28/08/2008 23:32:49

"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 !

Commentaire de Nicolas___ le 28/08/2008 23:38:34

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 ^^

Commentaire de Bacterius le 28/08/2008 23:59:28

"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 !

Commentaire de Bacterius le 29/08/2008 00:00:29

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 !

Commentaire de blueperfect le 29/08/2008 02:26:29

l"effet demain" .... je ne connaissais pas !

lol

Commentaire de Bacterius le 29/08/2008 02:37:02

"J'adapterai l'effet demain"

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

Cordialement, Bacterius !

Commentaire de cantador le 29/08/2008 11:32:56

Salut Bacterius,
et le tangram ?
déjà fini ! Whaaaououou...incroyable..
plus rapide que Bacterius tu..

Commentaire de Bacterius le 29/08/2008 11:51:17

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 !

Commentaire de Bacterius le 29/08/2008 12:01:31

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 !

Commentaire de cantador le 29/08/2008 12:09:50

Excellent.
Mais cela dit souffle un peu quand même
de temps en temps..
patience, je te confierai d'autres idées de programme..

Commentaire de Bacterius le 29/08/2008 12:40:51

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 !

Commentaire de cantador le 29/08/2008 13:30:36

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.

Commentaire de Bacterius le 29/08/2008 13:40:57

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 !

Commentaire de Bacterius le 29/08/2008 14:20:44

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 !

Commentaire de blueperfect le 29/08/2008 18:00:29

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....

Commentaire de Bacterius le 29/08/2008 18:34:18

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 !

Commentaire de Bacterius le 29/08/2008 18:35:52

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 !

Commentaire de blueperfect le 29/08/2008 18:48:08

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...


                                  

Commentaire de f0xi le 30/08/2008 21:33:03 administrateur CS

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.

Commentaire de Bacterius le 30/08/2008 23:15:29

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 !

Commentaire de Nicolas___ le 17/09/2008 10:13:42

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

Commentaire de Bacterius le 17/09/2008 13:17:07

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 ^^

Commentaire de blueperfect le 31/12/2009 18:20:49

>>moyen de connaître le type du fichier (si c'est un fichier graphique)
GraphicsEx.pas ?

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Convetir une imag en Bitmap [ par sebastienbro ] Je veux convertirune image en ICO, mais il me met une erreur : Image icône incorrectAidez moi !!!!! Copie d'une partie d'un image [ par Rapakooti ] Alors mon pb viens du fait que j'essaie de faire une applique skinnable et par soucis de facilite lors de la creation des futur skins , toutes les ima Pb conversion image. [ par Becracker ] Salut les gars, Je suis entrain de faire un convertisseur d'image Bmp &#224; Gif. J'ai mis le code suivant mais il ya une er Prob DLL des ressources bitmap [ par ahmed12 ] Je utilise une dll qui contient des bitmaps a pris avoir compiler une ressource.Et j'ai arrivé de charger ces bmp dans la l'application Hote avec ce Modifier taille bitmap [ par seba31stien ] Bonjour, dans mon appli, je charge une carte au format bitmap dans un paintbox. Cependant, la proc&#233;dure StretchDraw : Paintbox1.canvas.Stretch sélection dans une image Jpeg [ par dieuchrist ] Bijour,voilà mon tit problème:je dois faire un recadreur d'image(pouvoir sélectionner une partie de l'image) jpeg, tout en choisisant un rapport de fo Image en transparence [ par sisi231 ] Voilà mon problème :J'ai d'une part ma fiche avec un fond fait par une mosaïque d'une image (facile à programmer), et d'autre part un bitmap en mémoir comment je peut copier png, tiff, ... d' un image a l'autre comme Bitmap ? [ par programiest ] Salutcomment je peut copier png, tiff, ... d' un image a l'autre comme Bitmap ?j ouvre des Graphiques (PNG,TIFF) dans un Image et je voudrais les copi Appliquer un cadre de couleur ou avec un bitmap [ par cincap ] Bonjour à toutes et à tous,Voici mon problème du jour, après avoir redimensionné une image et avant de la sauver en jpeg, est t'il possible de lui app comment affecter une bitmap a une image [ par didulle ] Salut tout le mondej'aimerais utilis&#233; une variable de type bmp sur laquelle j'effectue des traitements. mais d&#233;s que je l'affecte &#224; l'i


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,295 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales