Einzelnen Beitrag anzeigen

Magier

Registriert seit: 2. Okt 2004
Ort: Bergisch Gladbach
39 Beiträge
 
Delphi 7 Personal
 
#1

JPG kleiner machen mit Qualitaet einstellen

  Alt 8. Feb 2009, 05:00
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
  Mit Zitat antworten Zitat