SDL cteni hodnot barev pixelu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

SDL cteni hodnot barev pixelu – C / C++ – Fórum – Programujte.comSDL cteni hodnot barev pixelu – C / C++ – Fórum – Programujte.com

 

Dusan
~ Anonymní uživatel
62 příspěvků
12. 4. 2009   #1
-
0
-

Ahoj,

napsal jsem nasledujici kod, ktery by mel vypsat uroven cervene pro jednotlive pixely obrazku. Obrazek je ulozeny jako 256-ti barevny rastr (BMP ). Nicmene, u vetsiny barev vypisuje hodnotu o par jednotek vyssi, nez ktera se mi zobrazuje napriklad v malovani.
Predpokladam, ze to asi bude zpusobene "zrnitosti" barevne palety, i kdyz me to udivuje, protoze bych pak ocekaval tento problem i v malovani.

Poradte prosim, kde je problem, pripadne jak by bylo potreba kod upravit, aby fungoval pro 24 bitove rastry.

Diky Dusan

for (int i = 0; i < map->w; i++)

for (int j = 0; j < map->h; j++)
{
std::cout << "[" << i << ";" << j << "] ";

Uint8 * pixel = (Uint8 *)map->pixels + i * map->pitch + j * format->BytesPerPixel;
SDL_Color color = format->palette->colors[*pixel];

std::cout << (int)color.r << std::endl;
}

Nahlásit jako SPAM
IP: 217.197.149.–
o-lox0
Super člen
12. 4. 2009   #2
-
0
-

Uint8 * pixel = (Uint8 *)map->pixels + j * map->pitch + i * format->BytesPerPixel;

Nahlásit jako SPAM
IP: 85.71.152.–
Dusan
~ Anonymní uživatel
62 příspěvků
12. 4. 2009   #3
-
0
-

Diky, obrazek byl ctvercovy, takze jsem si toho nevsiml. Ale nastineny problem to neresi.

Nahlásit jako SPAM
IP: 85.70.55.–
bukaj_0010
Věrný člen
12. 4. 2009   #4
-
0
-

Dusan
Mělo by fungovat pro jakýkoli SDL_Surface:

for (int x = 0; x < map->w; x++) {

for (int y = 0; y < map->h; y++) {

// získáme adresu pixelu
Uint8 *p = (Uint8 *) map->pixels +
y * map->pitch +
x * map->format->BytesPerPixel;

// získáme hodnotu pixelu
Uint32 pixel;
switch (map->format->BytesPerPixel) {
case 1:
pixel = *p;
break;
case 2:
pixel = *(Uint16 *) p;
break;
case 3:
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
pixel = p[0] << 16 | p[1] << 8 | p[2];
#else
pixel = p[0] | p[1] << 8 | p[2] << 16;
#endif
break;
case 4:
pixel = *((Uint32 *) p);
break;
default:
std::cerr << "weird BPP" << std::endl;
//exit(-1);
break;
}

// z hodnoty vybereme jednotlivé složky
Uint8 r, g, b, a;
SDL_GetRGBA(pixel, map->format, &r, &g, &b, &a);

// ...
//std::cout << "[" << x << ";" << y << "] => " << (int) r << std::endl;
}
}


SDL_GetRGBA() - http://www.libsdl.org/cgi/docwiki.cgi/SDL_GetRGBA

Nahlásit jako SPAM
IP: 88.101.128.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 115 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý