Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi JPG öffnen, umrechnen und wieder speichern (https://www.delphipraxis.net/42156-jpg-oeffnen-umrechnen-und-wieder-speichern.html)

cumi 14. Mär 2005 18:11


JPG öffnen, umrechnen und wieder speichern
 
Hallo Zusammen

Ich bin an einer Prozedur, welche JPG-Bilder öffnet, in TBitmap32 umwandelt, dort die grösse umrechnet und dann wieder als jpg speichert.
Es muss ein TBitmap32 sein weil ich später noch ein Logo halbtransparent raufzeichen möchte...
hier der Code:
Delphi-Quellcode:
var
  e      :TListElement;
  hp     :TpListElement;
  i      :Integer;
  img1    :TBitmap32;
  img2    :TBitmap;
  jpg    :TJPEGImage;
  dheight,
  dwidth,
  nheight,
  nwidth,
  quali  :Integer;
begin
  dwidth :=StrToInt(EdNWidth.Text);
  dheight:=StrToInt(EdNHeight.Text);
  quali :=StrToInt(EdQuali.Text);
  i:=1;
  hp:=pFirst;
  while hp<>pLast do begin
    hp:=hp^.pNext;
    inc(i);
  end;
  Pb.Max:=i;
  i:=1;
  if FirstListEl(e) then begin
    repeat
      jpg:=TJPEGImage.Create;
      jpg.Performance:=jpBestQuality;
      jpg.CompressionQuality:=100;
      jpg.LoadFromFile(e.pfad+'\'+e.name);
      img1:=TBitmap32.Create;
      img1.Assign(jpg);
      jpg.Free;
      if (img1.Height/img1.Width)>=(dheight/dwidth) then begin
        nheight:=dheight;
        nwidth :=round(nheight*img1.width/img1.height);
      end
      else begin
        nwidth:=dwidth;
        nheight :=round(img1.Height/img1.Width*nwidth);
      end;
      img2:=TBitmap.Create;
      img2.Width:=nwidth;
      img2.Height:=nheight;
      img1.DrawTo(img2.Canvas.Handle,
                  rect(0,0,nwidth,nheight),
                  rect(0,0,img1.Width,img1.Height));
      jpg:=TJPEGImage.Create;
      jpg.Performance:=jpBestQuality;
      jpg.CompressionQuality:=quali;
      jpg.Assign(img2);
      jpg.SaveToFile(e.pfad+'\_'+e.name);
      inc(i);
      Pb.Position:=i;
      jpg.Free;
      img1.Free;
      img2.Free;
    until not NextListEl(e);
  end;
  Pb.Position:=0;
Also und jetzt das Problem. Eigentlich funktioniert alles ganz schön. Ausser, dass irgendetwas mit den Farben nicht ganz stimmt. Das Orginalbild (1024*768) sieht so aus:http://lorenz.koestler.ch/other/1.JPG
Und das umgerechnete Bild, welches nun eine Auflösung von (800*600) hat sieht so aus:Das Orginalbild (1024*768) sieht so aus:http://lorenz.koestler.ch/other/_1.JPG

Weiss jemand woran das liegt? Ich vermute, dass ich irgendetwas mit den Farbeinstellungen von der TBitmap32 Variabel falsch mache, nur was?

Hat vielleicht jemand noch eine Idee, was ich noch verschnellern könnte?

[edit=thomasdrewermann] Mfg, thomasdrewermann[/edit]

cumi 14. Mär 2005 21:32

Re: JPG öffnen, umrechnen und wieder speichern
 
[edit=thomasdrewermann]Bilder nur verlinkt Mfg, thomasdrewermann[/edit]

Matze 14. Mär 2005 21:37

Re: JPG öffnen, umrechnen und wieder speichern
 
Eine Bitte: Zitiert doch nicht immer den kompletten Beitrag, sondern nur das nötigste. Die Bilder z.B. sind sowas von Unwichtig.
Und zu den Bildern: Die sind im Anhang besser aufgehoben, so lädt die Seite recht langsam (v.a. für Modem-Besitzer) und außerdem gibt es unter 1024 x 768 einen horizontalen Scrollbalken.

cumi 15. Mär 2005 10:38

Re: JPG öffnen, umrechnen und wieder speichern
 
Ich hab meinen Text nicht zitiert!
Das mit dem verlinken dier Bilder ist aber ok..

cumi 27. Mär 2005 13:03

Re: JPG öffnen, umrechnen und wieder speichern
 
hat niemand eine Idee??

ol1uw 27. Mär 2005 13:14

Re: JPG öffnen, umrechnen und wieder speichern
 
img1 einen StretchFilter zuweisen.
z.B
Code:
img1.StretchFilter:=sfDraft;
mögliche Filter

TStretchFilter = (sfNearest, sfLinear, sfSpline, sfLanczos, sfMitchell);

Gruß Uwe

cumi 27. Mär 2005 15:52

Re: JPG öffnen, umrechnen und wieder speichern
 
thx! Werd ich versuchen...

Khabarakh 27. Mär 2005 17:06

Re: JPG öffnen, umrechnen und wieder speichern
 
Warum so kompliziert :wink: ? Probier es doch einfach mal so:
Delphi-Quellcode:
uses ..., JPEG, ...;

[...]

var Bit1, Bit2: TBitmap32;
begin
  Bit1 := TBitmap32.Create;
  Bit2 := TBitmap32.Create;
  Bit1.LoadFromFile('xyz.jpg');
  StretchTransfer( ... );
  Bit2.SaveToFile('xyz.jpg');
end;

cumi 27. Mär 2005 19:14

Re: JPG öffnen, umrechnen und wieder speichern
 
ok, war wirklich einwenig kompliziert... ich habs nunmal vereinfacht und mich auf Bitmaps beschränkt. Nun sieht das ganze so aus:
Delphi-Quellcode:
      img1:=TBitmap.Create;
      img1.LoadFromFile(e.pfad+'\'+e.name);
      if (img1.Height/img1.Width)>=(dheight/dwidth) then begin
        nheight:=dheight;
        nwidth :=round(nheight*img1.width/img1.height);
      end
      else begin
        nwidth:=dwidth;
        nheight :=round(img1.Height/img1.Width*nwidth);
      end;
      img2:=TBitmap.Create;
      img2.Width:=nwidth;
      img2.Height:=nheight;
      StretchBlt(img2.Canvas.Handle,0,0,nwidth,nheight,
                 img1.Canvas.Handle,0,0,img1.Width,img1.Height,SRCCOPY);
      img2.SaveToFile(e.pfad+'\_'+e.name);
      img1.Free;
      img2.Free;
Nur leider funktioniert es immernoch nicht richtig. Ich dachte vielleicht gets mit der StretchBlt funktion. Das Ergebnis ist aber genau das gleiche wie beim Draw der gr32.
Bei SW-Bildern ist das Problem ebenfalls vorhanden...

Einer BitMap-Variabel lässt sich kein StretchFilter zuweisen und bei der BitMap32 hats nichts gebracht...

Sonst noch jemand eine Idee?

Khabarakh 28. Mär 2005 09:36

Re: JPG öffnen, umrechnen und wieder speichern
 
Liste der Anhänge anzeigen (Anzahl: 2)
Jetzt musste ich es doch mal selbst ausprobieren :wink: :
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var  Bit1, Bit2: TBitmap32;
const SrcRect: TRect = (Left: 0; Top: 0; Right: 1024; Bottom: 768);
      DstRect: Trect = (Left: 0; Top: 0; Right: 800; Bottom: 600);
begin
  if not OpenDialog1.Execute then
    Exit;
  Bit1 := TBitmap32.Create;
  Bit2 := TBitmap32.Create;
  Bit1.LoadFromFile(OpenDialog1.FileName);
  Bit2.SetSize(DstRect.Right, DstRect.Bottom);
  StretchTransfer(Bit2, DstRect, DstRect, Bit1, SrcRect, sfLinear, dmOpaque);
  Bit2.SaveToFile(OpenDialog1.FileName);
  Bit1.Free;
  Bit2.Free;
end;
Ich übernehme keine Haftung, wenn jemand ein wichtiges Bild überschreiben lässt :mrgreen: .

[edit] Ich nehme alles zurück, das wird ja als BMP gespeichert :shock: .

[edit2] Jetzt aber:
Delphi-Quellcode:
var  Bit1, Bit2: TBitmap32;
      JBit: TJPEGImage;
      Bit: TBitmap;
const SrcRect: TRect = (Left: 0; Top: 0; Right: 1024; Bottom: 768);
      DstRect: Trect = (Left: 0; Top: 0; Right: 800; Bottom: 600);
begin
  if not OpenDialog1.Execute then
    Exit;
  Bit1 := TBitmap32.Create;
  Bit2 := TBitmap32.Create;
  JBit := TJPEGImage.Create;
  Bit := TBitmap.Create;
  Bit1.LoadFromFile(OpenDialog1.FileName);
  Bit2.SetSize(DstRect.Right, DstRect.Bottom);
  StretchTransfer(Bit2, DstRect, DstRect, Bit1, SrcRect, sfLinear, dmOpaque);
  Bit.Width := DstRect.Right;
  Bit.Height := DstRect.Bottom;
  BitBlt(Bit.Canvas.Handle, 0, 0, 800, 600, Bit2.Handle, 0, 0, SRCCOPY);
  JBit.Assign(Bit);
  JBit.SaveToFile(OpenDialog1.FileName);
  Bit1.Free;
  Bit2.Free;
  Bit.Free;
  JBit.Free;
end;
Die Namensgebung ist vielleicht etwas schlecht, naja, hauptsache es geht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:58 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz