Traitement d'une image comment me passer d'un picturedialog ?

alex7532 Messages postés 27 Date d'inscription mercredi 26 avril 2006 Statut Membre Dernière intervention 11 novembre 2008 - 13 févr. 2007 à 13:43
alex7532 Messages postés 27 Date d'inscription mercredi 26 avril 2006 Statut Membre Dernière intervention 11 novembre 2008 - 13 févr. 2007 à 22:25
Bonjour tout le monde.
Le programme ci-dessous traite une image qu'on a précédemment séléctionné dans un TopenPictureDialog
mais je souhaiterai que cette image soit traité lorsque je coche une checkbox ou bien par l'intermediaire d'un timer, en fait ce qu'il me faut c'est me passer de ce picturedialog qui m'embete:) mais je n'y parviens pas. c'est pour ça que j'aurai grandement besoin d'aide. :)
Je vous remercie par avance d'avoir pris le temps de me répondre si réponse il y a.;)

unit Unit1;





interface





uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, Gauges, ExtDlgs, StdCtrls;





type
  TForm1 = class(TForm)
    Image1: TImage;
    Gauge1: TGauge;
    BDDI: TOpenPictureDialog;
    procedure Image1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
    TypeRGB       = Record
                        Bleu, Vert, Rouge : Byte;
                  End;
     TypeTRGBArray = Array [0..12000] Of TypeRGB;
     TypePRGBArray = ^TypeTRGBArray;







var
  PixelsI2:array[0..9000000] of integer;
   n,n2:integer;
  Form1: TForm1;


implementation


{$R *.dfm}


function Ouvririmg(BDImage:TOpenPictureDialog;Image:Timage):boolean;
var
jpg:Tjpegimage; // variable pr creation jpg(Mettre Jpeg Dans USES)
begin
result:=false; // si cette condition n'est pas bonne ben pas de fonction


if BDImage.Execute then
begin
 jpg:=Tjpegimage.Create;
 // si jpeg alors petite transfo oblige pr pouvoir la modif
 if Uppercase(ExtractFileExt(BDImage.FileName))='.JPG' then // extension
 begin
 jpg.LoadFromFile(BDImage.FileName); // charge
 jpg.PixelFormat:=jf24Bit;           // ts aux meme col
 image.Picture.Bitmap.Assign(jpg);  // on transfert a image1
 end;
 // si bmp alors facile !
 if Uppercase(ExtractFileExt(BDImage.FileName))='.BMP' then
 begin
 image.Picture.bitmap.LoadFromFile(BDImage.FileName);
 image.Picture.Bitmap.PixelFormat:=pf24bit;
 end;
 jpg.Free;
 result:=true;
end;


end;


procedure TForm1.Image1Click(Sender: TObject);
var
Scan : TypePRGBArray;
x,y:integer;
mv,mb,mr: Integer;
begin
if ouvrirImg(BDDI,image1)=true then
begin
 gauge1.MaxValue:=image1.Picture.Bitmap.Height-1 ;
 n2:=0;


for y:=0 to image1.Picture.Bitmap.Height-1 do
begin
gauge1.Progress:=y;
Scan := image1.picture.Bitmap.ScanLine[Y];


for x:=0 to image1.Picture.Bitmap.Width-1 do
begin
// Valeurs en rouge vert et bleu
mR := Scan[X].Rouge;
mV := Scan[X].Vert;
mB := Scan[X].Bleu;
// Transo en rgb
PixelsI2[n2]:=rgb(mr,mv,mb);
inc(n2);


end;
end;
end;
end;


end.




[
]

3 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
13 févr. 2007 à 19:22
alors ::

il ne faut pas rendre une fonction dependante d'objet qui pourrait ne pas exister!
cela permet de pouvoir la reutiliser tel quel dans d'autre programmes.

ensuite, il y a pas mal de chose a ameliorer.

voici un exemple ::

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1     : TButton;     // boutton pour ouvrir une image
    OpenDialog1 : TOpenDialog; // fenetre d'ouverture d'image
    Image1      : TImage;      // objet timage pour affiche l'image ouverte
    ListBox1    : TListBox;    // listbox qui permet d'afficher certaines valeurs du tableau
    Edit1       : TEdit;       // index inferieur du tableau pour la liste
    Edit2       : TEdit;       // index superieur du tableau pour la liste
    Button2     : TButton;     // boutton qui permet d'afficher la liste
    Label1      : TLabel;      // label qui donne l'intervalle du tableau

    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses JPeg;

type
  pPixel24b = ^TPixel24b;
  TPixel24b = record     
     B,G,R : byte;
  end;
  pScanLine24b = ^TScanline24b;
  TScanLine24b = array[0..32767] of TPixel24b;

  TPixels = array of integer; // tableau de pixel RGB

{ transmets les pixels d'un bitmap a un TPixels
  params
    BmpSrc [I] bitmap source
    Pixels [O] tableau de pixels

  return
    integer, nombre de pixels total et taille de Pixels 
}
function BmpToPixels(BmpSrc : TBitmap; var Pixels : TPixels) : integer;
var
  X,Y,N : integer;
  pScan : pScanLine24b;
begin
  // nombre de pixels total
  result := (BmpSrc.Width * BmpSrc.Height);

  // passe en 24bits si ce n'est pas le cas
  if BmpSrc.PixelFormat <> pf24bit then
     BmpSrc.PixelFormat := pf24bit;

  // ajuste la taille du tableau
  if Length(Pixels) <> result then
     SetLength(Pixels, result);

  N := 0;
  for Y := 0 to BmpSrc.Height-1 do begin
      pScan := BmpSrc.ScanLine[Y];
      for X := 0 to BmpSrc.Width-1 do begin
          // BBGGRR >> RRGGBB
          with pScan[X] do
               Pixels[N] := integer( B or (G shl 8) or (R shl 16) );

          N := N + 1;
      end;
  end;
end;

{ ouvre une image (jpg, bmp) dans un bitmap
  params
    FileName [I] nom du fichier
    BmpDest  [O] bitmap de destination
 
  return
    boolean, true si l'operation c'est correctement deroulée
}
function OpenPicToBmp(const FileName : string; BmpDest : TBitmap) : boolean;
var Ext : string;
    jpg : TJPegImage;
begin
  result := false;

  // on recupere l'extention
  Ext := LowerCase( ExtractFileExt( FileName ) );

  // si JPEG (jpg ou jpeg)  if (Ext '.jpg') or (Ext '.jpeg') then begin
      jpg := TJPegImage.Create;
      // toujours mettre un bloc Try ... Finally
      try
        jpg.LoadFromFile(FileName);
        jpg.PixelFormat := jf24bit;
        BmpDest.Assign(jpg);
        BmpDest.PixelFormat := pf24bit;
        result := true;
      finally
        jpg.Free;
      end;
  end else
  // sinon si Bitmap
  if (Ext = '.bmp') then begin
     BmpDest.LoadFromFile(FileName);
     BmpDest.PixelFormat := pf24bit;
     result := true;
  end;
end;

// variable TPixels
var Pixels : TPixels;

{ ouverture d'une image }
procedure TForm1.Button1Click(Sender: TObject);
begin
  // si une image est ouverte
  if OpenDialog1.Execute then begin
     // et que l'ouverture se deroule correctement
     if OpenPicToBmp(OpenDialog1.FileName, Image1.Picture.Bitmap) then begin
        // on transmets le bitmap a pixels
        BmpToPixels(Image1.Picture.Bitmap, Pixels);
        // puis on affiche les bornes (index min/max) de Pixels
        Label1.Caption := '0..'+IntToStr(high(Pixels));
     end;
  end;
end;

{ affichage des données de Pixels }
procedure TForm1.Button2Click(Sender: TObject);
var N,iL,iH : integer;
begin
  // index inferieur
  iL := StrToInt(Edit1.Text);
  // index superieur
  iH := StrToInt(Edit2.Text);
  // verification de iL et iH dans 0..High(pixels)
  if (iL >= 0) and (iL < iH) and (iH < High(Pixels)) then begin
     // on vide ListBox
     ListBox1.Clear;
     // on la prepare au modif (augmente les performances)
     ListBox1.Items.BeginUpdate;

     for N := iL to iH do
         // affichage au format #RRGGBB
         ListBox1.Items.Add(format('#%.6x',[Pixels[N]]));

     // fin des modifs
     ListBox1.Items.EndUpdate;
  end;
end;

{ limite la saisie de Edit1 et Edit2 au chiffre }
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in ['0'..'9',#08]) then Key := #0;
end;

end.

voila j'espere que ça t'aideras une peu
<hr size="2" width="100%" />Croc (click me)
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
13 févr. 2007 à 19:28
visuellement ça peu donner ça :

<hr size="2" width="100%" />Croc (click me)
0
alex7532 Messages postés 27 Date d'inscription mercredi 26 avril 2006 Statut Membre Dernière intervention 11 novembre 2008
13 févr. 2007 à 22:25
Merci d'avoir répondu.:)
Mais dans ce que tu m'as posté il y a toujours un picture dialog.
Je voudrais que mon programme une fois lancé soit complètement autonome.
En fait ceci n'est qu'une partie d'un programme qui reconnait ou pas a l'aide d'une webcam une image.
Dans ce programme il y a l'affichage de la webcam, la capture d'une image de la webcam toutes les secondes et cette image apparait dans un Timage et est ajoutée dans une listbox.
Cette partie du programme sert a charger ceratins parametres d'une image (image1), il charge également l'image capturée(a laide la webcam).
Et avec un bouton j'ai un calcul mathématique qui vérifie la similarité ou non de ces deux images(une fois chargées) avec un coefficient de ressemblance.
Mais il faut que cette opération se fasse automatiquement sans picturedialog parce que je me vois mal charger l'image enregistrée de la capture toutes les secondes^^
Aurais-tu une solution ?
0
Rejoignez-nous