AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bitmap Kantenglättung

Ein Thema von marius0702 · begonnen am 14. Mär 2009 · letzter Beitrag vom 14. Mär 2009
 
marius0702

Registriert seit: 1. Jan 2008
40 Beiträge
 
#1

Bitmap Kantenglättung

  Alt 14. Mär 2009, 12:52
ich hab heute eine kantenglättung für bitmaps geschrieben und wollte mal fragen ob man das villeicht noch etwas beschleunigen kann .
mein pc braucht für ein bild mit 299x342 pixeln und 1xAA ca 3,8 ms.
für größere bilder und für animationen wären ein paar ms weniger nicht schlecht .

Delphi-Quellcode:

function AA(bmp:tbitmap;haeufigkeit:integer;intensitaet:integer;backgroundcolor:tcolor):real;
var
x,y,i:integer;
col2,col4,col5,col6,col8,c1,c2,c3:tcolor;
background:tcolor;
relevance,r,g,b:integer;
b1,b2,b3,b4:pbytearray;

//Zeitmessung
  freq: Int64;
  startTime: Int64;
  endTime: Int64;
  tempbmp:tbitmap;
begin
  QueryPerformanceFrequency(freq);
  QueryPerformanceCounter(startTime);
//Zeitmessung

background:=backgroundcolor;

relevance:=intensitaet+1;

if bmp.PixelFormat<>pf24bit then
bmp.PixelFormat:=pf24bit;

tempbmp:=tbitmap.Create;
tempbmp.Assign(bmp);

for i:=1 to haeufigkeit do begin
  for y:=bmp.Height-2 downto 1 do begin


// ____________
// <-| b1| b1| b1|->
// <-|___|___|___|->
// <-| b2| b2| b2|->
// <-|___|___|___|->
// <-| b3| b3| b3|->
// <-|___|___|___|->

    b1:=bmp.ScanLine[y-1];
    b2:=bmp.ScanLine[y];
    b3:=bmp.ScanLine[y+1];

    b4:=tempbmp.ScanLine[y];

    for x:=1 to bmp.Width-2 do begin

// ____________
// | | 2 | |
// |___|___|___|
// | 4 | 5 | 6 |
// |___|___|___|
// | | 8 | |
// |___|___|___|



    //pixel mitte-oben
    r:=b1[(x)*3+2];
    g:=b1[(x)*3+1];
    b:=b1[(x)*3+0];
    col2:=rgb(r,g,b);

    //pixel mitte-links
    r:=b2[(x-1)*3+2];
    g:=b2[(x-1)*3+1];
    b:=b2[(x-1)*3+0];
    col4:=rgb(r,g,b);

    //pixel mitte-mitte
    r:=b2[(x)*3+2];
    g:=b2[(x)*3+1];
    b:=b2[(x)*3+0];
    col5:=rgb(r,g,b);

    //pixel mitte-rechts
    r:=b2[(x+1)*3+2];
    g:=b2[(x+1)*3+1];
    b:=b2[(x+1)*3+0];
    col6:=rgb(r,g,b);

    //pixel unten-mitte
    r:=b3[(x)*3+2];
    g:=b3[(x)*3+1];
    b:=b3[(x)*3+0];
    col8:=rgb(r,g,b);



// ____________
// | | 2 | |
// |___|___|___|
// | 4 | 5 | |
// |___|___|___|
// | | | |
// |___|___|___|
     c1:=col2;
     c2:=col4;

     if (c1<>col5) and (c2<>col5) and (col5=background) then begin

       b4[x*3+2]:=(getrvalue(c1)+getrvalue(c2)+getrvalue(col5)*relevance) div (3+relevance);
       b4[x*3+1]:=(getgvalue(c1)+getgvalue(c2)+getgvalue(col5)*relevance) div (3+relevance);
       b4[x*3+0]:=(getbvalue(c1)+getbvalue(c2)+getbvalue(col5)*relevance) div (3+relevance);

     end;

// ____________
// | | 2 | |
// |___|___|___|
// | | 5 | 6 |
// |___|___|___|
// | | | |
// |___|___|___|
     c1:=col2;
     c2:=col6;

     if (c1<>col5) and (c2<>col5) and (col5=background) then begin

       b4[x*3+2]:=(getrvalue(c1)+getrvalue(c2)+getrvalue(col5)*relevance) div (3+relevance);
       b4[x*3+1]:=(getgvalue(c1)+getgvalue(c2)+getgvalue(col5)*relevance) div (3+relevance);
       b4[x*3+0]:=(getbvalue(c1)+getbvalue(c2)+getbvalue(col5)*relevance) div (3+relevance);

     end;


// ____________
// | | | |
// |___|___|___|
// | 4 | 5 | |
// |___|___|___|
// | | 8 | |
// |___|___|___|
     c1:=col8;
     c2:=col4;

     if (c1<>col5) and (c2<>col5) and (col5=background) then begin

       b4[x*3+2]:=(getrvalue(c1)+getrvalue(c2)+getrvalue(col5)*relevance) div (3+relevance);
       b4[x*3+1]:=(getgvalue(c1)+getgvalue(c2)+getgvalue(col5)*relevance) div (3+relevance);
       b4[x*3+0]:=(getbvalue(c1)+getbvalue(c2)+getbvalue(col5)*relevance) div (3+relevance);

     end;


// ____________
// | | | |
// |___|___|___|
// | | 5 | 6 |
// |___|___|___|
// | | 8 | |
// |___|___|___|
     c1:=col8;
     c2:=col6;

     if (c1<>col5) and (c2<>col5) and (col5=background) then begin

       b4[x*3+2]:=(getrvalue(c1)+getrvalue(c2)+getrvalue(col5)*relevance) div (3+relevance);
       b4[x*3+1]:=(getgvalue(c1)+getgvalue(c2)+getgvalue(col5)*relevance) div (3+relevance);
       b4[x*3+0]:=(getbvalue(c1)+getbvalue(c2)+getbvalue(col5)*relevance) div (3+relevance);

     end;

    end;
  end;
bmp.Assign(tempbmp);
end;


//Zeitmessung
  QueryPerformanceCounter(endTime);

  result:=(endTime - startTime) * 1000 / freq;
//Zeitmessung
end;

procedure TForm1.BAAClick(Sender: TObject);
begin
Lzeit.Caption :=
    floattostr(AA(image1.Picture.Bitmap,spinedit_haeufigkeit.Value,spinedit_intensitaet.Value,clblack))+' ms';
end;
die kantenglättung glättet nicht alles sondern nur die übergänge von der hintergrundfarbe zu den restlichen farben.

[edit=mkinzler]Code umgebrochen wegen Layout Mfg, mkinzler[/edit]
  Mit Zitat antworten Zitat
 


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 10:40 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