Avatar billede KurtG Forsker
29. april 2022 - 14:24 Der er 1 løsning

Delphi5. Kan ikke tegne på Image

Jeg har problem med nedenstående:
Når jeg med "FormActivate" har hentet et billede ind i Image1, kan jeg ikke med de nedenstående Mouse-rutiner på Image1 tegne rammen om det, der skal kopieres til Image2.
Programmet løber fint igennem Mouse-procedurerne, men det ser ud som om X- og  Y-koordinaterne ikke overføres.

Jeg har et andet program, hvor jeg med "btnHentBilledeClick" (vist nederst) henter billedet, og ellers bruger de samme Mouse-procedurer.
Det fungerer fint!
Hvad gør jeg galt?

//-------------------------------------------------------
procedure TKopiForm.FormActivate(Sender: TObject);
Var
  Bmp: TBitmap;
  Jpg: TJPEGImage;
begin
  ProgDir := GetCurrentDir;
  MaxWdt := 449;
  MaxHgh := 449;
  DrawDone := false;
  HarHentetNy := False;
  //Konverter jpg-filen til BMP og gem
  Bmp := Tbitmap.Create;
  Jpg := TJPEGImage.Create;
  Jpg.LoadFromFile(KopiBilledeNavn);
  Bmp.Assign(Jpg);  //  Indeholer nu "KopiBilledeNavn" som BMP
  Bmp.SaveToFile(ProgDir+'\_BMP_File.bmp');
  bmp.Free;
  Jpg.Free;
  Image1.Picture.LoadFromFile(ProgDir+'\_BMP_File.bmp');
  FindPicxy(KopiBilledeNavn,449); //Fast bredde
  KopiForm.Image1.Width := PicWdt;
  KopiForm.Image1.Height := PicHgh;
end;

//-------------------------------------------------------
procedure TKopiForm.Image1MouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
begin
  //Her skal startpunktet opsættes
  Drawing := True;
  DrawDone := False;
  Image1.Canvas.Pen.Width := 3;
  StartX := Round(X * ScaleFaktor);
  StartY := Round(Y * ScaleFaktor);
  SlutX := Round(X * ScaleFaktor);
  SlutY := Round(Y * ScaleFaktor);
  Image1.Canvas.Pen.Mode := pmNotXor;
  //Slet rammen
  Image1.Canvas.Rectangle(SletStartX, SletStartY, SletSlutX, SletSlutY);
  HarHentetNy := True;
end;

//-------------------------------------------------------
procedure TKopiForm.Image1MouseMove(Sender: TObject; Shift: ShiftState; X,  Y: Integer);
begin
  if Drawing then
  begin
    Image1.Canvas.Pen.Mode := pmNotXor;
    Image1.Canvas.Rectangle(StartX, StartY, SlutX, SlutY);
    SlutX := Round(ScaleFaktor * X);
    //ScaleFaktor er forhold mellem Image1 bredde og billedets bredde
    SlutY := Round(ScaleFaktor * Y);
    Image1.Canvas.Pen.Mode := pmNotXor;
    Image1.Canvas.Rectangle(StartX, StartY, SlutX, SlutY);
  end;
  Image1.Canvas.Pen.Mode := pmCopy;
end;

//-------------------------------------------------------
procedure TKopiForm.Image1MouseUp(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
begin
  If Drawing Then
  Begin
    Kopier();  //Kopierer det udvalgte område på Image2
  End;
  Drawing := False;
  SletStartX := StartX;
  SletStartY := StartY;
  SletSlutX := SlutX;
  SletSlutY := SlutY;
  Image1.Canvas.Pen.Mode := pmNotXor;
  DrawDone := True;
end;

-----------------------------------------------------------------------------------------------
Fra originalt program

//-------------------------------------------------------
procedure TForm1.btnHentBilledeClick(Sender: TObject);
Var
  Bmp: TBitmap;
//  PicFormat,    //Billedformatet Bredde/Højde
//  ScaleFaktor:  //Forhold mellem Stretch og ikke-Stretch
begin
  HarHentetNy := True;
  Bmp := TBitmap.Create;
  if OpenPictureDialog1.Execute then
  Begin
    Image1.Canvas.Pen.Width := 3;
    Image1.Stretch := True;
    bmp.LoadFromFile(OpenPictureDialog1.FileName);
    FilNavn := OpenPictureDialog1.FileName;
    //Find formatet på billedet
    PicFormat := bmp.Width/bmp.Height;
    if PicFormat < 1 Then
    Begin  //Højere end bred
      Image1.Width := Round(PicFormat * MaxHgh);
      Image1.Height := MaxHgh;
    //Find Forhold mellem Stretch og ikke-Stretch
      ScaleFaktor := bmp.Height / Image1.Height;
    End
    Else
    Begin  //Brederre end høj
      Image1.Height := Round(PicFormat / MaxHgh);
      Image1.Width := MaxWdt;
      //Find Forhold mellem Stretch og ikke-Stretch
      ScaleFaktor := bmp.Width / Image1.Width;
    End;
    image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
    Bevel1.Width := Image1.Width+1;
    Bevel1.Height := Image1.Height+1;
  End;
  Bmp.Free;
end;
Avatar billede KurtG Forsker
30. april 2022 - 18:56 #1
Undskyld ulejligheden for jer, der har kikket på det.
Jeg fandt nu selv fejlen, jeg havde ikke fået opsat ScaleFaktor.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester