Deutsch
Quelltexte/ Codesnippets

Weichzeichnen, Filter, Box-Blur

 

Sven
Bader
Hier habe ich einen Code für einen Weichzeichen-Filter, aus Performance-Gründen eher für kleine Grafiken geeignet.



Über den dritten Parameter der Blur-Funktion lässt sich steuern, wie oft der Filter angewendet wird.
Proc Blur

    Parameters width&, height&, passes&
    Declare avg_red&, avg_green&, avg_blue&, new_image&[width&-1, height&-1, 2]
    Declare count&, box&, x&, y&, i&, j&

    whileLoop passes&

        box& = 1

        WhileLoop 0, width& - 1

            i& = &loop

            WhileLoop 0, height& - 1

                j& = &loop
                clear avg_red&, avg_blue&, avg_green&, count&

                WhileLoop (i& - box&), (i& + box&)

                    x& = &loop
                    Case (x& = width&)  : Break
                    Case (x& < 0) : Continue

                    WhileLoop (j& - box&), (j& + box&)

                        y& = &loop
                        case (y& = height&) : Break
                        case (y& < 0) : Continue
                        inc count&
                        avg_red&   = avg_red&   + image&[x&, y&, 0]
                        avg_green& = avg_green& + image&[x&, y&, 1]
                        avg_blue&  = avg_blue&  + image&[x&, y&, 2]

                    EndWhile

                EndWhile

                new_image&[i&, j&, 0] = avg_red&   / count&
                new_image&[i&, j&, 1] = avg_green& / count&
                new_image&[i&, j&, 2] = avg_blue&  / count&

            EndWhile

        EndWhile

        MAT image&[] = new_image&[]

    EndWhile

EndProc

Cls
Declare x&, y&, px&, width&, height&
'===================== Bild in Array einlesen
DrawIcon "EIS", 50, 50
width& = 32
height& = 32
Declare image&[width&-1, height&-1, 2]

WhileLoop 0, height& - 1

    y& = &loop

    WhileLoop 0, width& - 1

        x& = &loop
        px& = GetPixel(50 + x&, 50 + y&)
        image&[x&, y&, 0] = GetRValue(px&)
        image&[x&, y&, 1] = GetGValue(px&)
        image&[x&, y&, 2] = GetBValue(px&)

    EndWhile

EndWhile

'===================== Filter anwenden
Blur(width&, height&, 5)
'===================== geglättetes Bild anzeigen

WhileLoop 0, height& - 1

    y& = &loop

    WhileLoop 0, width& - 1

        x& = &loop
        SetPixel 100 + x&, y& + 50, RGB(image&[x&, y&, 0], image&[x&, y&, 1], image&[x&, y&, 2])

    EndWhile

EndWhile

WaitKey
End

Der Flaschenhals ist hier nicht einmal der Filter selbst (wobei der auch) sondern das GetPixel und SetPixel. Umgehen könnte man das zum Beispiel über eine 24-Bit-Bitmap-Datei, die man als Block einliest.

Ein qualitativer Tweak wäre, die Funktion nur einen Teilbereich glätten zu lassen, die Ränder aber trotzdem im Array vorzuhalten. Dann würden die Randbereiche nicht so abgehackt aussehen. Hierzu müsste man dann die 4 Case-Abfragen entfernen und den x/y-Offset als Parameter mitgeben.

Viel Spaß beim Glätten

23 kB
Hochgeladen:16.11.2021
Ladeanzahl77
Herunterladen
 
16.11.2021  
 



Zum Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

1.530 Betrachtungen

Unbenanntvor 0 min.
Sven Bader22.12.2022
Ernst29.05.2022
ByteAttack20.05.2022
Michael W.30.03.2022
Mehr...

Themeninformationen

Dieses Thema hat 1 Teilnehmer:

Sven Bader (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie