Afbeelding pixel voor pixel uit db kunnen lezen
Op dit moment is het mij gelukt om de x en y coordinaten + de kleurcode van een afbeelding in een database te zetten (via ImageMagick). Een afbeelding van 150x150 is dus 22500 records. Een extra kolom geeft aan of de pixel wel/niet zichtbaar is. Via een button kan ik steeds 1 pixel zichtbaar maken. De pixels worden in divjes gezet. Zeker niet efficient maar ik ben al blij dat ik dit werkend heb gekregen. Zolang er weinig pixels zichtbaar zijn, laadt de pagina snel. Maar zodra het aantal pixels en dus divjes richting de 22500 gaat, wordt het allemaal erg traag.
Vandaar dat ik andere mogelijkheden aan het bekijken ben. Ik ben geen grote ster met PHP maar heb eea gelezen over imagesetpixel en imagecreatefromjpg. Alleen krijg ik dit niet werkend en weet ik ook niet of dit hetgeen is wat ik kan gebruiken.
Ik hoop dat jullie me een zetje in de juiste richting kunnen geven.
Waarom wil je een plaatje pixel voor pixel uit een database lezen? Misschien als je vertelt waarvoor je het doet dat we je wat meer kunnen helpen.
Is voor een raadspelletje. Iemand moet wat doen om een pixel zichtbaar te krijgen. Hoe meer pixels er zichtbaar zijn, des te duidelijk wordt de afbeelding.
Maar zoals Rick al aangeeft wat is de bedoeling ervan?
Kan me niet voorstellen dat dit in een dagelijkse applicatie nodig is.
Kan je niet beter kijken naar een javascript oplossing? Of misschien nog beter, een html5 canvas oplossing?
Dat lijkt me efficiënter werken dan dit stuk theorie wat je nu ons verteld...
Iemand moet dus 22500 keer iets doen om het hele plaatje te zien? Ik zou zeggen doe dit niet per pixel maar slice het plaatje in een opgeefbaar aantal stukjes. Dan kun je ervoor zorgen dat het spelletje snel blijft en zelf bepalen hoeveel stukjes er zijn.
Ik heb zelf ook al aan het canvas gebeuren gedacht maar wist niet zeker of het daar wel mee kan. Dat is dus een goede mogelijkheid?
Het probleem is dat je dan 22500 pixel uit de database moet halen en elke pixel staat voor 1 record. Als ik uit een database 22500 records moet halen zal dit nooit snel gaan. Het is namelijk veel data dat verwerkt moet worden. Ik raad je daarom toch aan om hier iets anders op te vinden.
Kan zo snel geen voorbeeld vinden, maar denk dat dit al een stuk efficiënter en sneller is.
Hoewel je natuurlijk wel met de verschillende browsers zit. Weet niet of elke browser het zal weergeven.
EDIT niet pixel voor pixel uit een database gaan doen.
Dat is veel te traag. Je moet de plaatjes laten faden, slicen.
Gewijzigd op 24/10/2012 13:56:21 door Bart V B
Met faden, slicen bedoel je in grotere brokken laten laden?
Gewijzigd op 24/10/2012 13:58:28 door Peter de Graaf
Dan zou ik werken met een cron, die elke minuut een nieuwe volledige afbeelding aanmaakt. Daardoor leg je de wachttijd op de server en niet bij uw bezoekers. De bezoeker moet slechts 1 afbeelding laden, die opgeslagen staat op de server. Ook de time-out problemen zijn dan van de baan.
In die cron laat je dus de gd library gewoon de afbeelding inladen. Je berekent de vlakken die niet zichtbaar zijn, en die overschrijf je gewoon met een kleur. Die afbeelding kan je dan opslaan onder de naam 'raadsel2_aantalrecords.jpg'. Hierdoor weet je of de cron een nieuwe afbeelding moet laden of niet.
In het administratieve gedeelte kan je dan met een canvas werken om gewoon de zichtbare vlakken te tekenen.
Grappige vraag.
Ja, dat moet allemaal lukken.
Tegenwoordig heeft javascript veel meer (dan niet zo lang geleden) mogelijkheden om images te lezen. Het moet mogelijk zijn om dit locaal te doen. Eventueel kan je dan met <canvas> verder doen.
Maar mijn oplossing zou toch vooral zijn om de rekenkracht asynchroon te laten werken.
Dus, je laat Ajax ofwel een web worker de regie nemen.
Je kan dan asynchroon delen van de image laten berekenen.
Het duurt nog steeds de tijd die nodig is, maar als gebruiker heb je er veel minder last van.
En je kan in real time de image zien opgebouwd worden.
Indien je bij PHP wilt blijven kun je ook 1 record per plaatje gaan genereren. Bouw een array die voor jou specifieke situatie werkt. Serialize deze base64 encode erover heen en dan opslaan in de database. Dan zou je met een paar methode's kunnen filteren in de array.
Leuk om de verschillende benaderingen te lezen. Bedankt hiervoor. Ik ga kijken wat voor mij de meest handige oplossing is.