cs_TouTSpeed
Messages postés72Date d'inscriptionjeudi 5 janvier 2006StatutMembreDernière intervention30 août 2007
-
3 nov. 2006 à 22:20
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 2022
-
7 nov. 2006 à 04:00
bonsoir à tous.
Je suis en train de retranscrire un programme écrit en language c et en delphi !! ( en fait je lance un programme que j'ai écrit en C afin de traiter une opération que je ne savais faire en delphi à l'époque ! )
le programme en question capture une image toutes les x secondes , l'enregistre au format jpg puis la lit, et en fonction des infos recueillit je détermine la position d'un objet d'une couleur définit auparavant !
le programme fonctionnait parfaitement avec le petit prog en C ! avec capture toutes les demi seconde ce qui me convenait or en delphi je ne peux descendre en dessous de 1 seconde car l'affichage sacade et ensuite il y a probleme de temps de lecture/écriture !
y a t il un moyen d'enregistrer l'image dan sla ram a un eadresse précise et de lire cette image a la meme adresse évidemment !!
en espérant avoir été assez clair
je vous en remercie d'avance !
( le programme d edépart permmettait a une webcam de suivre l'objet en question !
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 4 nov. 2006 à 17:05
de memo
var
TMS : TMemoryStream;
Color : array[0..2] of byte; {R=0, G=1, B=2}
begin
TMS := TMemoryStream.create;
Try
Bitmap.PixelFormat := pf24bit;
Bitmap.SaveToStream(TMS);
TMS.position := 0;
TMS.Seek(56, soFromBeginning); // vas au premier pixel
while TMS.Position+3 < TMS.Size do begin
TMS.ReadBuffer(Color,3); // lit pixel par pixel
end;
finally
TMS.Free;
end;
end;
cs_TouTSpeed
Messages postés72Date d'inscriptionjeudi 5 janvier 2006StatutMembreDernière intervention30 août 2007 4 nov. 2006 à 01:21
merci pour t asource qui est pas mal du tout !!
voici mon code
begin
image1.Picture.Bitmap.SaveToFile('4pixels.bmp'); //.. donc ici au lieu de sauvegarde dans un fichier il faut que je "sauvegarde dans un flux"
//traitement image petit problème ici
assignfile(s,'4pixels.bmp');
reset(s); j'utilise cette fonction pour lire octet par octet l'image en question et je décortique par la suite
toutes valeurs pour le traitement d'où la boucle ! ( j'ai étudier la stucture d'un fichier bitmap ) Puis je lire octet par octet ce que contient un flux
????????????? ( de plus le flux a t il un formt spécifique ?? définissable ??? ici Bimap !!! car la lecture tiensompte des spécifications de ce format!!!!)
repeat
read(s,tampon);
if i=1 then
begin
i:=0;
end;
numbyt:=numbyt+1;
i:=i+1;
if numbyt=20 then label1.caption:=inttostr(tampon); // affichage de certaine valeur importante ( nombre pixel , taille ,.....)
if numbyt=24 then label2.caption:=inttostr(tampon);
if numbyt>55 then // bit 55 début de la palette de couleur
begin
k:=k+1;
j:=j+1;
if k=1 then bleu:=tampon; //
if k=2 then vert:=tampon;
if k=3 then
begin
rouge:=tampon;
k:=0;
if colonne=largeur then // lecture de g à d et de b en h ! parcours de l'iamge pixel par pixel ( 3 valeur = 1 pixel ! )
begin
colonne:=1 ;
ligne:=ligne+.............
....................
je te remercie par avance bien que je me rend compte que la tache s'avère plus compliquer étant donné le format que j'utilise !
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_TouTSpeed
Messages postés72Date d'inscriptionjeudi 5 janvier 2006StatutMembreDernière intervention30 août 2007 4 nov. 2006 à 19:22
merci de m'avoir répondu
en fait je faisait comme cela ( avec IntToStr ) mais je voulais etre sur qu'il n'existait pas une autre fonction tel que bytetostr ( je sais sa n'existe pas ! ) ou autres !
je te remercie je suis en train de faire mes test !
heuresement que je sais cela ! mais cela fait 1 an que j'apprend en autodidacte et je suis loin de conaitre toutes les fonctions !
Mais si tu a regarder la vidéo je pense que tu peux voir que je ne débute ormis sous delphi !
cs_TouTSpeed
Messages postés72Date d'inscriptionjeudi 5 janvier 2006StatutMembreDernière intervention30 août 2007 4 nov. 2006 à 20:04
pédagogiquement il est vrai que c'est interressant mais j'ai déj aétudier en long en large et en travers comme était constituer une image bmp avec un éditeur hexa .... et pour la lecture c'est la même sauf que sous delphi je sèche ! merci à tous je patiente j'ai des courses a faire !
suis assé content de ma quatrieme methode ... trés trés rapide pour convertir 8 millions de TPixel24bit vers integer.
les autres sont relativement dans les choux.
brunews serait fier de moi :)
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 5 nov. 2006 à 12:28
Désolé ... ça a pris plus de temps que prévu
tu mets un Bouton et un Mémo sur une fiche et tu complètes comme ceci :
Type TRGBRec = record
R,G,B : Byte;
end;
procedure TForm1.Button1Click(Sender: TObject);
Var MS : TMemoryStream;
FileHeader : TBITMAPFILEHEADER;
Info : TBITMAPINFO;
NB : Byte;
DataSize : Cardinal;
Data : TRGBRec;
X,Y : Integer;
BMP : TBitmap;
begin NB : = 3;
MS := TMemoryStream.Create;
With MS do Try LoadFromFile('14.plage.bmp');
ReadBuffer(FileHeader, SizeOf(TBITMAPFILEHEADER)); // lecture du Header
ReadBuffer(Info, SizeOf(TBITMAPINFO));// lecture des Infos If Info.bmiHeader.biBitCount = 32 Then NB := 4;
// ImageSize est souvant laissé à 0 ... voici comment on le calcule
DataSize : = (Info.bmiHeader.biWidth * Info.bmiHeader.biHeight) * NB;
MS.Position := FileHeader.bfOffBits; // Offset du début des données
If Info.bmiHeader.biBitCount = 24 Then// que les Image en 24bit Begin BMP := TBitmap.Create;
Try
BMP.PixelFormat : = pf24Bit;
BMP.Width := Info.bmiHeader.biWidth-1;
BMP.Height := Info.bmiHeader.biHeight-1;
For Y : = 0 To BMP.Height Do For X := 0 to BMP.Width Do Begin readBuffer(Data, SizeOf(Data));
// Dans une structure BMP les données de l'image sont inversées et byte R et B aussi
BMP.Canvas.Pixels[x, BMP.Height-Y] : = RGB(Data.B, Data.G, Data.R);
End;
Finally Self.Canvas.Draw(0,0,BMP);// Dessin sur la fiche BMP.Free;
End;
End; Finally Free;
End;
With Info.bmiHeader, Memo1.Lines do// Affichage des infos dans le Mémo Begin Clear;
Add(Format('HeaderImageSize : %d', [FileHeader.bfSize]));
Add(Format('Width : %d, Height : %d', [biWidth, biHeight]));
Add(Format('BitCount : %d', [biBitCount]));
Add(Format('ImageSize : %d', [biSizeImage]));
Add(Format('DataSize : %d', [DataSize]));
End;
end;
Il existe des BMP en 24 bit qui ont une taille de données
interne plus grande que la théorie...
ces images ne s'affiche pas correctement avec cette méthode ...?
Je n'ais jamais cherché plus loin car je ne vois pas grand intérêt à
utiliser cette méthode
mais peut tu m'expliquer comment lire mon pixel et le traiter avec ta fonction pour obtenir un integer car là franchement ça fait 1 heures que je me casse la tête et je trouve pas !
voila mon code actuelle ou je traite couleur par couleur ! et j'affiche a chaque lique la valeur pour vérifier !
procedure TForm1.Button1Click(Sender: TObject);
var
TMS : TMemoryStream;
color : byte;
begin
TMS := TMemoryStream.create;
pos:=pos+1;
image1.Picture.bitmap.SaveToStream(TMS);
TMS.Seek(pos, soFromBeginning); // vas au début du header pos=0 , pos=56 palette
TMS.ReadBuffer(Color,1); // lit couleur par couleur après 56 B->V->R->B...
listbox1.items.add(inttostr(Color)) ;
TMS.Free;
end;
donc là les bonnes valeurs s'affiche !
ou dois je utiliser ta fonction pour accélérer tout cela?