écriture lecture ram ????

Résolu
cs_TouTSpeed Messages postés 72 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 30 août 2007 - 3 nov. 2006 à 22:20
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 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 !

voir vidéo ->  ici ( BE Projet 2006 DUT GEII )

le programme dirige la cam et l'on observe alors que l'objet est toujours au centre de l'écran !

encore merci

31 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
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;

3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
4 nov. 2006 à 00:53
Salut TouTSpeed,

TMemoryStream me semble tout indiqué pour faire ça.
N'est-ce pas ce que tu utilises?
0
cs_TouTSpeed Messages postés 72 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 30 août 2007
4 nov. 2006 à 00:57
merci de la réponse je vais étudier cette fonction qu eje ne connais point !

actuellement j'enregistre l'image sur le disque dur puis je la lis !!! ce qui est long !

encore merci


je te tiens au courant du résultat et si j'ai un soucis !
0
cs_TouTSpeed Messages postés 72 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 30 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  !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_TouTSpeed Messages postés 72 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 30 août 2007
4 nov. 2006 à 18:31
merci beaucoup pour votre aide

la méthode de [auteurdetail.aspx?ID=360948 f0xi] me convient  parfaitement !

mais juste une dernière petite question !

comment convertir un byte ( nombre entre 0 et 255 )

en integer  et même string pour pouvoir afficher la valeur lors de mes test

Encore un grand merci à tous

je posterai ma source dès que mon programme sera au point ou presque pour d'éventuelle amélioration !
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
4 nov. 2006 à 19:16
var  A : byte;
A := 200;
Edit1.Text := IntToStr(A);

Mais si tu ne sais pas ça, je te vois mal manipuler les TStream...
Ou alors, je n'ai pas compris ta dernière question.


 
0
cs_TouTSpeed Messages postés 72 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 30 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 !

encore merci
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
4 nov. 2006 à 19:29
Ok. Ca m'étonnait aussi...  :)


De toute façon, tu as intérêt à laisser tomber les Bytes et à déclarer toutes tes variables en Integer, c'est plus rapide...
0
cs_TouTSpeed Messages postés 72 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 30 août 2007
4 nov. 2006 à 19:33
ok ok

je prend note !

mais pour obtenir les valeurs des couleurs entre 0 et 255 il faut passer par byte il me semble ?  je vais refaire mais teste de se coté là !

si tu peux me confirmer ou non ?
0
cs_TouTSpeed Messages postés 72 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 30 août 2007
4 nov. 2006 à 19:44
je vien sde tester

lorsque je change le type byte en integer les valeurs ne signifie rien d'exploitable !   ( valeurs composées de 7 chiffres !!! )

si jai bien compris il vaut mieux lire des integer que des bytes pour gagner du temps

mais le soucis et qu'il faut que les valeurs que je traite par la suite soit comprises entre 0 et 255 !!!

merci
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
4 nov. 2006 à 19:46
Salut,
tu te compliques la vie en lisant caractère par caractère les infos du Bitmap ...

Le file header et les infos peuvent être lu en une fois avec TBITMAPFILEHEADER et TBITMAPINFOHEADER

 
@+
Cirec

0
cs_TouTSpeed Messages postés 72 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 30 août 2007
4 nov. 2006 à 19:53
merci Cirec !

mais aurait tu un exemple d'utilisation pour parcourir la palette pixel par pixel couleur par couleur !

car la c'est vague mais merci !

je vais voir mon ami google !
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
4 nov. 2006 à 19:55
Cirec a tout-à-fait raison.
Par contre la méthode de lecture octet par octet est pédagogiquement intéressante pour ToutSpeed, je trouve...
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
4 nov. 2006 à 19:57
vu ton pseudo je te demande un petit peut de patience ... lol ...
j'ai un truc à finir et après ...

sinon pour patienter fait une recherche dans l'aide de delphi

 
@+
Cirec

0
cs_TouTSpeed Messages postés 72 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 30 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 !
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
5 nov. 2006 à 05:45
convertions de types, transtypage :

type
  TPixel24bit = array[0..2] of byte;
 
// solution 1 [203..219ms 8MPixels] :
function Pixel24ToInt1(const P24 : TPixel24bit) : integer;
begin
  Move(P24, Result, 3);
end;

// solution 2 [328..344ms 8MPixels] :
function Pixel24ToInt2(const P24 : TPixel24bit) : integer;
begin
  CopyMemory(@result,@P24,3);
end;

// solution 3 [78..94ms 8MPixels] :
function Pixel24ToInt3(const P24 : TPixel24bit) : integer;
begin
  result := (P24[2] shl 16) + (P24[1] shl 8) + P24[0];
end;

// solution 4 [31..47ms 8MPixels] !best! :
function Pixel24ToInt4(const P24: TPixel24bit): Integer;
asm
  mov eax, dword ptr [ebp+$08];
  rol eax, $08;
  xor al, al;
  ror eax, $08;
end;

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 :) 

0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
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

@+
Cirec

0
cs_TouTSpeed Messages postés 72 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 30 août 2007
5 nov. 2006 à 15:34
bjr  f0xi ta méthode m'intéresse beaucoup surtout niveau gain de temps !!!

// solution 4 [31..47ms 8MPixels] !best! :
function Pixel24ToInt4(const P24: TPixel24bit): Integer;
asm
  mov eax, dword ptr [ebp+$08];
  rol eax, $08;
  xor al, al;
  ror eax, $08;
end;

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?

encore un grand merci !
0
cs_TouTSpeed Messages postés 72 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 30 août 2007
5 nov. 2006 à 15:43
rebonjour

je viens de trouver le soucis

je pense en fait que c'est a cause du tableau de 3 car moi je ne l'utilise pas je lis pixel par pixel !

car j'ai besoin de savoir pour la suite les valeur R V B !

je continue mes tests merci
0
cs_TouTSpeed Messages postés 72 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 30 août 2007
5 nov. 2006 à 16:00
bonjour cirec je viens de tester ta méthode

ça marche super comme avec mon programme en C que javais fait auparavant ( temps d'exécution .... )

merci
0
Rejoignez-nous