AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Problem bei Supersampling (Verkleinern einer TBitmap)
Thema durchsuchen
Ansicht
Themen-Optionen

Problem bei Supersampling (Verkleinern einer TBitmap)

Ein Thema von hellboyPS · begonnen am 28. Dez 2009 · letzter Beitrag vom 29. Dez 2009
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#11

Re: Problem bei Supersampling (Verkleinern einer TBitmap)

  Alt 28. Dez 2009, 23:05
Das Mandelbrot muss roh sein!

Wie weit bist du denn? Bin nämlich auch grad Mandelbrote am malen
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#12

Re: Problem bei Supersampling (Verkleinern einer TBitmap)

  Alt 28. Dez 2009, 23:21
Zitat von hellboyPS:
Hab den Post von igel457 mal umgesetzt.
Folgendes Ergebnis:

Vorher: http://img37.imageshack.us/i/vorher.png/
Nachher: http://img24.imageshack.us/i/nachhero.png/

Leider auch nicht das passende Ergebnis. Ich werde mich mit der GR32 Library mal auseinandersetzen.

Danke für die bisherigen Posts schon mal.
Ich habe das mal ausprobiert - der Fehler kommt durch die Art, wie du die Farbe berechnest. Wie Medium dich schon hingewiesen hat, gibt es so auch zwischen Subpixeln einen Überlauf im Farbkanal. Schließlich mache ich ja nichts anderes als für die Farbwerte von vier Pixeln auf einen zu vereinen. Daher liefert meine Implementierung tatsächlich weiche Kanten:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var
  bitmap: TBitmap;
  re, im, rez, imz, rezold, col: Single;
  a: boolean;
  i, x, y: integer;
  oldcolor: TColor;
  newcolor: TColor;
const
  iterations = 100;
  colchangevar = 0.05;
begin
  bitmap := TBitmap.Create;
  bitmap.Width := Image1.Width;
  bitmap.Height := Image1.Height;
  bitmap.Canvas.Brush.Color := clBlack;
  bitmap.Canvas.FillRect(bitmap.Canvas.ClipRect);
  for x := 0 to bitmap.width * 2 do
  begin
    for y := 0 to bitmap.height * 2 do
    begin
      re := (x/bitmap.width/2)*4-2; // mit Startwerten zoom = 4, move = -2
      im := (y/bitmap.height/2)*4-2;
      rez := 0;
      imz := 0;
      a := true;
      for i := 0 to iterations do
      begin
       if a then
       begin
        rezold := rez;
        rez := rez*rez-imz*imz+re;
        imz := 2*rezold*imz+im;
        if rez*rez+imz*imz > 4 then
         a := false;
       end;
      end;
      col := (rez*rez+imz*imz)/4*colchangevar*10;
      if not a then
      begin
       oldcolor := bitmap.canvas.Pixels[trunc(x/2),trunc(y/2)];
       newcolor := round(col+256*col+256*256+col);
       bitmap.canvas.Pixels[trunc(x/2),trunc(y/2)] := RGB(
         round(GetRValue(oldcolor) + GetRValue(newcolor) * 0.25),
         round(GetGValue(oldcolor) + GetGValue(newcolor) * 0.25),
         round(GetBValue(oldcolor) + GetBValue(newcolor) * 0.25));
      end;
    end;
  end;
  Image1.Picture.Bitmap := bitmap;
end;
Edit: Hier noch schnell die Scanline-Version:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var
  bitmap: TBitmap;
  re, im, rez, imz, rezold, col: Single;
  a: boolean;
  i, x, y: integer;
  oldcolor: TColor;
  newcolor: TColor;
  pi: PInteger;
const
  iterations = 100;
  colchangevar = 0.05;
begin
  bitmap := TBitmap.Create;
  bitmap.PixelFormat := pf32bit;
  bitmap.Width := Image1.Width;
  bitmap.Height := Image1.Height;
  bitmap.Canvas.Brush.Color := clBlack;
  bitmap.Canvas.FillRect(bitmap.Canvas.ClipRect);
  for y := 0 to (bitmap.height - 1) * 2 do
  begin
    for x := 0 to (bitmap.width - 1) * 2 do
    begin
      re := (x/bitmap.width/2)*4-2; // mit Startwerten zoom = 4, move = -2
      im := (y/bitmap.height/2)*4-2;
      rez := 0;
      imz := 0;
      a := true;
      for i := 0 to iterations do
      begin
       if a then
       begin
        rezold := rez;
        rez := rez*rez-imz*imz+re;
        imz := 2*rezold*imz+im;
        if rez*rez+imz*imz > 4 then
         a := false;
       end;
      end;
      col := (rez*rez+imz*imz)/4*colchangevar*10;
      if not a then
      begin
       pi := bitmap.ScanLine[trunc(y/2)];
       if pi <> nil then
       begin
         inc(pi, trunc(x/2));
         oldcolor := pi^;;
         newcolor := round(col+256*col+256*256+col);
         pi^ := RGB(
           round(GetBValue(oldcolor) + GetBValue(newcolor) * 0.25),
           round(GetGValue(oldcolor) + GetGValue(newcolor) * 0.25),
           round(GetRValue(oldcolor) + GetRValue(newcolor) * 0.25));
       end;
      end;
    end;
  end;
  Image1.Picture.Bitmap := bitmap;
end;
Miniaturansicht angehängter Grafiken
test_125.png  
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#13

Re: Problem bei Supersampling (Verkleinern einer TBitmap)

  Alt 29. Dez 2009, 00:07
Meiner Weisheit letzter Schluss ist folgender Code, welcher wunderbar Super-gesampelte Bilder erzeugt. Leider ergeben sich helle Striche links und Rechts am Rand, aber ich weiß nicht woher die kommen, und habe jetzt keine Lust mehr danach zu suchen.
Delphi-Quellcode:
const
  ssv = 8; //8-Faches Super-Sampling

type
  TFC = packed record
    r,g,b: Single;
  end;
  PFC = ^TFC;

procedure TForm1.Button1Click(Sender: TObject);
function Cut(ain: single): single;
begin
  result := ain;
  if result > 255 then
    result := 255
  else if result < 0 then
    result := 0;
end;

var
  bitmap: TBitmap;
  re, im, rez, imz, rezold, col: Single;
  a: boolean;
  i, x, y: integer;
  pmem: PFC;
  ps: PFC;
  pi: PInteger;
const
  iterations = 100;
  colchangevar = 1;
begin
  bitmap := TBitmap.Create;
  bitmap.PixelFormat := pf32bit;
  bitmap.Width := Image1.Width;
  bitmap.Height := Image1.Height;

  GetMem(pmem, bitmap.Width * bitmap.Height * SizeOf(TFC));
  ZeroMemory(pmem, bitmap.Width * bitmap.Height * SizeOf(TFC));
  
  for y := 0 to (bitmap.height - 1) * ssv do
  begin
    for x := 0 to (bitmap.width - 1) * ssv do
    begin
      re := (x/bitmap.width/ssv)*4-2; // mit Startwerten zoom = 4, move = -2
      im := (y/bitmap.height/ssv)*4-2;
      rez := 0;
      imz := 0;
      a := true;
      for i := 0 to iterations do
      begin
       if a then
       begin
        rezold := rez;
        rez := rez*rez-imz*imz+re;
        imz := 2*rezold*imz+im;
        if rez*rez+imz*imz > 4 then
         a := false;
       end;
      end;
      if not a then
      begin
       ps := pmem;
       inc(ps, (bitmap.Height) * trunc(y / ssv) + trunc(x/ssv));
       col := (rez*rez+imz*imz)/4*colchangevar;
       col := col+256*col+256*256+col;
       ps^.r := ps^.r + GetRValue(Round(col));
       ps^.g := ps^.g + GetGValue(Round(col));
       ps^.b := ps^.b + GetBValue(Round(col));
      end;
    end;
  end;

  for y := 0 to (bitmap.height - 1) do
  begin
    pi := bitmap.ScanLine[y];
    for x := 0 to (bitmap.width - 1) do
    begin
      inc(pi);
      ps := pmem;
      inc(ps, (bitmap.Height) * y + x);
      pi^ := RGB(
        Round(Cut(ps^.b / (ssv*ssv))),
        Round(Cut(ps^.g / (ssv*ssv))),
        Round(Cut(ps^.r / (ssv*ssv))));
    end;
  end;

  Image1.Picture.Bitmap := bitmap;
end;
Miniaturansicht angehängter Grafiken
mit_341.png   ohne_150.png  
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
hellboyPS

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

Re: Problem bei Supersampling (Verkleinern einer TBitmap)

  Alt 29. Dez 2009, 02:13
Hey danke, damit dürfte das Problem dann gelöst sein!
Zu der Färbung: Es dürfte euch aufgefallen sein, dass die Färbung totaler Schwachsinn ist.
Hab mich auch mit dem Kopieren vertan, habe meherere Färbungsmethoden zur Auswahl aber Standard ist diese
   col := it*colchangevar und nicht   col := (rez*rez+imz*imz)/4*colchangevar*10 Ich werde weiterhin in diesem Forum mit Fragen und Anregungen aktiv sein! Hat mir sehr geholfen danke!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#15

Re: Problem bei Supersampling (Verkleinern einer TBitmap)

  Alt 29. Dez 2009, 09:15
Zitat:
Code:
col := col+256*col+256*256[color=#ff0000][b]+[/b][/color]col;
liegt hier nicht die ganze Zeit ein Rechenfehler vor?

TFC ist 24 und das Bitmap 32 Bit

Zitat:
Delphi-Quellcode:
col := (rez*rez+imz*imz)/4*colchangevar;
col := col+256*col+256*256+col;
ps^.r := ps^.r + GetRValue(Round(col));
ps^.g := ps^.g + GetGValue(Round(col));
ps^.b := ps^.b + GetBValue(Round(col));
wozu alle Farben zusammenrechnen und dann nochmal zerlegen und erneut zusammensetzen?
Delphi-Quellcode:
// colB: Byte;
colB := Round((rez*rez+imz*imz)/4*colchangevar);
Inc(ps^.r, colB);
Inc(ps^.g, colB);
Inc(ps^.b, colB);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#16

Re: Problem bei Supersampling (Verkleinern einer TBitmap)

  Alt 29. Dez 2009, 10:07
TFC ist 96Bit breit
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#17

Re: Problem bei Supersampling (Verkleinern einer TBitmap)

  Alt 29. Dez 2009, 10:22
blödes Single
dachte dort wird schon auf das Bitmap zugegriffen

OK, dann stimmt das mit dem PI^ und den 32 Bit schon
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01: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