Page 1 of 1

ColorPick()

Posted: Sun Jun 05, 2011 11:47 pm
by MaGetzUb
Tuli semmoinen kuningasidea, että voisi tehdä Pick(image)Color:n tyylisen funktion joka hakisi värin aina lukitusta puskurista.
Tuloksena tuli ColorPick! :D Eli ColorPick funktioon annetaan parametrit x, y ja sitten vielä jos haluaa niin muistissa olevan kuvan kahva (tässä piilee koko funktion kätevyys). ;)

Code: Select all

img = LoadImage("Media\Map.BMP")
Repeat

    DrawImage img, 0, 0
    
    Color 0, 0, 0
    Box MouseX(), MouseY(), 20, 20, 0
    
    ColorPick(MouseX()+1, MouseY()+1)
    Box MouseX()+1, MouseY()+1, 18, 18
    
DrawScreen
Forever

//Funktio

Function ColorPick(x, y, source =-1)
    If source < 0 Then 
        source = SCREEN() 
    Else 
        source = Image(source)
    EndIf 

    Lock source
        pix = GetPixel2(x, y, source)
        Color 0, 0, pix
    Unlock source
    
    Return False 
End Function 
edit: jah sanokaas taas jos on jtn epäkohtia koodissa. ;)

Re: ColorPick()

Posted: Mon Jun 06, 2011 2:04 am
by koodaaja
Sinänsä mukava idea, mutta puskurin lukitseminen ja avaaminen joka pikselille tappaa suorituskyvyn melko tehokkaasti jos tarkoituksena on käydä läpi isompia alueita. Mutta ehdoton helppokäyttöisyysplussa on myönnettävä, ei ainakaan vaadi turhaa säätämistä :)

Re: ColorPick()

Posted: Mon Jun 06, 2011 7:47 am
by Wingman
saako CB.llä tarkistettua onko puskuri lukittu? jos niin sitten voisi tehdä niin että funktio käyttää getpixel(2) komentoa lukossa olemisen mukaan, eli voisi lukita näytön läpikäynnin ajaksi (ennen for-looppia tai muuta tapaa). Jos ei voi tunnistaa lukossa olemista niin sitten voisi tehdä niin että vaatii aina lukitun puskurin funktion ulkopuolella toimiakseen

Re: ColorPick()

Posted: Mon Jun 06, 2011 4:42 pm
by MaGetzUb
koodaaja wrote:Sinänsä mukava idea, mutta puskurin lukitseminen ja avaaminen joka pikselille tappaa suorituskyvyn melko tehokkaasti jos tarkoituksena on käydä läpi isompia alueita. Mutta ehdoton helppokäyttöisyysplussa on myönnettävä, ei ainakaan vaadi turhaa säätämistä :)
Joo onhan tuo puskurin lukitus ja vapautus hidasta silmukan sisällä, mutta vielä hitaampaa taitaa olla pelkällä GetPixel:lä lukeminen ei lukitusta puskurista silmukan sisällä? =)
Wingman wrote:saako CB.llä tarkistettua onko puskuri lukittu? jos niin sitten voisi tehdä niin että funktio käyttää getpixel(2) komentoa lukossa olemisen mukaan, eli voisi lukita näytön läpikäynnin ajaksi (ennen for-looppia tai muuta tapaa). Jos ei voi tunnistaa lukossa olemista niin sitten voisi tehdä niin että vaatii aina lukitun puskurin funktion ulkopuolella toimiakseen
Se ei taida olla mahdollista, mutta etsitäänpä porsaanreikiä, jos niitä sattuisi vaikka löytymään. :D

Re: ColorPick()

Posted: Mon Jun 06, 2011 5:24 pm
by Viltzu
MaGetzUb wrote: edit: jah sanokaas taas jos on jtn epäkohtia koodissa. ;)
No tuota, tällä hetkellä laatikko on vain musta koska hiiren kohdalla on vain musta laatikko. (Kartta on sen alla)
Siirtää joko laatikkoa ettei ole hiiren alla.

Code: Select all

Color 0, 0, 0
Box MouseX()+1, MouseY()+1, 20, 20  
    
ColorPick(MouseX(), MouseY())
Box MouseX()+2, MouseY()+2, 18, 18
tai kohtaa mistä tota katsotaan tms.. :P

Code: Select all

ColorPick(MouseX()-1, MouseY()-1)
Ja automaattiseen lukituksen tarkistamiseen voisi käydä kikkailu pickcolorin kanssa. (Mutta tämä oletettavasti hidastaisi huomattavasti)

Code: Select all

Color 132,0,0
Dot 1,1
PickColor 1,1
Jos piirtovärin punainenkomponentti on 0, se tarkoittaisi että puskuri on lukittu. (Dot ei piirrä mitään lukittuun puskuriin). Jos se on 132 silloin puskuria ei ole lukittu.

Re: ColorPick()

Posted: Mon Jun 06, 2011 5:38 pm
by MaGetzUb
Viltzu wrote:
MaGetzUb wrote: edit: jah sanokaas taas jos on jtn epäkohtia koodissa. ;)
No tuota, tällä hetkellä laatikko on vain musta koska hiiren kohdalla on vain musta laatikko. (Kartta on sen alla)
Siirtää joko laatikkoa ettei ole hiiren alla.

Code: Select all

Color 0, 0, 0
Box MouseX()+1, MouseY()+1, 20, 20  
    
ColorPick(MouseX(), MouseY())
Box MouseX()+2, MouseY()+2, 18, 18
tai kohtaa mistä tota katsotaan tms.. :P

Code: Select all

ColorPick(MouseX()-1, MouseY()-1)
Ja automaattiseen lukituksen tarkistamiseen voisi käydä kikkailu pickcolorin kanssa. (Mutta tämä oletettavasti hidastaisi huomattavasti)

Code: Select all

Color 132,0,0
Dot 1,1
PickColor 1,1
Jos piirtovärin punainenkomponentti on 0, se tarkoittaisi että puskuri on lukittu. (Dot ei piirrä mitään lukittuun puskuriin). Jos se on 132 silloin puskuria ei ole lukittu.
Hehe arvasinpas tämän että jotain oli taas mennyt pieleen kun täälä cbfoorumilla koodia rupee muokkailemaan ilman editoria ja tarkistuksia. :D
Muokkaanpa tuon ekan koodin. ->
EDIT:

Niin ja tuosta puskuritarkistuksesta sen verran eikö GetPixel hoitaisi tuota PickColoria? :)


Re: ColorPick()

Posted: Mon Jun 06, 2011 5:40 pm
by koodaaja
MaGetzUb wrote:Joo onhan tuo puskurin lukitus ja vapautus hidasta silmukan sisällä, mutta vielä hitaampaa taitaa olla pelkällä GetPixel:lä lukeminen ei lukitusta puskurista silmukan sisällä? =)
Niin sitä voisi kuvitella ;) Lukitus itsessäänhän on pirun hidas operaatio, sen nopeuttava vaikutus perustuu siihen että sen jälkeen dataa saa muokata vapaasti ennen avaamista. En kyllä tunne getpixelin toteutustakaan, voi olla että CB lukitsee vain osan puskuria automaagisesti tai jotain muita taikuuksia, Zerohan tästä tietäisi enemmän kertoa.

Code: Select all

img = LoadImage("media/map.bmp")
imgi = Image(img)

t = Timer()
For i = 0 To 99999
    a = GetPixel(10,10,imgi)
Next i
Print Str(Timer()-t)

t = Timer()
For i = 0 To 99999
    Lock imgi
        a = GetPixel2(10,10,imgi)
    Unlock imgi
Next i
Print Str(Timer()-t)

WaitKey