Comment affecter une bitmap a une image

didulle Messages postés 1 Date d'inscription vendredi 7 janvier 2005 Statut Membre Dernière intervention 15 mars 2006 - 15 mars 2006 à 16:12
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 17 mars 2006 à 02:13
Salut tout le monde
j'aimerais utilisé une variable de type bmp sur laquelle j'effectue des traitements. mais dés que je l'affecte à l'image il y a rien
exemple
bmp:tbitmap;
pour changer la couleur de certains pixels
bmp.Canvas.Pixels[i,j]:=Tabc[R]; avec Tabc un tableau de couleur
ca marche quand je travaille directement sur une timage mais c'est trés long.je voulais savoir si c possible de travailler directement sur un tbitmap.
merci d'avance
A voir également:

3 réponses

Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
15 mars 2006 à 17:33
tu peux faire tt tes operations sur Un Tbitmap et pour voir le resultat apres tu fais ceci

image1.Picture.Bitmap.Assign(bmp); ou bmp est ta variable de ton TBitmap
0
walid2876 Messages postés 49 Date d'inscription mardi 26 avril 2005 Statut Membre Dernière intervention 31 août 2008
15 mars 2006 à 19:50
Verifier d'abord si ton bitmap n'est pas vide sinon tt tes opertations sont nulles
pixels est un tableau vide au demarrage (lorsque on creer le bmp)
soit tu l'assigne une image bmp.assign(image1.picture.bitmap)) et ensuite tu fais tes opertations
soit si tu veux demarrer a blanc tu dois donner une taille a ton bitmap (bmp.width,bmp.height)
et ensuite tu dessine directement sur ton bitmap
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
17 mars 2006 à 02:13
creer une procedure de traitement d'image :

Type

TRGBRec = record
B,G,R : byte;
end;
PRGBArray = ^TRGBArray;
TRGBArray = array[0..32767] of byte;

... pourquoi 32767 :1024*8*4-1 High(SmallInt) 32767

1024 = 1 KiloBytes*8 1 Bytes 8 bits
1024*8 = 8096 bits*4 4 Bytes (R,G,B,c" :: $00FFFFFF :: Int 32bits :: c" n'est pas pris en compte car on considere dans les cas generaux RGB que c" $00 = contexte du peripherique)
-1 = 32767
0..32767 = 32768 entrées possible

taille maximale de l'image : 32768 x 32768 x 32bitstaille maximale de l'image sur disque : 4 294 967 296 octets High(LongWord) 4Go
4Go = Taille maximale d'un fichier sur un disque NTFS/FAT32/DVDUDF
...

procedure Negativaze(const Src : TBitmap; Dest : TBitmap);
{/!\ conseil : Dest n'est pas definit en OUT ou VAR pour pouvoir directement assigner
certain objet TBitmap directement (ImageN.Picture.Bitmap), sinon il y aurait
une erreur de passage de constante en parametre VAR, a la compilation}

var
ScrLines,{Src}
BufLines {Buf} : PRGBArray; // Pointeurs sur tableau RGB pour le scanline
X,Y : integer;
nRGB : TRGBRec; // Pixel temporaire
Buf : TBitmap; // un buffer qui permet de faire les traitements post assignation
begin

{partie 1 :: creation du buffer, initialisation post traitement ----- }
Buf := TBitmap.Create; // creation du buffer
Buf.PixelFormat := pf24bit; // 24bits (R*G*B)
Buf.Width := Src.Width; // Dimensions du buffer
Buf.Height := Src.Height;

{partie 2 :: traitement de l'image}
{/!\ conseil : evitez les appel repetitif a un tableau (tableau[indice])

cela degrade fortement les performances, n'assignez pas non plus de pointeurs

aux valeurs provenant de la source (considerez la en Lecture seule!),
vous pouvez par contre assigner des pointeurs sur le buffer si necessaire}

{partie 2A :: recuperation des lignes de pixels Source/Destination --- }

for Y := 0 to Src.Height-1 do begin

ScrLines := Src.ScanLine[Y];
BufLines := Buf.ScanLine[Y];

{partie 2B :: traitement des pixels source --------------------------- }
for X := 0 to Src.Width-1 do begin
nRGB := ScrLines[X]; // recuperation du pixel X source
with nRGB do begin
R := 255-R;
G := 255-G;
B := 255-B;
end;
BufLines[X] := nRGB; // assignation au pixel X du buffer
end;
end;

{partie 3 :: renvois du buffer dans la destination ------------------- }

// on assigne le buffer a l'image de destination

Dest.Assign(Buf);

// On peu egalement faire ceci :
// Dest.Width := Buf.Width;

// Dest.Heigth := Buf.Height;

// Dest.PixelFormat := pf24bit;

// Dest.Canvas.Draw(dx,dy,Buf);
// Mais il faudrat rafraichir l'image aprés cette procedure,
// comme cela : imageN.Refresh;
{/!\ conseil : on ne peu pas faire cela, meme si Dest et Buf sont
de type identique : Dest := Buf; }

{partie 4 :: fin ----------------------------------------------------- }
// on libere le buffer
{/!\ conseil : meme si une fin de procedure ou fonction libere
automatiquement les variables utilisée, il est fortement recommendé de
TOUJOURS liberer les instances de classes créées "manuellement" (create)
dans cette derniere, grace a la methode Free et non Destroy (voir l'aide
Delphi au sujet de "Free/Destroy")}
Buf.free;
end;

voila je pense avoir tout mis ici. si avec cela tu ne t'en sort toujours pas ... ben ...

0
Rejoignez-nous