écriture lecture ram ???? [Résolu]

cs_TouTSpeed 72 Messages postés jeudi 5 janvier 2006Date d'inscription 30 août 2007 Dernière intervention - 3 nov. 2006 à 22:20 - Dernière réponse : f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention
- 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
Afficher la suite 

32 réponses

Répondre au sujet
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 4 nov. 2006 à 17:05
+3
Utile
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;

Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de f0xi
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 4 nov. 2006 à 00:53
0
Utile
Salut TouTSpeed,

TMemoryStream me semble tout indiqué pour faire ça.
N'est-ce pas ce que tu utilises?
Commenter la réponse de Caribensila
cs_TouTSpeed 72 Messages postés jeudi 5 janvier 2006Date d'inscription 30 août 2007 Dernière intervention - 4 nov. 2006 à 00:57
0
Utile
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 !
Commenter la réponse de cs_TouTSpeed
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 4 nov. 2006 à 01:08
0
Utile
Si t'as un souci, regarde:

http://www.delphifr.com/codes/UTILISER-TSTREAM-AISEMENT_39367.aspx

Ca restera entre nous...  :D
Commenter la réponse de Caribensila
cs_TouTSpeed 72 Messages postés jeudi 5 janvier 2006Date d'inscription 30 août 2007 Dernière intervention - 4 nov. 2006 à 01:21
0
Utile
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  !
Commenter la réponse de cs_TouTSpeed
cs_TouTSpeed 72 Messages postés jeudi 5 janvier 2006Date d'inscription 30 août 2007 Dernière intervention - 4 nov. 2006 à 18:31
0
Utile
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 !
Commenter la réponse de cs_TouTSpeed
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 4 nov. 2006 à 19:16
0
Utile
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.


 
Commenter la réponse de Caribensila
cs_TouTSpeed 72 Messages postés jeudi 5 janvier 2006Date d'inscription 30 août 2007 Dernière intervention - 4 nov. 2006 à 19:22
0
Utile
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
Commenter la réponse de cs_TouTSpeed
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 4 nov. 2006 à 19:29
0
Utile
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...
Commenter la réponse de Caribensila
cs_TouTSpeed 72 Messages postés jeudi 5 janvier 2006Date d'inscription 30 août 2007 Dernière intervention - 4 nov. 2006 à 19:33
0
Utile
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 ?
Commenter la réponse de cs_TouTSpeed
cs_TouTSpeed 72 Messages postés jeudi 5 janvier 2006Date d'inscription 30 août 2007 Dernière intervention - 4 nov. 2006 à 19:44
0
Utile
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
Commenter la réponse de cs_TouTSpeed
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 4 nov. 2006 à 19:46
0
Utile
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

Commenter la réponse de Cirec
cs_TouTSpeed 72 Messages postés jeudi 5 janvier 2006Date d'inscription 30 août 2007 Dernière intervention - 4 nov. 2006 à 19:53
0
Utile
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 !
Commenter la réponse de cs_TouTSpeed
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 4 nov. 2006 à 19:55
0
Utile
Cirec a tout-à-fait raison.
Par contre la méthode de lecture octet par octet est pédagogiquement intéressante pour ToutSpeed, je trouve...
Commenter la réponse de Caribensila
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 4 nov. 2006 à 19:57
0
Utile
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

Commenter la réponse de Cirec
cs_TouTSpeed 72 Messages postés jeudi 5 janvier 2006Date d'inscription 30 août 2007 Dernière intervention - 4 nov. 2006 à 20:04
0
Utile
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 !
Commenter la réponse de cs_TouTSpeed
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 5 nov. 2006 à 05:45
0
Utile
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 :) 

Commenter la réponse de f0xi
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 5 nov. 2006 à 12:28
0
Utile
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

Commenter la réponse de Cirec
cs_TouTSpeed 72 Messages postés jeudi 5 janvier 2006Date d'inscription 30 août 2007 Dernière intervention - 5 nov. 2006 à 15:34
0
Utile
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 !
Commenter la réponse de cs_TouTSpeed
cs_TouTSpeed 72 Messages postés jeudi 5 janvier 2006Date d'inscription 30 août 2007 Dernière intervention - 5 nov. 2006 à 15:43
0
Utile
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
Commenter la réponse de cs_TouTSpeed

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.

écriture lecture ram ???? - page 2