Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi JPG kleiner machen mit Qualitaet einstellen (https://www.delphipraxis.net/128875-jpg-kleiner-machen-mit-qualitaet-einstellen.html)

Magier 8. Feb 2009 04:00


JPG kleiner machen mit Qualitaet einstellen
 
Guten Abend und erstmal viele Gruesse aus Ecuador ;) ,

ich bin gerade dabei ein Programm zu schreiben das Fotos auf nen FTP hochlaed. Soweit kein Prob, allerdings sollen von den Foto Thumbs erstellt werden mit. Und ich moechte hinzufuegen dass man die JPG Qualitaet einstellen kann beim verkleinern? Wie ist das moeglich?

Hier die funktion mit der ich die JPG verkleinere:
Delphi-Quellcode:
procedure Resizepicture(old_filename, new_filename: string; width, height: integer);
var
  bmp:TBitmap;
  jpeg:TJpegImage;
  x, y:integer;
begin
  Jpeg:=TJpegImage.Create;
  try
    jpeg.LoadFromFile(old_filename);
    bmp:=TBitmap.Create;
      try
        x := jpeg.Width;
        y := jpeg.Height;
        new_size(x, y, width, height);
        bmp.width:=x;
        bmp.Height:=y;
        bmp.canvas.StretchDraw(Rect(0,0,bmp.width,bmp.height),jpeg);
        jpeg.assign(bmp);
      finally
        bmp.free;
      end;
      jpeg.SavetoFile(new_filename);
  finally
    jpeg.free;
  end;
end;
es gibt leider kein jpeg.quality oder so etwas, wie geht das?

und meine zweite Frage ist mathematischer natur:

Ich muss ja die neue Groesse berechnen und ich bekomme es irgendwie nicht hin die so auszurechnen um das Thumb in genau der gleichen Groessenordnung zu bekommen wie das herkunftsbild?

Hier meine funktion new_size:
Delphi-Quellcode:
procedure new_size(x, y, max_x, max_y: integer);
var xtel, ytel: real;
change: integer;
havetochange: boolean;
begin
  if x < y then begin
    change := x;
    x := y;
    y := change;
    havetochange:= true;
  end;
  if max_x < max_y then begin
    change := x;
    x := y;
    y := change;
    havetochange := not havetochange;
  end;

  if ((x < max_x) AND (y < max_y)) then
    exit;
  xtel := x / max_x;
  ytel := y / max_y;
  if xtel < ytel then begin
    //hier muesste ja die neue zuweisung hin, da komm ich aber nicht dahinter
  end
  else begin
    //hier muesste ja die neue zuweisung hin, da komm ich aber nicht dahinter
  end;

  if havetochange then begin
    change := x;
    x := y;
    y := change;
  end;
end;
Oder hat zufaellig noch jemand eine entsprechende Funktion zuhause rumfliegen und verstauben? ;)

Gute Nacht
vom Magier

Blackheart 8. Feb 2009 07:32

Re: JPG kleiner machen mit Qualitaet einstellen
 
CompressionQuality

Matze 8. Feb 2009 07:45

Re: JPG kleiner machen mit Qualitaet einstellen
 
Anschließend aber Delphi-Referenz durchsuchenCompress nicht vergessen.

Zur zweiten Frage: Hast du die Suchfunktion bemüht? Gib als Suchbegriff "Thumbnail" ein und lasse nur im Multimedia-Forum suchen. Da ist sicher etwas für dich dabei: Das Suchergebnis.

Grüße, Matze

nuclearping 8. Feb 2009 08:16

Re: JPG kleiner machen mit Qualitaet einstellen
 
Wenn ich's richtig verstanden hab:
Delphi-Quellcode:
xtel := x / max_x;
  ytel := y / max_y;
  if xtel < ytel then begin
    // Dividieren = Kleiner ... Evtl noch prüfen, ob Bild größer wird, denn dann Multiplizieren
    x := x / xtel;
    y := y / xtel;
  end
  else begin
    // Dividieren = Kleiner ... Evtl noch prüfen, ob Bild größer wird, denn dann Multiplizieren
    x := x / ytel;
    y := y / ytel;
  end;

DeddyH 8. Feb 2009 15:29

Re: JPG kleiner machen mit Qualitaet einstellen
 
http://www.delphipraxis.net/internal...=978676#978676 (allerdings ohne Kompression).

himitsu 8. Feb 2009 15:45

Re: JPG kleiner machen mit Qualitaet einstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich hatte mir mal dieses kleine Teil gebastelt, welches von allen JPEGs in seinem Verzeichnis 'ne kleinere Version erstellt.

isilive 8. Feb 2009 23:45

Re: JPG kleiner machen mit Qualitaet einstellen
 
Was deine
Delphi-Quellcode:
procedure new_size(x, y, max_x, max_y: integer);
betrifft:
Viele Wege führen nach Rom... (Obwohl mir deine Funktion da etwas zu chaotisch vom Aufbau her ist)

Ich würde es so lösen:

Delphi-Quellcode:
Faktor1:=x/max_x;
Faktor2:=y/max_y;
//Ergibt für jede Dimension den nötigen Verkleinerungsfaktor
Faktor:=Max(Faktor1,Faktor2);
x:=round(x/Faktor);
y:=round(y/Faktor);
Aufpassen: ich denke oben in der Variablenübernahme muss ein VAR hin, sonst werden x und y zwar ausgerechnet, aber nicht mehr in die Hauptprozedur zurückgegeben, oder?! Stichwort "Referenzübergabe".
Delphi-Quellcode:
procedure new_size(var x, y, max_x, max_y: integer);


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:12 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