CHANGEMENT DE LA COULEUR D UN PIXEL+COULEURS PROCHES ... (NOUVELLE VERSION )

cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 - 6 oct. 2005 à 13:02
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 - 31 déc. 2005 à 18:59
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/34101-changement-de-la-couleur-d-un-pixel-couleurs-proches-nouvelle-version

Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
31 déc. 2005 à 18:59
Bon voila j avais envie de le terminer ...
Tout marche , aussi bien la fonction PIXELS que la SCANLINE
J ai laisse volontairement les 2 possibilites ds le prog pour apprecier le gain de temps !!!

Et pr finir j ai laisser tomber des fonctions qui ne marchait pas du tonnere
mais elle sont encore ds le code( mis entre {})

Voila j ai enfin realise la fonction que j avias demandé a maurico ...

Si ca peut aider quelqu un ...

Faites signe !

Slt a tous

Nico
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
31 déc. 2005 à 15:09
Voila utilisation de SCANLINE
mais prob avec cette utilisation car prob pr incruster une image
(contrairement a la methode pixel ), doit faire 2 boucles ou alors les images doivent avoir les memes dimensions
(ou l image a incruster doit etre plus grande que l image d'origine pr ne pas deppasser les limites)

Et prob ac l'annulation graphique ???

Merci EddiTheHead

Ciao

Bonne année a tous a l avance
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
31 déc. 2005 à 13:32
---------------------------
Notification d'une exception du débogueur
---------------------------
Le projet Project1.exe a provoqué une classe d'exception EAccessViolation avec le message 'Violation d'accès à l'adresse 00470B8B dans le module 'Project1.exe'. Lecture de l'adresse 00000000'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
---------------------------
OK Aide
---------------------------

voici le message d'erreur que je ne comprends pas ....

Merci

Ciao
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
31 déc. 2005 à 03:10
Bon ce n'est toujours pas en scanline mais bon ...
Possibilite d annulation graphique
Possibilite d'avoir une couleur ini et une couleur Max pour le changement de la couleur
Possibilite de voir l'image en grandeur reelle

et pour finir en beaute

Possibilite de bug avec les images de sauvegardes pour l annulation
(Depassement du tableau mais bon on a qd meme 100 images ... ca serait pousser ! )

Par contre des fois ca "plante" et je ne sais pas pour quoi !

Ciao
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
8 oct. 2005 à 01:09
Merci EddiTheHead pour ces informations supplementaires
et assez bien expliquees
j ai regarder ton prog avec la loupe et c est le meme sys que tu utilises ...

Tres clair !

Merci encore a toi ...

Ciao
Nico
EddiTheHead Messages postés 58 Date d'inscription mercredi 16 février 2005 Statut Membre Dernière intervention 2 juin 2006
7 oct. 2005 à 21:00
Slt Nicolas,

L'utilisation des ScanLine est très simple et ça rend beaucoup de service. Mais faut connaître les bases :

Une image est composée de 3 paramètres :
- la taille en X (Width - Largeur).
- le taille en Y (Height - Hauteur).
- le codage des couleurs, le plus facile est le 24 bits.
Pourquoi 24 bits? parce qu'un pixel est composé de 3 couleurs de bases, le Rouge, le Vert et le Bleu. Chaqu'une des couleurs de bases est codée sur un octet donc 3 octets x 8 bits = 24 bits.

En mémoire :

: c'est une ligne de 3 pixels

Pour utiliser un pixel, on doit donc déclarer :

Type TypeRGB = Record
Bleu, Vert, Rouge : Byte; // C'est l'ordre de codage en mémoire
End;

Le ScanLine s'utilise sur une ligne de l'image, on doit donc déclarer :

Type TypeRGBArray = Array [0..400] Of TypeRGB; // Si l'image à 400 pixels sur une ligne (Width)

Le ScanLine c'est aussi un pointeur sur une ligne de l'image, on a donc :

Type TypePRGBArray = ^TypeRGBArray; // le signe ^ précise que l'on pointe vers une valeur qui a le format du type "TypeRGBArray"

Tout ça n'est qu'une déclaration de Type de données. Il faut pouvoir utiliser ces informations :

Var ScanSource, ScanDestination : TypePRGBArray;

Voilà pour les déclarations.

Pour l'utilisation, tu as une image :

Var BMPImage : TBitmap;

Tu la charges (on suppose que l'image à 400 pixels par ligne) :

BMPImage := TBitmap.Create;
BMPImage.LoadFromFile('Image.BMP');
BMPImage.PixelFormat := pf24Bit; // Pour forcer le format de l'image

Pour copier la 10ème ligne sur la 20ème (la 1er ligne est en position 0, la 2ème est en position 1, ...) :

ScanSource := BMPImage.ScanLine[9]; // Pour pointer sur la 10ème ligne de l'image
ScanDestination := BMPImage.ScanLine[19]; // Pour pointer sur la 20ème ligne de l'image
ScanDestination := ScanSource;

Pour copier la 5ème pixel sur le 6ème de la 10ème ligne (ici aussi, le 1er pixel est en position 0, ...) :
rem : tu définis d'abord la ligne, ensuite le pixel

ScanSource := BMPImage.ScanLine[9]; // Pour pointer sur la 10ème ligne
ScanSource[5] := ScanSource[4];

Pour accéder au 5ème pixel de la 10ème ligne et mettre son composant bleu à 0 :

ScanSource := BMPImage.ScanLine[9]; // Pour pointer sur la 10ème ligne
ScanSource[4].Bleu := 0;

Ceci n'est q'une base, à toi d'évoluer et de trouver d'autres astuces dans les déclarations et l'utilisations.

Bon amusement.
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
6 oct. 2005 à 17:38
Je viens de me rappeler que Forman a une source dans ce genre! ouai, peut être ...
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
6 oct. 2005 à 17:36
Bon la fonction que je te parlais ... bem ... je t' ai fait "baver" pour rien vu que je ne l' ai jamais postée.
Je pourrai la poster mis faut que j' y jette un oeil car souvent mes fonctions utilisent d' autres fonctions qui utilisent d' autres fonctions etc ... Je vais voir :)
Par contre, j' ai plein de source utilisant le scanline. D' ailleurs, j' ai remarqué qu' un de mes fans (si si, j' en ai ^^) m' a mis 10/10 à pas mal de mes vieilles sources (et non, je n' ai pas un autre compte pour me filer des bonnes notes)!
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
6 oct. 2005 à 17:29
D accord j ai compris ce que tu veux dire ...

Bon je vais qd meme essayer de comprendre qqch a scanline pcq 10 * c'est pas negligable (surtout sur les gd images comme tu as mentionné)

V Essayer d ameliorer tt ca ...
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
6 oct. 2005 à 17:24
N' oublie pas que Scanline est au moins 10 fois plus rapide.
Prenons une couleur à changer:
R: 255
G: 053
B: 039
Une tolérence de 10% permettrait d' inclure à ce "rouge" les rouges voisins.
Imaginons maintenant une photo d' une ferrari rouge. Je vais la "passer" en vert. Les différents tons de rouge (selon le pourcentage de tolérence des couleurs proches) deviendront différents tons de vert. La couleur rouge est remplacée par son équivalent en vert, c' est ce que j' appelle la difference de tonalité conservée!!!

Pour ma source, je vais voir si je l' ai postée ...
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
6 oct. 2005 à 17:15
ET oui au fait donne moi le lien de ta source ou tt au moins son nom parce que j avais bien regarde auparavant pr voir s il y avait pas une source de ce genre et j avais rien vu mais enfin avec le nombre de sources qu il y a sur ce site pas tjs facile de se retrouver et en plus je ne sais pas si ca vient de chez moi ou quoi mais DELPHI.FR n est pas le site le plus rapide , mais ca hein, je vais pas me mettre a raler vu l excellente qualite de ce site ...

Slt
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
6 oct. 2005 à 17:11
Slt Maurico,

J ai pas utilise scanline tt simplement parce que je ne comprends rien a son utilisation.
j ai pourtant regarde plein d exemples sur ce site pr essayer de comprendre mais en vain ...
La tonalite,Kesako????
Aurais tu une proposition a me donner pr par exemples donner a la place d une seule couleur a changer , une couleur minimal et une couleur max ce qui permettrait de changer tt les couleurs comprises entre ces 2 valeurs. (par ex: le vert et le jaune et change ts les couleurs comprises entre ces deux la ...)

Sur quelles tailles d images as tu ravaille?
Moi sur des images de 2004 x 1728 et ca prenait rarement plus de 10 sec(Enfin c clair que scanline est vachement + rapide , je ne conteste ca en rien )

Slt
Nico
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
6 oct. 2005 à 13:02
C' est très long sur de grandes images.
Pour faire un processus de ce genre, tu dois utiliser le scanline, y a plein de sources sur ce sujet (j' en ai moi même). Pour les moins bon, on peut utiliser la transparence du TBitmap.
J' ai fait une fonction dans cet esprit mais avec un degré de tolérence sur la couleur choisie. Elle permet aussi de conserver la différence de tonalité. Il me semble que je l' ai posté sur ce site ...
Rejoignez-nous