Avatar billede KurtG Forsker
03. september 2022 - 11:38 Der er 2 kommentarer og
1 løsning

Delphi. CopyRect giver mærkelig resultat med jpg-billeder

Jeg bruger Copyrect til at kopiere noget fra et image til et andet.
Det giver fejl, det ser ud til, at kontrasten i dest.image er kraftig øget eller billedet er gjort mørkere.
Det kan ses på http://kg2.dk/Delphi/Fejl.htm

Imidlertid har jeg fundet ud af, at det kun er ved *.jpg-billeder. Bruger jeg *.bmp-billeder ser resultatet OK ud, selv om det er de samme billeder, idet jeg har konverteret *.jpg-billederne til *.bmp med Irfanview.

Jeg bruger unitten JPEG, og jeg formode, at det er den, der ikke fungerer korrekt.
Er der andre, der har haft lignende oplevelser med JPEG, og hvad har I i givet tilfælde gjort for at afhjælpe det?
Avatar billede Keld Broe Seniormester
22. januar 2023 - 17:28 #1
Det kan være, at der er nogle problem med JPEG-kompressionsindstillingerne, når du bruger CopyRect-metoden. Prøv at ændre kompressionsindstillingen for billedet, inden du bruger CopyRect-metoden. Du kan også prøve at bruge en anden billedbehandlingskomponent eller bibliotek til at håndtere billedkopiering, for eksempel Graphics32 eller VCL.Graphics.
Du kan også prøve at konvertere billedet til et andet format, før du bruger CopyRect-metoden, for eksempel PNG eller BMP. Dette kan hjælpe med at undgå kompressionsfejl i billedet.
Avatar billede KurtG Forsker
23. januar 2023 - 00:14 #2
Jeg har igen kikket på programmet og kan ikke lige se, hvordan det skulle være tilfældet!
Filerne bliver hentet ind i det venstre Image1, hvis det er en *.bmp næsten direkte:
      bmp.LoadFromFile(OpenPictureDialog1.FileName);
      bmp.SaveToFile(ProgDir+'\jpg2bmp.bmp');

Hvis det er *.jpg via dette:
      jpg.LoadFromFile(OpenPictureDialog1.FileName);
      bmp.Assign(jpg);
      bmp.SaveToFile(ProgDir+'\jpg2bmp.bmp');

og til sidst ind i Image1 via:
  Image1.Picture.LoadFromFile(ProgDir+'\jpg2bmp.bmp');
 
Så hvis der er fejl, burde de kunne ses på Image1.

Kopieringen foregår således:
//-------------------------------------------------------
Function Kopier():Boolean;
Var PicFormat, xdif, ydif: Real;
    xx1, xx2, yy1, yy2: Integer;
begin
  Form1.image2.Picture := NIL;
  Form1.Image2.Width := MaxWdt;
  Form1.Image2.Height := MaxHgh;
  xx1 := StartX;  xx2 := SlutX; yy1 := StartY;  yy2 := SlutY;
  if xx1 > xx2 Then Begin StartX := xx2; SlutX := xx1; End;
  if yy1 > yy2 Then Begin StartY := yy2; SlutY := yy1; End;

  xdif :=  (SlutX - StartX);
  ydif :=  (SlutY - StartY);
  If (xdif <> 0) AND (ydif <> 0) Then
  Begin
    PicFormat := xdif / ydif;
    if PicFormat < 1 Then
    Begin  //højere end bred
      Form1.image2.Width := Round(MaxHgh * PicFormat);
      Form1.image2.Height := MaxHgh;
    End
    Else
    Begin  //  Bredere end høj
      Form1.image2.Height := Round(MaxWdt / PicFormat);
      Form1.image2.Width := MaxWdt;
    End;
    Form1.Image2.Canvas.CopyRect(Rect(0,0,Form1.Image2.Width,Form1.Image2.Height),
        Form1.Image1.Canvas, Rect(StartX+PenWidth,StartY+PenWidth,
              SlutX-PenWidth,SlutY-PenWidth));
  End;
end;
Avatar billede KurtG Forsker
12. marts 2023 - 17:58 #3
Så har jeg fundet ud af, hvad jeg har gjort galt:
Under kopieringen har både Image1 og Image2 stretch sat til true.
Hvis jeg sætter Image2.Height og Image.Width til samme værdier, som det kopierede udsnit og Image2.stretch til False, virker det.
Dum fejl!
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

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