Luin joskus kuvien jälkikäsittelyyn liittyvää tekstiä, jossa törmäsin hauskaa ditheröintialgoritmiin. Valitettavasti artikkeli on hukkunut, mutta löysin lähdekoodin ja korjasin siitä yhden ongelman, jonka lähdettä en ollut millään löytänyt aiemmin. Muuttujan ds arvo kertoo, kuinka monta sävyä kutakin värikanavaa on - 4 vastaa kahdeksanbittisiä värejä (kaksi bittiä per kanava -tyylisesti).
Code: Select all
kuva$ = "media\map.bmp"
img = LoadImage(kuva)
SCREEN ImageWidth(img), ImageHeight(img)
img = LoadImage(kuva)
DrawImage img, 0, 0
ds# = 4
ds = 256.0/(ds-1)
For x = 0 To ImageWidth (img)-1
Lock SCREEN()
For y = 0 To ImageHeight(img)-1
col% = GetPixel2(x, y)
r# = col Shl 8 Shr 24
g# = col Shl 16 Shr 24
b# = col Shl 24 Shr 24
re# = r: ge# = g: be# = b
r = Int(r/ds)*ds
g = Int(g/ds)*ds
b = Int(b/ds)*ds
re# - r: ge# - g: be# - b
col = GetPixel2(x, Min(ImageHeight(img), y+1))
PutPixel2 x , y+1, Int(Min(255, Max(0, ((col Shl 8) Shr 24)+re*7/16.0))) Shl 16 + Int(Min(255, Max(0, ((col Shl 16) Shr 24)+ge*7/16.0))) Shl 8 + Int(Min(255, Max(0, ((col Shl 24) Shr 24)+be*7/16.0)))
If x<ImageWidth(img)-1 Then
col = GetPixel2(x+1, Max(y-1, 0))
PutPixel2 x+1, y-1, Int(Min(255, Max(0, ((col Shl 8) Shr 24)+re*3/16.0))) Shl 16 + Int(Min(255, Max(0, ((col Shl 16) Shr 24)+ge*3/16.0))) Shl 8 + Int(Min(255, Max(0, ((col Shl 24) Shr 24)+be*3/16.0)))
col = GetPixel2(x+1, y)
PutPixel2 x+1, y , Int(Min(255, Max(0, ((col Shl 8) Shr 24)+re*5/16.0))) Shl 16 + Int(Min(255, Max(0, ((col Shl 16) Shr 24)+ge*5/16.0))) Shl 8 + Int(Min(255, Max(0, ((col Shl 24) Shr 24)+be*5/16.0)))
col = GetPixel2(x+1, Min(ImageHeight(img), y+1))
PutPixel2 x+1, y+1, Int(Min(255, Max(0, ((col Shl 8) Shr 24)+re /16.0))) Shl 16 + Int(Min(255, Max(0, ((col Shl 16) Shr 24)+ge /16.0))) Shl 8 + Int(Min(255, Max(0, ((col Shl 24) Shr 24)+be /16.0)))
EndIf
PutPixel2 x, y, Int(Max(0, Min(255, r))) Shl 16 + int(Max(0, Min(255, g))) Shl 8 + Int(Max(0, Min(255, b)))
Next y
Unlock
DrawScreen OFF
Next x
WaitKey
Lisäksi tein wanhaan mandelbrotiini liukuvärit (ihQpinkit, luonnollisesti) ja antialiasoinnin.
Code: Select all
Const screenw = 640
Const screenh = 480
Const maxiter = 50
SCREEN screenw, screenh
Const aaamount# = 10
For i = 0 To screenw-1
Lock
For j = 0 To screenh-1
r# = 0
g# = 0
b# = 0
For p = 1 To aaamount
x# = 0
y# = 0
x0# = (Float(i)-screenw/2.0)*0.005+Rnd(.0,.005)-.6
y0# = (float(j)-screenh/2.0)*0.005+Rnd(.0,.005)
k = 0
While (k<maxiter)And(x*x+y*y<=32)
xt# = x*x-y*y+x0
y = 2*x*y+y0
x = xt
k = k + 1
Wend
xt = x*x-y*y+x0:y=2*x*y+y0:x=xt:k=k+1
xt = x*x-y*y+x0:y=2*x*y+y0:x=xt:k=k+1
l# = Sqrt(x*x+y*y)
mu# = k-Log(Log(l))/Log(2.0)
If k<maxiter Then
c# = (mu*.2+.5)
r = r + 255
g = g + (215.0+40.0*Sin(c*180.0))/aaamount
b = b + (215.0+40.0*Sin(c*180.0))/aaamount
EndIf
Next p
PutPixel2 i, j, Int(Max(0, Min(255, r))) Shl 16 + Int(Max(0, Min(255, g))) Shl 8 + Int(Max(0, Min(255, b)))
Next j
Unlock
DrawScreen OFF
Next i
Waitkey
EDIT: Pitääpä seuraavaksi tehdä jotain reaaliaikaista, nämä sivulle scrollaavat offline-renderit alkavat tulla liian kaavamaisiksi :>