Bilineares Resampling
Übersicht

KrischanBetreff: Bilineares Resampling |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Die Lösung gibt es nun im Codearchiv:
https://www.blitzforum.de/foru...hp?t=30902 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group