Einzelnen Beitrag anzeigen

hellboyPS

Registriert seit: 28. Dez 2009
5 Beiträge
 
#1

Problem bei Supersampling (Verkleinern einer TBitmap)

  Alt 28. Dez 2009, 13:07
Hallo liebe Foren-Mitglieder.
Ich programmiere seit einem halben mit Delphi und habe zu vielen mir aufgetauchten Fragen hier im Forum über die Forensuche oder über Google Antwort gefunden. Jedoch nicht zu diesem Problem.

Ich habe ein Programm geschrieben, dass die Mandelbrotmenge berechnet, was auch soweit sehr gut funktioniert. Jetzt habe ich mir überlegt das Bild schärfer zu machen und will Antialiasing (Supersampling) benutzen. Ich rendere also die Mandelbrotmenge vergrößert und muss sie danach möglichst intelligent auf die normale Größe bringen. Und das Problem liegt nun beim Verkleinern. Ich habe zuerst versucht Delphiinterne Funktionen wie StretchDraw() oder CopyRect() oder ähnliches, was aber immer zu einem schlechten Ergebnis führte (keine Verbesserung der Qualität!). Ich habe auch zu Testzwecken das größer gerenderte Bild als .bmp gespeichert und mit IrfanView geöffnet und dort wird es ja automatisch "verkleinert" zur Ansicht, da sieht es wunderbar aus.
Als Nächstes habe ich versucht einen eigenen Algorythmus zum Verkleinern geschrieben, welcher jedoch auch nicht wirklich die Qualität verbessert, einige Ungenauigkeiten und Fehler hat und außerdem recht viel Zeit beansprucht (4 bis 5 Sekunden, wobei die Delphiinternen Algorythmen ohne Zeitverzug arbeiten). Ich poste den Quellcode am Schluss (Vielleicht sind ja nur kleine Fehler drin =/ ).
Meine Frage ist also ob es etwas besonderes zu beachten gibt bei Supersampling und mein Ziel ist ein Algorythmus der das TBitmap qualitätsfördernd verkleinert.

Hier noch mein Quellcode zum Verkleinern meiner TBitmap:

Dabei ist Bitmap das groß gerenderte Bild (Höhe, Breite sind jeweils 400*Antialiase also beispielsweise bei 4x Antialiasing also 1600x1600) und die Variable Antialiase legt eben die Stärke vom Antialiasing fest (Also wie sehr das Bild vergrößert wurde)
Das Bild soll später die Maße 400x400 haben.
Das komplette Bild wird in Sektoren unterteilt und die Durchschnittsfarbe eines solchen Sektors wird ermittelt und damit das kleinere Bild erzeugt.

Delphi-Quellcode:
procedure TForm1.Antialiasing(Bitmap: TBitmap; Antialiase: Integer);
var secx,secy,x,y,sum:integer;
begin
 for secx := 0 to 399 do
 begin
  for secy := 0 to 399 do
  begin
   sum := 0;
   for x := 0 to Antialiase-1 do
   begin
    for y := 0 to Antialiase-1 do
    begin
     sum := sum+bitmap.canvas.Pixels[x+Antialiase*secx,y+Antialiase*secy];
    end;
   end;
   sum := round(sum/(Antialiase*Antialiase));
   bitmap.canvas.Pixels[secx,secy] := sum;
  end;
 end;
 bitmap.width := 400;
 bitmap.height := 400;
end;

Ich hoffe ihr könnt mir helfen

MfG hellboyPS
  Mit Zitat antworten Zitat