Smooth Scaling - Bresenham

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Eingeproggt

Betreff: Smooth Scaling - Bresenham

BeitragSo, Dez 19, 2010 1:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Abend!

Ich hab n relativ einfaches Problem für das ich mir mal wieder eine zu komplizierte Lösung gesucht hab Razz
Also man stelle sich vor, ich habe eine Linie und möchte diese Skalieren. Sprich entweder eine Reihe Pixel in nem Bild, einen Array oder eine Bank, kommt ja aufs selbe raus.

Natürlich könnte ich das in ein Image mit 1 Pixel Höhe packen und dieses mit TFormFilter 1 skalieren.
Mir wäre aber eine "eigene" Lösung lieber, da ich die Daten in ner Bank vorliegen hab. Außerdem weiß ich gar nicht, ob das funzt mit dem Image. In Gimp misslang mir nämlich der Versuch Shocked

Hab diese Seite gefunden:
http://www.compuphase.com/graphic/scale.htm
und mich gleich an den "Smooth scaling with Bresenham"-Algorithmus gemacht (der zweite).

Meine Umsetzung in BB sieht nun so aus:
BlitzBasic: [AUSKLAPPEN]
Local bank=CreateBank(5)
PokeByte(bank,0,50)
PokeByte(bank,1,100)
PokeByte(bank,2,10)
PokeByte(bank,3,200)
PokeByte(bank,4,100)
Local neu=SmoothBresenham(bank,4)

For i=0 To BankSize(neu)-1
DebugLog PeekByte(neu,i)
Next

WaitKey()
End


;http://www.compuphase.com/graphic/scale.htm

;because of several simplifications of the algorithm,
;the zoom range is restricted between 0.5 And 2. That
;is: TgtWidth must be >= SrcWidth/2 And <= 2*SrcWidth.
Function SmoothBresenham(Source,TgtWidth)
Local Target=CreateBank(TgtWidth)
Local SrcWidth=BankSize(Source)

Local NumPixels=TgtWidth
Local avg=TgtWidth/2

Local e=0
Local p=0
Local srcIndex=0
Local tgtIndex=0

If TgtWidth>SrcWidth Then
NumPixels=NumPixels-1
EndIf

Repeat

p=PeekByte(Source,srcIndex)
If (e>=avg) Then
p=Avarage(p,PeekByte(Source,srcIndex+1))
EndIf

PokeByte(Target,tgtIndex,p)
tgtIndex=tgtIndex+1

e=e+SrcWidth
If (e>=TgtWidth) Then
e=e-TgtWidth
srcIndex=srcIndex+1
EndIf

NumPixels=NumPixels-1
If (NumPixels<=0) Then Exit
Forever

If (TgtWidth>SrcWidth) Then
;HÄÄ? Also größer skalieren geht nicht?
FreeBank Target
Target=Source
EndIf

Return Target
End Function

Function Avarage(a,b)
Return (a+b) Shr 1
End Function

(wobei die ersten Zeilen klarerweise nur zum Testen sind)

Scheint ja zu gehn (geht er überhaupt richtig?).
EDIT - Neuformulierung der Frage:
Also wenn man die Abfrage am Ende (Mit meinem "HÄÄ?") einfach weglässt, dann kommt ja eh ein halbwegs vernünftiges Ergebnis raus - Leider ist der allerletzte Eintrag in der neuen Bank immer 0... irgendwas hab ich da mit den Indizes verdreht oder? Kann mir da jemand eventuell helfen?

Anmerkung: Ich hab ehrlich gesagt keine Ahnung, wofür der Datentyp pixel im Code steht - ich nehm mal an, für eine Datenstruktur mit 3 oder 4 Bytes, auf die jeweils die Operationen wie Avarage angewandt werden. Aber wie auch immer: Mir gehts eh nur um Graustufen, sprich ein Byte (p in meinem Code) genügt.

Danke an alle, die versuchen mein Problem zu verstehen.
Es is ja recht einfach, aber ich habs mal wieder zu kompliziert formuliert...

mfG, Christoph.

Nochmal EDIT:
Wenn man alle "If (TgtWidth>SrcWidth) Then"-Abfragen weg haut, dann klappt das mit Vergrößerung auch. Also zumindest fast... In meinen Tests gingen alle Werte außer jene die über (SrcWidth-1)*2 liegen. Also fast alle nur exakt doppelt geht irgendwie nicht. Ist mir aber auch nicht mehr so wichtig, Problem ist hiermit mal gelöst für mich.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group