Modification d'image [Résolu]

Signaler
Messages postés
27
Date d'inscription
vendredi 2 décembre 2005
Statut
Membre
Dernière intervention
31 janvier 2007
-
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
-
Bonjours,

J'ai un petit probleme pour modifier une image pixel par pixel, quand j'execute le prog, on me renvoie "ne peut modifier une Image que si elle contient une TBitmap"

une idée???

merci

11 réponses

Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
44
Tu peux aussi le charger directement dans un JPEGImage
puis l'assigner à TImage en tant que Bitmap :

Var JPEG : TJPEGImage;
begin
  JPEG := TJPEGImage.Create;
  With JPEG do
  Try
    LoadFromFile('01diver_cine.jpg');
    Image1.Picture.Bitmap.Assign(JPEG);
  Finally
    Free;
  End;
end;

 
@+
Cirec

<hr size ="2" />
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
le truc c 'est laisse tomber cette methode pixel par pixel utilise scanline

TypeRGB       = Record
                        Bleu, Vert, Rouge : Byte;
                  End;
  TypeTRGBArray = Array [0..12000] Of TypeRGB; // pour la largeur de l'image
  TypePRGBArray = ^TypeTRGBArray;

...
var
x,y,pix1,pix2,pix:integer;
r1,g1,b1,r2,g2,b2,,r3,g3,b3:integer;
Scan1,Scan2,ScanFIN : TypePRGBArray;

begin

// imageFin est l'image qui va recevoir les pixel de ton image 1 additionne a ceux de ton image 2
// pour avoir un plus bel effet tu devrais regarder a ne pas depasser les valeurs etc etc mais ca je te laisse
//le faire mais je montre juste l'exemple de base
// de plus fait attention a ce que ton image 1 soit = a ton image 2
imageFin.Picture.Bitmap.Width:=image1.Picture.Bitmap.Width;
imageFin.Picture.Bitmap.Height:=image1.Picture.Bitmap.Height;


ImageFIN.Picture.Bitmap.Assign(Image1.Picture.Bitmap);


for y:=1  to image1.Picture.Bitmap.Height-2 do
begin
Scan1:=image1.picture.Bitmap.ScanLine[Y];
Scan2:=image2.picture.Bitmap.ScanLine[Y];
ScanFIN:=imageFIN.picture.Bitmap.ScanLine[Y];


for x:=1  to image1.Picture.Bitmap.Width-2 do
begin


r1 := scan1[x].Rouge;
g1 := scan1[x].Vert;
b1 := scan1[x].Bleu;

r2 := scan2[x].Rouge;
g2 := scan2[x].Vert;
b2 := scan2[x].Bleu;


  r3:=r1+r2;
  g3:=g1+g2;
  b3:=b1+b2;


  scanFin[x].Rouge:=r3;
  scanFin[x].Vert:=g3;
  scanFin[x].Bleu:=b3;

end;;
end;
// tres important sinon tu ne verra pas la difference


imageFin.Refresh;

alors tu vas me dire
putain c'est vachement plus long et plus compliqué que ...bitmap.canvas.pixel[x,y]:= ...
D'accord tu as raison Mais et il y a un MAIS tu vas a peu pres 10 fois plus vite avec cette méthode ( encore que 10 fois c'est pas beaucoup !!! )

Ciao
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
44
Salut,
donne nous un peut plus de détails et de code ...

quel est le format de l'image ?
comment charges tu l'image ?
dans quel composant charges tu l'image ?

à mon avis tu essayes de modifier une image de type JPG, Gif, PNG ... bref tout sauf du BMP

si c'est le cas (et je pense que oui) il te faut convertir ton image en Bitmap avant de pouvoir la modifier

 
@+
Cirec

<hr size="2" />
Messages postés
27
Date d'inscription
vendredi 2 décembre 2005
Statut
Membre
Dernière intervention
31 janvier 2007

Alors, le truck c'est que je joudrais mélanger deux images enssembles.

J'ai deux image jpeg et un composant TImage.

Je prend le pixel[1,1]du premier JPEG et je le met dans TImage, pixel[1,1].(la ça bug déjà).
Puis je prend le pixel[1,2]du 2 eme JPEG et je le met dans TImage, Pixel[1,2].
Et ainsi de suite....
Messages postés
436
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015

Salut,

tu assignes un TBitmap à ton jpeg ainsi  (en admettant qu'il soit dans Image1) :
<hr />var
bmp:TBitmap;
begin
    bmp:=TBitmap.Create;
    bmp.Assign(Image1.Picture.Graphic); 
    bmp.Free;
end;
<hr />
Voilà, à partir de là tu as normalement accès aux Pixels

DrJerome
Messages postés
436
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015

excuse-moi j'avais pas mis toutes les lignes  ... c'est :
<hr />
var
bmp:TBitmap;
begin
    bmp:=TBitmap.Create;
    bmp.Assign(image1.Picture.Graphic);
    Image1.Picture.bitmap.Assign(bmp);
    bmp.Free;
end;
<hr />
DrJerome
Messages postés
27
Date d'inscription
vendredi 2 décembre 2005
Statut
Membre
Dernière intervention
31 janvier 2007

Merci Cirec

@+
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
excuse moi mais pix,pix1 et pix 2 ne servent a rien
Ciao
Messages postés
436
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015

salut,

(je reviens en arrière, sinon ok pour scanline par ailleurs) :
en LoadFromFile il y a aussi cette possibilité (=variante)
<hr />
var
bm:TBitmap;
begin
     image1.Picture.LoadFromFile('mon.jpeg');
     bm:=TBitmap.Create;
     bm.Assign(image1.Picture.Graphic);
     image1.Picture.Bitmap.Assign(bm);
     bm.Free;
end;
<hr />(tu peux également traiter avec "try ..finally", il suffit de modifier)

DrJerome
Messages postés
27
Date d'inscription
vendredi 2 décembre 2005
Statut
Membre
Dernière intervention
31 janvier 2007

J'ai un petit probleme avec ta méthode Nicolas, il ne me traite pas une partie de l'image.
la partie gauche est donc identique à l'originale.
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
ecrit moi ta source je verrai peut etre mieux ...
ciao