ColorPick()

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

ColorPick()

Post 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. ;)
Last edited by MaGetzUb on Mon Jun 06, 2011 5:39 pm, edited 1 time in total.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: ColorPick()

Post 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ä :)
Wingman
Devoted Member
Posts: 594
Joined: Tue Sep 30, 2008 4:30 pm
Location: Ruudun toisella puolella

Re: ColorPick()

Post 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
- - - -
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: ColorPick()

Post 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
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Viltzu
Guru
Posts: 1132
Joined: Sun Aug 26, 2007 5:45 pm
Location: Alavieska
Contact:

Re: ColorPick()

Post 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.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: ColorPick()

Post 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? :)

Last edited by MaGetzUb on Mon Jun 06, 2011 5:41 pm, edited 1 time in total.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: ColorPick()

Post 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
Post Reply