Autor Beitrag
thorbenZ
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 23.10.03 17:53 
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:
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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:
www.engineering.uiow...s/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

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
thorbenZ Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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