![]() |
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:
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:
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; ![]() Und das umgerechnete Bild, welches nun eine Auflösung von (800*600) hat sieht so aus:Das Orginalbild (1024*768) sieht so aus: ![]() 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] |
Re: JPG öffnen, umrechnen und wieder speichern
[edit=thomasdrewermann]Bilder nur verlinkt Mfg, thomasdrewermann[/edit]
|
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. |
Re: JPG öffnen, umrechnen und wieder speichern
Ich hab meinen Text nicht zitiert!
Das mit dem verlinken dier Bilder ist aber ok.. |
Re: JPG öffnen, umrechnen und wieder speichern
hat niemand eine Idee??
|
Re: JPG öffnen, umrechnen und wieder speichern
img1 einen StretchFilter zuweisen.
z.B
Code:
mögliche Filter
img1.StretchFilter:=sfDraft;
TStretchFilter = (sfNearest, sfLinear, sfSpline, sfLanczos, sfMitchell); Gruß Uwe |
Re: JPG öffnen, umrechnen und wieder speichern
thx! Werd ich versuchen...
|
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; |
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:
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.
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; 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? |
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:
Ich übernehme keine Haftung, wenn jemand ein wichtiges Bild überschreiben lässt :mrgreen: .
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; [edit] Ich nehme alles zurück, das wird ja als BMP gespeichert :shock: . [edit2] Jetzt aber:
Delphi-Quellcode:
Die Namensgebung ist vielleicht etwas schlecht, naja, hauptsache es geht.
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz