cbFilt [v1.4] (Update 29.7.2011)

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
User avatar
Misthema
Advanced Member
Posts: 312
Joined: Mon Aug 27, 2007 8:32 pm
Location: Turku, Finland
Contact:

cbFilt [v1.4] (Update 29.7.2011)

Post by Misthema »

Tervehdys. Tässä kun ei tänne nettiin joka päivä pääse, niin tulee kikkailtua ties minkälaista settiä. Tässä siis esittelen teille cbFilt:n :
cbFilt:llä on siis mahdollista laskea punaisen, vihreän tai sinisen väriarvon arvo suodattimien läpi. Suodattimia ovat muunmuassa:
  • SoftLight
    HardLight
    Difference
    Multiply
    Average
    Screen_
    Lighten
    Darken
    Negation
    Exclusion
    Overlay
    ColorDodge
cbFilt_v14.rar
Update (29072011)
(1.17 MiB) Downloaded 397 times

Itse "kirjasto":

Code: Select all

'+-----------------------+
'|        cbFilt         |
'+-----------------------+
' Converted from BlitzMax
'       example app
'    By misthema 2011
'+----------EN-----------+
' These filter functions
' should be used with
' byte values (0-255, red
' green or blue).
' Example:
' softRed = SoftLight(Red1,Red2)
'+----------FI-----------+
' Näitä funktioita tulisi
' käyttää tavuluvuilla
' (0-255 väliltä, punainen,
' vihreä tai sininen).
' Esimerkki:
' softRed = SoftLight(Red1,Red2)
'~-----------------------~

'+---------------+
'| RGB functions |
'+---------------+

' Soft Light Filter
Function SoftLight(a%,b%)
	Dim c%
	c=a*b Shr 8
	Return (c+a*(255-((255-a)*(255-b) Shr 8)-c) Shr 8)
End Function

' Hard Light Filter
Function HardLight(a%,b%)
	If b<128 Then Return (a*b) Shr 7 Else Return 255-((255-b)*(255-a) Shr 7)
End Function

' Difference Filter
Function Difference(a%,b%)
	Return Abs(a-b)
End Function

' Multiply Filter
Function Multiply(a%,b%)
	Return (a*b) Shr 8
End Function

' Average Filter
Function Average(a%,b%)
	Return (a+b) Shr 1
End Function

' Screen Filter
Function Screen_(a%,b%)
	Return 255-((255-a)*(255-b) Shr 8)
End Function

' Lighten Filter
Function Lighten(a%,b%)
	If a>b Then Return a Else Return b
End Function

' Darken Filter
Function Darken(a%,b%)
	If a<b Then Return a Else Return b
End Function

' Negative Filter
Function Negation(a%,b%)
	Return 255-Abs(255-a-b)
End Function

' Exclusion Filter
Function Exclusion(a%,b%)
	Return a+b-(a*b Shr 7)
End Function

' Overlay Filter
Function Overlay(a%,b%)
	If a<128 Then Return (a*b) Shr 7 Else Return 255-((255-a)*(255-b) Shr 7)
End Function

' Color Burn Filter
Function ColorDodge(a%,b%)
	If b=255 Then
		Return 255
	Else
		c%=RoundDown((a Shl 8)/(255-b))
		If c>255 Then Return 255 Else Return c
	EndIf
End Function


'+-----------------+
'| Pixel function |
'+-----------------+

Const PIX_RANDOM        = 0
Const PIX_SOFTLIGHT     = 1
Const PIX_HARDLIGHT     = 2
Const PIX_DIFFERENCE    = 3
Const PIX_MULTIPLY      = 4
Const PIX_AVERAGE       = 5
Const PIX_SCREEN        = 6
Const PIX_LIGHTEN       = 7
Const PIX_DARKEN        = 8
Const PIX_NEGATION      = 9
Const PIX_EXCLUSION     = 10
Const PIX_OVERLAY       = 11
Const PIX_COLORDODGE    = 12

Function PixelFilter(a%,b%,filter)
    r1 As Byte = ((a% Shl 8) Shr 24)
    g1 As Byte = ((a% Shl 16) Shr 24)
    b1 As Byte = ((a% Shl 24) Shr 24)
    
    r2 As Byte = ((b% Shl 8) Shr 24)
    g2 As Byte = ((b% Shl 16) Shr 24)
    b2 As Byte = ((b% Shl 24) Shr 24)
    
    If filter=0 Then filter=(Rand(240) Mod 12)+1
    
    Select filter
        Case 1
            r3=SoftLight(r1,r2)
            g3=SoftLight(g1,g2)
            b3=SoftLight(b1,b2)
        Case 2
            r3=HardLight(r1,r2)
            g3=HardLight(g1,g2)
            b3=HardLight(b1,b2)
        Case 3
            r3=Difference(r1,r2)
            g3=Difference(g1,g2)
            b3=Difference(b1,b2)
        Case 4
            r3=Multiply(r1,r2)
            g3=Multiply(g1,g2)
            b3=Multiply(b1,b2)
        Case 5
            r3=Average(r1,r2)
            g3=Average(g1,g2)
            b3=Average(b1,b2)
        Case 6
            r3=Screen_(r1,r2)
            g3=Screen_(g1,g2)
            b3=Screen_(b1,b2)
        Case 7
            r3=Lighten(r1,r2)
            g3=Lighten(g1,g2)
            b3=Lighten(b1,b2)
        Case 8
            r3=Darken(r1,r2)
            g3=Darken(g1,g2)
            b3=Darken(b1,b2)
        Case 9
            r3=Negation(r1,r2)
            g3=Negation(g1,g2)
            b3=Negation(b1,b2)
        Case 10
            r3=Exclusion(r1,r2)
            g3=Exclusion(g1,g2)
            b3=Exclusion(b1,b2)
        Case 11
            r3=Overlay(r1,r2)
            g3=Overlay(g1,g2)
            b3=Overlay(b1,b2)
        Case 12
            r3=ColorDodge(r1,r2)
            g3=ColorDodge(g1,g2)
            b3=ColorDodge(b1,b2)
    EndSelect
    
    Return r3 Shl 16 + g3 Shl 8 + b3
End Function
Tässä taasen esimerkki kirjaston käytöstä ja toimivuudesta:

Code: Select all

'Include the cbFilt
Include "cbFilt.CB"

set = LoadImage("tileset.bmp")
tex = MakeImage(32,32)
tex2 = MakeImage(32,32)

CopyBox 2*32,0,32,32,0,0,Image(set),Image(tex)
CopyBox 2*32,2*32,32,32,0,0,Image(set),Image(tex2)

iw = ImageWidth(tex)
ih = ImageHeight(tex)

' Dim the tables needed for every image etc.
Dim images(13)
Dim dest_pix(4)
Dim src_pix1(iw,ih,3)
Dim src_pix2(iw,ih,3)

images(0) = CloneImage(tex)


' +---------------------------+
' | The fun starts here! (tm) |
' +---------------------------+
For i=1 To 12
    images(i)=CloneImage(tex)
    
    Lock(Image(tex))
    Lock(Image(tex2))
    Lock(Image(images(i)))
    
    For x=0 To iw-1
    For y=0 To ih-1
        pix = GetPixel2(x,y,Image(tex)) ' Get pixel from first image
        Color 0,0,pix ' Put it as current color
        src_pix1(x,y,0)=getRGB(RED) 'Get RED value
        src_pix1(x,y,1)=getRGB(GREEN) 'Get GREEN value
        src_pix1(x,y,2)=getRGB(BLUE) 'Get BLUE value
        pix = GetPixel2(x,y,Image(tex2)) ' Get pixel from second image
        Color 0,0,pix ' Same as above
        src_pix2(x,y,0)=getRGB(RED)' Same as above
        src_pix2(x,y,1)=getRGB(GREEN)' Same as above
        src_pix2(x,y,2)=getRGB(BLUE)' Same as above
        For k=0 To 2
            Select i ' Select image and go through red green and blue
                Case 1 ' First for SoftLight filter
                    dest_pix(k)=SoftLight(src_pix1(x,y,k),src_pix2(x,y,k))
                Case 2 ' Second for HardLight filter
                    dest_pix(k)=HardLight(src_pix1(x,y,k),src_pix2(x,y,k))
                Case 3 ' Third for Difference filter
                    dest_pix(k)=Difference(src_pix1(x,y,k),src_pix2(x,y,k))
                Case 4 ' And so on...
                    dest_pix(k)=Multiply(src_pix1(x,y,k),src_pix2(x,y,k))
                Case 5
                    dest_pix(k)=Average(src_pix1(x,y,k),src_pix2(x,y,k))
                Case 6
                    dest_pix(k)=Screen_(src_pix1(x,y,k),src_pix2(x,y,k))
                Case 7
                    dest_pix(k)=Lighten(src_pix1(x,y,k),src_pix2(x,y,k))
                Case 8
                    dest_pix(k)=Darken(src_pix1(x,y,k),src_pix2(x,y,k))
                Case 9
                    dest_pix(k)=Negation(src_pix1(x,y,k),src_pix2(x,y,k))
                Case 10
                    dest_pix(k)=Exclusion(src_pix1(x,y,k),src_pix2(x,y,k))
                Case 11
                    dest_pix(k)=Overlay(src_pix1(x,y,k),src_pix2(x,y,k))
                Case 12
                    dest_pix(k)=ColorDodge(src_pix1(x,y,k),src_pix2(x,y,k))
            EndSelect
        Next k

        ' Put the red, green and blue to an integer pixel value
        dest_pix(3) = dest_pix(0) Shl 16 + dest_pix(1) Shl 8 + dest_pix(2)
        
        ' Put the pixel in the destination image
        PutPixel2 x,y,dest_pix(3),Image(images(i))
        
    Next y
    Next x
    
    Unlock(Image(tex))
    Unlock(Image(tex2))
    Unlock(Image(images(i)))
Next i
' +---------------------------+
' | The fun ends here :< (tm) |
' +---------------------------+


img = 0
Dim txt As String

'Resize images for better view
ResizeImage tex,64,64
ResizeImage tex2,64,64

For i=0 To 12
    ResizeImage images(i),64,64
Next i

Repeat

    Color 255,0,255

    img=img+(KeyHit(cbkeyup)-KeyHit(cbkeydown))

    If img>12 Then img=12
    If img<0 Then img=0
    
    DrawImage tex,0,0
    DrawImage tex2,80,0
    DrawImage images(img),160,0
    
    CenterText 72,32,"+",2
    CenterText 152,32,"=",2
    
    Select img
        Case 0
            txt="-No filter-"
        Case 1
            txt="SoftLight()"
        Case 2
            txt="HardLight()"
        Case 3
            txt="Difference()"
        Case 4
            txt="Multiply()"
        Case 5
            txt="Average()"
        Case 6
            txt="Screen_()"
        Case 7
            txt="Lighten()"
        Case 8
            txt="Darken()"
        Case 9
            txt="Negation()"
        Case 10
            txt="Exclusion()"
        Case 11
            txt="Overlay()"
        Case 12
            txt="ColorDodge()"
    EndSelect
    
    Text 10,80,"Filter ("+img+"/12): "+txt
    Color 128,32,128
    Text 10,100,"Use arrows up/down to "
    Text 10,110,"change between filters."

    DrawScreen()
    
Forever
Esimerkki 2:

Code: Select all

'Include the cbFilt
Include "cbFilt.CB"

set = LoadImage("tileset.bmp")
tex = MakeImage(32,32)
tex2 = MakeImage(32,32)

CopyBox 2*32,0,32,32,0,0,Image(set),Image(tex)
CopyBox 2*32,2*32,32,32,0,0,Image(set),Image(tex2)

iw = ImageWidth(tex)
ih = ImageHeight(tex)

' Dim the tables needed for every image etc.
Dim images(13)
Dim pix1 As integer
Dim pix2 As integer

images(0) = CloneImage(tex)


' +---------------------------+
' | The fun starts here! (tm) |
' +---------------------------+
For i=1 To 12
    images(i)=CloneImage(tex)
    
    Lock(Image(tex))
    Lock(Image(tex2))
    Lock(Image(images(i)))
    
    For x=0 To iw-1
    For y=0 To ih-1
        pix1 = GetPixel2(x,y,Image(tex)) ' Get pixel from first image
        pix2 = GetPixel2(x,y,Image(tex2)) ' Get pixel from second image
        Select i ' Select image
            Case 1 ' First for SoftLight filter
                dest_pix=PixelFilter(pix1,pix2,i)
            Case 2 ' Second for HardLight filter
                dest_pix=PixelFilter(pix1,pix2,i)
            Case 3 ' Third for Difference filter
                dest_pix=PixelFilter(pix1,pix2,i)
            Case 4 ' And so on...
                dest_pix=PixelFilter(pix1,pix2,i)
            Case 5
                dest_pix=PixelFilter(pix1,pix2,i)
            Case 6
                dest_pix=PixelFilter(pix1,pix2,i)
            Case 7
                dest_pix=PixelFilter(pix1,pix2,i)
            Case 8
                dest_pix=PixelFilter(pix1,pix2,i)
            Case 9
                dest_pix=PixelFilter(pix1,pix2,i)
            Case 10
                dest_pix=PixelFilter(pix1,pix2,i)
            Case 11
                dest_pix=PixelFilter(pix1,pix2,i)
            Case 12
                dest_pix=PixelFilter(pix1,pix2,i)
        EndSelect
        
        ' Put the pixel in the destination image
        PutPixel2 x,y,dest_pix,Image(images(i))
        
    Next y
    Next x
    
    Unlock(Image(tex))
    Unlock(Image(tex2))
    Unlock(Image(images(i)))
Next i
' +---------------------------+
' | The fun ends here :< (tm) |
' +---------------------------+


img = 0
Dim txt As String

'Resize images for better view
ResizeImage tex,64,64
ResizeImage tex2,64,64

For i=0 To 12
    ResizeImage images(i),64,64
Next i

Repeat

    Color 255,0,255

    img=img+(KeyHit(cbkeyup)-KeyHit(cbkeydown))

    If img>12 Then img=12
    If img<0 Then img=0
    
    DrawImage tex,0,0
    DrawImage tex2,80,0
    DrawImage images(img),160,0
    
    CenterText 72,32,"+",2
    CenterText 152,32,"=",2
    
    Select img
        Case 0
            txt="-No filter-"
        Case 1
            txt="SoftLight()"
        Case 2
            txt="HardLight()"
        Case 3
            txt="Difference()"
        Case 4
            txt="Multiply()"
        Case 5
            txt="Average()"
        Case 6
            txt="Screen_()"
        Case 7
            txt="Lighten()"
        Case 8
            txt="Darken()"
        Case 9
            txt="Negation()"
        Case 10
            txt="Exclusion()"
        Case 11
            txt="Overlay()"
        Case 12
            txt="ColorDodge()"
    EndSelect
    
    Text 10,80,"Filter ("+img+"/12): "+txt
    Color 128,32,128
    Text 10,100,"Use arrows up/down to "
    Text 10,110,"change between filters."

    DrawScreen()
    
Forever
Last edited by Misthema on Sat Jul 30, 2011 11:37 pm, edited 3 times in total.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: cbFilt

Post by Latexi95 »

Hienon näköistä jälkeähän tuosta tulee. Joskin noista voisi tehdä versiot myös pixeleille.
Tein tuosta SoftLightista pixeli version ja sitten tein funktion joka yhdistää kaksi kuvaa sen avulla.

Code: Select all

SCREEN 620,200
set = LoadImage("Media/tileset.bmp")
tex = MakeImage(200,200)
tex2 = MakeImage(200,200)

CopyBox 2*32,0,200,200,0,0,Image(set),Image(tex)
CopyBox 2*32,2*32,200,200,0,0,Image(set),Image(tex2)

result = SoftLightCombine(tex,tex2)


DrawImage tex,0,0
DrawImage tex2,210,0
DrawImage result,420,0
DrawScreen
WaitKey








Function SoftLightCombine(img1,img2,offsetX = 0,offsetY = 0)
    i1w = ImageWidth(img1)
    i2w = ImageWidth(img2)
    i1h = ImageHeight(img1)
    i2h = ImageHeight(img2)
    
    endX = Min(offsetX + i2w,i1w)-1
    endY = Min(offsetY + i2h,i1h)-1
    
    
    rw = endX+1-offsetX
    rh = endY+1-offsetY
    result = MakeImage(rw,rh)
    
    rx = -1
    ry = 0
    Lock Image(img1)
    Lock Image(img2)
    Lock Image(result)
    For y = offsetY To endY
        For x = offsetX To endX
            rx + 1
            If rx = rw Then rx = 0 : ry + 1
            PutPixel2 rx,ry,SoftLightPixel(GetPixel2(x,y,Image(img1)),GetPixel2(rx,ry,Image(img2))),Image(result)
        Next x
    Next y
    Unlock Image(img1)
    Unlock Image(img2)
    Unlock Image(result)
    Return result
EndFunction



Function SoftLightPixel(a%,b%)
   r1 As Byte = ((a% Shl 8) Shr 24)
   g1 As Byte = ((a% Shl 16) Shr 24)
   b1 As Byte = ((a% Shl 24) Shr 24)
   
   r2 As Byte = ((b% Shl 8) Shr 24)
   g2 As Byte = ((b% Shl 16) Shr 24)
   b2 As Byte = ((b% Shl 24) Shr 24)
   
   c1%=r1*r2 Shr 8
   c2%=g1*g2 Shr 8
   c3%=b1*b2 Shr 8
   Return (c3+b1*(255-((255-b1)*(255-b2) Shr 8)-c3) Shr 8) +((c2+g1*(255-((255-g1)*(255-g2) Shr 8)-c2) Shr 8) Shl 8) + ((c1+r1*(255-((255-r1)*(255-r2) Shr 8)-c1) Shr 8) Shl 16)
End Function
User avatar
Misthema
Advanced Member
Posts: 312
Joined: Mon Aug 27, 2007 8:32 pm
Location: Turku, Finland
Contact:

Re: cbFilt

Post by Misthema »

Lisäilinpä yhden funktion pixeleille, joka sisältää kaikki suodattimet. Vakioilla kutsuttavissa.
User avatar
Misthema
Advanced Member
Posts: 312
Joined: Mon Aug 27, 2007 8:32 pm
Location: Turku, Finland
Contact:

Re: cbFilt [v1.4] (Update 29.7.2009)

Post by Misthema »

Päivitys. En jaksanut koodinpätkiä muuttaa uudempiin, mutta esimerkit toimivat uudella versiolla myös.
Paketti sisältää kaksi esimerkkisovellusta (ei lähdekoodeja) cbFilt:n käytöstä. =)
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: cbFilt [v1.4] (Update 29.7.2009)

Post by MaGetzUb »

Oli kyllä hieno tuo demo, mutta reaaliaikainen oli hidas tottakai. Näytti silti hyvältä. :)
Last edited by MaGetzUb on Sat Jul 30, 2011 3:21 am, edited 2 times in total.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Post Reply