Traitement d'une image comment me passer d'un picturedialog ?
alex7532
Messages postés27Date d'inscriptionmercredi 26 avril 2006StatutMembreDernière intervention11 novembre 2008
-
13 févr. 2007 à 13:43
alex7532
Messages postés27Date d'inscriptionmercredi 26 avril 2006StatutMembreDernière intervention11 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.;)
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);
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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.
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
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;
// 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)
alex7532
Messages postés27Date d'inscriptionmercredi 26 avril 2006StatutMembreDernière intervention11 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 ?