Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: Kuvan päällystys värillä (SDL)

Gaxx [01.10.2007 22:49:41]

#

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;
}

temu92 [08.10.2007 14:29:15]

#

Tosi kätsy monelle varmaan :D

moptim [08.10.2007 16:59:22]

#

Jooh. Kivahan toi on jos autopeliä aikoo tehdä.

progo [11.10.2007 20:47:02]

#

Näppärä tapa saada helposti käyttäjän kustomoitavat värit.

Bearz [17.10.2007 22:39:42]

#

hei kiitos! jotain tämän tapaista etsinkin! :)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta