Bilineares Resampling

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Krischan

Betreff: Bilineares Resampling

BeitragSa, Feb 21, 2009 13:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe eine Problem mit bilinearem Resampling und stehe gerade auf dem Schlauch. Ich möchte ein Graustufenbild vergrössern, OHNE die Blitzfunktionen Resizeimage und Tformfilter zu verwenden. Ich habe schon umfangreiche Recherchen angestrengt und einen Testcode gebastelt, der aber irgendwo noch einen Fehler zu haben scheint. Aber wo? Der grüne Rahmen beschreibt die skalierte Grösse, aber das Bild sieht nach rechts unten hin gestaucht aus. Die grauen Pixel sollten aber absolut spiegelsymmetrisch auf der X und Y Achse sein.

Die richtige Reihenfolge der Werte sollte später bei Faktor 2 (8x8) so aussehen (wird im Debuglog ausgegeben):

0, 32, 96,128,128, 96, 32, 0
32, 64,128,160,160,128, 64, 32
96,128,191,223,223,191,128, 96
128,160,223,255,255,223,160,128
128,160,223,255,255,223,160,128
96,128,191,223,223,191,128, 96
32, 64,128,160,160,128, 64, 32
0, 32, 96,128,128, 96, 32, 0

Hier der Code:
Code: [AUSKLAPPEN]
Graphics 400,300,32,2

width=4
height=4
s#=2.0

Restore Image
Dim Daten(width,height)

For Y=0 To width-1
   For X=0 To height-1
      Read Daten(x,y)
   Next
Next

Scale(s,width,height)
Color 0,128,0 : Rect 16,16,64*s,64*s,0

While Not KeyHit(1)
   
   rgb=(ReadPixel(MouseX(),MouseY(),FrontBuffer()) And $ff0000) / $10000
   
   Color   0,  0,  0 : Rect 0,0,24,16,1
   Color 255,255,255 : Text 0,0,rgb
   
   Flip
   
Wend

End

Function Bilinear#(x#,y#)
   
   Local x0#=Floor(x)
   Local y0#=Floor(y)
   Local dx#=x-x0
   Local dy#=y-y0
   
   Local r0=Daten(x0,y0)
   Local r1=Daten(x0+1,y0)
   Local r2=Daten(x0+1,y0+1)
   Local r3=Daten(x0,y0+1)
   
   Return LinearInterpolate(LinearInterpolate(r0,r1,dx),LinearInterpolate(r3,r2,dx),dy)
   
End Function
   
Function Scale(ratio#,width%,height%)
   
   Local x%,y%,c%
   
   For y=0 To (height*ratio)-1
      
      out$=""
      
      For x=0 To (width*ratio)-1
         
         Local u# = x*1.0/ratio
         Local v# = y*1.0/ratio
         
         c=Bilinear(u,v)
         
         Color c,c,c
         Rect (x+1)*16,(y+1)*16,16,16,1
         
         out$=out$+Fill(c,3)
         If x<(width*ratio)-1 Then out$=out$+","
         
      Next
      
      DebugLog out
      
   Next
   
End Function

Function LinearInterpolate#(x1#,x2#,mu#=0.5)
   
   Return (x1*(1.0-mu)+x2*mu)
   
End Function

Function Fill$(number%,lenght%=2)
   
   Local r$=""
   
   For i=1 To lenght-Len(Str(number))
      
      r$=r$+" "
      
   Next
   
   Return r$+Str(number)
   
End Function

.Image
Data   0, 64, 64,  0
Data  64,255,255, 64
Data  64,255,255, 64
Data   0, 64, 64,  0
 

Krischan

BeitragDi, Feb 24, 2009 17:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Lösung gibt es nun im Codearchiv:

https://www.blitzforum.de/foru...hp?t=30902

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group