AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi JPG öffnen, umrechnen und wieder speichern
Thema durchsuchen
Ansicht
Themen-Optionen

JPG öffnen, umrechnen und wieder speichern

Ein Thema von cumi · begonnen am 14. Mär 2005 · letzter Beitrag vom 28. Mär 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von cumi
cumi

Registriert seit: 27. Jun 2004
Ort: Schweiz
27 Beiträge
 
#1

JPG öffnen, umrechnen und wieder speichern

  Alt 14. Mär 2005, 19:11
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 ausas 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]
Lorenz
  Mit Zitat antworten Zitat
Benutzerbild von cumi
cumi

Registriert seit: 27. Jun 2004
Ort: Schweiz
27 Beiträge
 
#2

Re: JPG öffnen, umrechnen und wieder speichern

  Alt 14. Mär 2005, 22:32
[edit=thomasdrewermann]Bilder nur verlinkt Mfg, thomasdrewermann[/edit]
Lorenz
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: JPG öffnen, umrechnen und wieder speichern

  Alt 14. Mär 2005, 22:37
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.
  Mit Zitat antworten Zitat
Benutzerbild von cumi
cumi

Registriert seit: 27. Jun 2004
Ort: Schweiz
27 Beiträge
 
#4

Re: JPG öffnen, umrechnen und wieder speichern

  Alt 15. Mär 2005, 11:38
Ich hab meinen Text nicht zitiert!
Das mit dem verlinken dier Bilder ist aber ok..
Lorenz
  Mit Zitat antworten Zitat
Benutzerbild von cumi
cumi

Registriert seit: 27. Jun 2004
Ort: Schweiz
27 Beiträge
 
#5

Re: JPG öffnen, umrechnen und wieder speichern

  Alt 27. Mär 2005, 14:03
hat niemand eine Idee??
Lorenz
  Mit Zitat antworten Zitat
ol1uw

Registriert seit: 24. Jul 2004
Ort: Freiberg
69 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: JPG öffnen, umrechnen und wieder speichern

  Alt 27. Mär 2005, 14:14
img1 einen StretchFilter zuweisen.
z.B
Code:
img1.StretchFilter:=sfDraft;
mögliche Filter

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

Gruß Uwe
  Mit Zitat antworten Zitat
Benutzerbild von cumi
cumi

Registriert seit: 27. Jun 2004
Ort: Schweiz
27 Beiträge
 
#7

Re: JPG öffnen, umrechnen und wieder speichern

  Alt 27. Mär 2005, 16:52
thx! Werd ich versuchen...
Lorenz
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#8

Re: JPG öffnen, umrechnen und wieder speichern

  Alt 27. Mär 2005, 18:06
Warum so kompliziert ? 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;
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von cumi
cumi

Registriert seit: 27. Jun 2004
Ort: Schweiz
27 Beiträge
 
#9

Re: JPG öffnen, umrechnen und wieder speichern

  Alt 27. Mär 2005, 20:14
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?
Lorenz
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#10

Re: JPG öffnen, umrechnen und wieder speichern

  Alt 28. Mär 2005, 10:36
Jetzt musste ich es doch mal selbst ausprobieren :
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 .

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

[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.
Miniaturansicht angehängter Grafiken
1_947.jpg  
Angehängte Dateien
Dateityp: rar 800-600_561.rar (212,3 KB, 27x aufgerufen)
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:48 Uhr.
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