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.