Changement de la couleur d un pixel+couleurs proches ... (nouvelle version )

Soyez le premier à donner votre avis sur cette source.

Vue 10 086 fois - Téléchargée 692 fois

Description

Le titre annonce la couleur ...

En gros vous selectionnez la couleur que vous voulez remplacer ds une image

puis

soit vous choisissez une couleur pour la remplacer
soit vous prenez une image

DERNIERE MISE A JOUR *


POSSIBILITES DU PROG
____________________


OUVRIR UNE IMAGE(BMP,JPEG) POUR LA MODIFIER EN CHANGEANT LES COULEURS VIA LA METHODE-PIXEL OU SCANLINE
CHANGER LA COULEUR PAR UNE AUTRE COULEUR OU CHANGER LA COULEUR PAR UNE IMAGE
POSSIBILITE DE CHOISIR SON 'TAUX' DE MODIFICATION CAD D ELARGIR LES PALETTES DE COULEURS A CHANGER(UNIQUEMENT AVEC SCANLINE )
ANNULATION DE LA DERNIERE OPERATION GRAPHIQUE
UNE FOIS L'IMAGE MODIFIE POSSIBILITE DE LA SAUVEGARDER EN JPEG

Source / Exemple :


procedure TForm1.RemplacerClick(Sender: TObject);
var
x,y: integer;
SX,SY: extended;
Scan,ScanIMG : TypePRGBArray;
lR, lV, lB, mR, mV, mB : Integer;
begin

 // Creation de l image a  sauvegarder pour l annulation
 Tempb.Height:=image1.Picture.Bitmap.Height;
 Tempb.Width:=image1.Picture.Bitmap.Width;
 Tempb.Assign(image1.Picture.Bitmap);
 precedent.Enabled:=true;

// Facteur pour l'incrustation de l'image(mode image)
SX:=Image1.Picture.Width / BitIMG.Picture.Width;
SY:=Image1.Picture.Height / BitIMG.Picture.Height;
// convertion en entier
if round(sx)=0 then sx:=1;
if round(sy)=0 then sy:=1;

// max gauge(pr la patience !!)
gauge1.MaxValue:=image1.picture.Bitmap. Height-1;

//----------------------------------------------------------------------------------------------
//                             DEBUT DE  LA  BOUClE
//----------------------------------------------------------------------------------------------
if UtiliserS.Checked=false then
begin
for y:=0 to image1.Picture.Bitmap.Height-1 do
begin
gauge1.Progress:=y;   // ...
for x:=0 to image1.Picture.Bitmap.Width-1 do
begin

// ----------------------------------------------------------------------------------------------
//                  METHODE N UTILISANT PAS SCANLINE
// ----------------------------------------------------------------------------------------------

if UTColIMG.Checked then
begin
  // si les couleurs concorde alors on remplace par la col finale
  if (image1.Picture.Bitmap.Canvas.Pixels[x,y]=colimg.color)

 then
begin
image1.Picture.Bitmap.Canvas.Pixels[x,y]:=colFinal.Color;
 end;

end ;

if UtBITIMG.Checked then
begin
// idem / que c pr l'image
    if (image1.Picture.Bitmap.Canvas.Pixels[x,y]=colimg.color)
  then
begin
Image1.Picture.Bitmap.Canvas.Pixels[x,y]:=
BitIMG.Picture.Bitmap.Canvas.Pixels[x div round(sx)  ,y div round(sy) ] ;
end;
end;

end;//utiliserS

end;   //  fin de
end;   //  la boucle

// max gauge(pr la patience !!)
gauge1.MaxValue:=image1.picture.Bitmap. Height-1;
//----------------------------------------------------------------------------------------------
//                             DEBUT DE  LA  BOUClE
//----------------------------------------------------------------------------------------------
if UtiliserS.Checked=true then
begin

if UtBITIMG.Checked=true then
begin

if (image1.picture.Bitmap.Width> Bitimg.Picture.Bitmap.Width ) or  //Protection pour ne pas depasser
(image1.picture.Bitmap.Height> Bitimg.Picture.Bitmap.Height )  // les limites
then
begin

Bitimg.Picture.Bitmap.Width:=image1.Picture.Bitmap.Width;
Bitimg.Picture.Bitmap.height:=image1.Picture.Bitmap.height;
end;
end;

for y:=0 to image1.Picture.Bitmap.Height-1 do
begin
gauge1.Progress:=y;   // ...

Scan := image1.picture.Bitmap.ScanLine[Y];
if utBITIMG.Checked then  ScanIMG :=BitImg.Picture.Bitmap.ScanLine[y];
for x:=0 to image1.Picture.Bitmap.Width-1 do
begin

// ----------------------------------------------------------------------------------------------
//                  METHODE  UTILISANT  SCANLINE
// ----------------------------------------------------------------------------------------------

if UTColIMG.Checked then
begin

                       mR := Scan[X].Rouge;
                       mV := Scan[X].Vert;
                       mB := Scan[X].Bleu;

                    If
                        ( rgb(mr,mv,mb)<colimg.Color+rgb(taux.Position,taux.Position,taux.Position))
                         and
                         ( rgb(mr,mv,mb)>colimg.Color-rgb(taux.Position,taux.Position,taux.Position) )

                          Then

                          Begin
                               lR := getRvalue(colfinal.Color) ;//Scan[X].Rouge;
                               lV := getGvalue(colfinal.Color) ; //Scan[X].Vert;
                               lB := getBvalue(colfinal.Color) ; //Scan[X].Bleu + 151;

                          End
                       Else Begin // Sinon, recopier le pixel d'origine
                                 lR := mR;
                                 lV := mV;
                                 lB := mB;
                          End;

                       Scan[X].Rouge := lR;
                       Scan[X].Vert  := lV;
                       Scan[X].Bleu  := lB;

                       end;

if UtBITIMG.Checked then
begin

                       mR := Scan[X].Rouge;
                       mV := Scan[X].Vert;
                       mB := Scan[X].Bleu;

                        If
                       ( rgb(mr,mv,mb)<colimg.Color+rgb(taux.Position,taux.Position,taux.Position))
                         and
                       ( rgb(mr,mv,mb)>colimg.Color-rgb(taux.Position,taux.Position,taux.Position) )

                        Then
                          Begin
                               lR := ScanIMG[X].Rouge;
                               lV := ScanIMG[X].Vert;
                               lB := ScanIMG[X].Bleu;

                          End
                       Else Begin // Sinon, recopier le pixel d'origine
                                 lR := mR;
                                 lV := mV;
                                 lB := mB;
                          End;

                       Scan[X].Rouge := lR;
                       Scan[X].Vert  := lV;
                       Scan[X].Bleu  := lB;

                       end;

end;//utiliserS

end;   //  fin de
end;   //  la boucle
image1.Refresh ;
if UtiliserS.Checked=true then image1.Refresh;
gauge1.Progress:=0; // on remet a zero la petite gauge
end;

Conclusion :


SCANLINE , QUAND MEME VACHEMENT PLUS RAPIDE !!!

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Nicolas___
Messages postés
1039
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2 -
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
1039
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2 -
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
1039
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2 -
---------------------------
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
1039
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2 -
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
1039
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2 -
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.