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.