Tässä funktio, jolla onnistuu kuvan "päällystäminen" halutulla värillä. Alkuperäinen kuva toimii eräänlaisena maskina.
Tästä on hyötyä esimerkiksi peleissä, jossa pelaaja saa valita vaikkapa autonsa värin. Riittää, kun tehdään vain yksi harmaasävyinen(32bit) kuva autosta ja päällystetään se halutulla värillä(esim). Toki maskin väriarvoja muuttamalla, voidaan tietyn värin voimakkuutta muutta tai poistaa kokonaan.
Funktio ei välttämättä ole nopein mahdollinen, mutta riittävä. Eihän päällystämistä tarvitse tehdä, kuin kerran(latausvaiheessa).
Funktion toiminnasta voisin mainita sen verran, että väriarvot lasketaan yksinkertaisella kaavalla:
maskin_väri(x)/255*päällystysväri(x)
Esimerkkiä funktion käytöstä en jaksa rustata, sillä funktion käyttö on sen verran yksinkertaista. Se ottaa siis parametreikseen maskin, ja värin(rgb), jolla kuva päällystetään.
Onnistuessaan, funktio palauttaa arvon 0, virheen sattuessa -1.
HUOM: Funktio päällystää parametriksi annetun maskin!
int PaintImage(SDL_Surface *img, Uint8 red, Uint8 green, Uint8 blue) { Uint32 *pixels; // Osoite pixelitaulukkoon Uint8 r, b, g; // Värin osat // Jos pinta ei ole 32-bittinen if(img->format->BitsPerPixel != 32) return -1; // Lukitaan pinta if(SDL_LockSurface(img)) return -1; // Haetaan pixelitaulun osoite pixels = (Uint32*)img->pixels; // Käydään koko kuva läpi for(int x = 0; x < img->w; x++) { for(int y = 0; y < img->h; y++) { // Ei käsitellä läpinäkyvää väriä if(pixels[y*img->w+x] == img->format->colorkey) continue; // Hajotetaan pixeli RGB:ksi SDL_GetRGB(pixels[y*img->w+x], img->format, &r, &g, &b); // Lasketaan uudet väriarvot r=(Uint8)((double)r/255*red); g=(Uint8)((double)g/255*green); b=(Uint8)((double)b/255*blue); // Muutetaan pixelin arvo pixels[y*img->w+x] = SDL_MapRGB(img->format, r, g, b); } } // Vapautetaan pinnan lukitus SDL_UnlockSurface(img); return 0; }
Tosi kätsy monelle varmaan :D
Jooh. Kivahan toi on jos autopeliä aikoo tehdä.
Näppärä tapa saada helposti käyttäjän kustomoitavat värit.
hei kiitos! jotain tämän tapaista etsinkin! :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.