PDA

Ver la versión completa : [Programación] Uso de SDL_ConvertSurface



turco
28/12/2011, 22:35
Buenas a todos,

Estoy haciendo una pequeña actualización de mi programita de dibujo, y estoy teniendo problemas con la interpretacion de los colores. Os pongo en situación...

Como no domino demasiado el tema de los colores (32 bits, 16, colores indexados...) he decidido trabajar sólo con 24 bits, por lo que inicialmente creo una imagen de 24 bits de la siguiente forma:


#if SDL_BYTEORDER == SDL_BIG_ENDIAN
#define RMASK 0xff0000
#define GMASK 0x00ff00
#define BMASK 0x0000ff
#else
#define RMASK 0x0000ff
#define GMASK 0x00ff00
#define BMASK 0xff0000
#endif

canvas->image = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 24, RMASK, GMASK, BMASK, 0);

Cuando cargo cualquier imagen directamente le hago lo siguiente para pasarla a 24 bits:

SDL_Surface* formated_image = SDL_ConvertSurface(new_image, _canvas->image->format, 0);

La imagen no se muestra correctamente, aparece con los colores cambiado, ¿alguien sabe así a bote pronto qué estoy haciendo mal?

Desde ya gracias

< - >
Añado que aunque la imagen no se muestra correctamente, si la guardo sí que se guarda con los colores que tenía la imagen original.

Jurk
28/12/2011, 22:42
creo que el problema es que aunque cambies el surface a 24 bits, luego si cargas una imagen de 8 bits indexada de da por el culete... para ello lo mejor seria convertir la imagen a cargar antes de ponerla en el surface...

con la siguiente funcion la imagen pasa al formato de la pantalla... si la pantalla esta a 24 bits... bingo!



Sacado de Lazyfoo

SDL_Surface *load_image( std::string filename )
{
//The image that's loaded
SDL_Surface* loadedImage = NULL;

//The optimized image that will be used
SDL_Surface* optimizedImage = NULL;

//Load the image using SDL_image
loadedImage = IMG_Load( filename.c_str() );

//If the image loaded
if( loadedImage != NULL )
{
//Create an optimized image
optimizedImage = SDL_DisplayFormat( loadedImage );

//Free the old image
SDL_FreeSurface( loadedImage );
}

//Return the optimized image
return optimizedImage;
}

RESUMIENDO: no cambies el formato del surface... cambia el de la imagen, que seguro que es mas facil...

POr cierto, que tal el pack de comics?

turco
28/12/2011, 22:56
Uff el pack de cómics IMpresionante :babea: !! Sólo los he podido ver a la carrera y tendré que esperar un poco para disfrutarlos, pero me ha encantado [wei]

Con respecto a lo de la imagen, no conocía la función SDL_DisplayFormat(), voy a echarle un vistazo e intentaré hacer lo que me dices.

Muchas gracias Jurk ;)

Jurk
28/12/2011, 23:04
por cierto, si no lo conoces...

http://lazyfoo.net/SDL_tutorials/index.php

turco
28/12/2011, 23:11
:saltando:

Bueno pues con el uso de la función SDL_DisplayFormat() ya se muestrán correctamente las imágenes :D!! Gracias de nuevo!

Jurk
28/12/2011, 23:15
Epic win por mi parte.... cada dia me molo mas