Entwickler-Ecke

Multimedia / Grafik - Thumbnail generieren und Glätten


thorbenZ - Do 23.10.03 17:53
Titel: Thumbnail generieren und Glätten
Hallo,

ich bin derzeit dabei, eine Art Content Management System zu programmieren und muss dafür JPEG-Dateien verkleinern. Ich benutze dafür die folgende Routine:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
function Thumbnail(InStream: TStream;Width, Height: Integer; FillColor: TColor=clWhite):TBitmap;
var
  JpegImage: TJpegImage;
  Bitmap: TBitmap;
  Ratio: Double;
  ARect: TRect;
  AHeight, AHeightOffset: Integer;
  AWidth, AWidthOffset: Integer;
begin
//  Check for invalid parameters
  if Width<1 then
    raise Exception.Create('Invalid Width');
  if Height<1 then
    raise Exception.Create('Invalid Height');
  JpegImage:=TJpegImage.Create;
  try
//  Load the image
    JpegImage.LoadFromStream(InStream);
// Create bitmap, and calculate parameters
    Bitmap:=TBitmap.Create;
    try
      Ratio:=JpegImage.Width/JpegImage.Height;
      if Ratio>1 then
      begin
        AHeight:=Round(Width/Ratio);
        AHeightOffset:=(Height-AHeight) div 2;
        AWidth:=Width;
        AWidthOffset:=0;
      end
      else
      begin
        AWidth:=Round(Height*Ratio);
        AWidthOffset:=(Width-AWidth) div 2;
        AHeight:=Height;
        AHeightOffset:=0;
      end;
      Bitmap.Width:=Width;
      Bitmap.Height:=Height;
      Bitmap.Canvas.Brush.Color:=FillColor;
      Bitmap.Canvas.FillRect(Rect(0,0,Width,Height));
// StretchDraw original image
      ARect:=Rect(AWidthOffset,AHeightOffset,AWidth+AWidthOffset,AHeight+AHeightOffset);
      Bitmap.Canvas.StretchDraw(ARect,JpegImage);
// Assign back to the Jpeg, and save to the file
        Result := Bitmap;
finally
end;
finally
end;

end;

Das funktioniert auch wunderbar. Allerdings würde ich das Bild gerne noch glätten, wie es z.B. Photoshop tut. Hier im Forum habe ich nur was zu Interpolationsverfahren zum Hochrechnen gefunden, wie stelle ich es an, wenn ich das Bild verkleinern will?

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


Keldorn - Do 23.10.03 19:03

Hallo

es ist egal, ob du verkleinerst oder vergrößerst. meine Erfahrung ist, daß du mit einer bikubischen interpolation meist die besseren Ergebnisse erzielst, insbesondere bei starken Verkleinerungen/Vergrößerungen.
war recht interessant:
http://www.engineering.uiowa.edu/~gec/248_s00_students/blake_carlson/hw2/
wenn du es erst mal alleine probieren willst (ist auch c-Bsp-code dabei). wenn nicht, kann ich ( dank Christians Hilfe :) ) Dir auch ein paar Schnelle Funktionen zukommen lassen.

Edit: ich wäre an deiner Stelle mit der Bitmap als Funktionsrückgabe vorsichtig, hier verlierst man schnell den überblick und schafft sich ein Speicherloch

Mfg Frank


thorbenZ - Do 23.10.03 19:12

Danke erstmal für die Antwort. Ist ja ein komplexes Thema, danke für den Artikel. Für die Funktionen wäre ich dir tatsächlich dankbar, denn das scheint mir ja schonmal ne hübsche Aktion zu werden ;)

Danke schonmal für die Funktionen ;).

Thorben