Hola estoy haciendo unas pruebas con sdl y quiero cargar unas imagenes .tif con transparencias .El problema es que cargo un fichero cualquiera (bmp,jpg,gif....) y no tengo problemas me lo pinta en la consola, me lo muestra ,pero cuando es una imagen tif ,al q mediante el photoshop le he quitado el fondo falla no me muestra nada....creo q con el png ocurriria lo mismo por eso quiero saber si alguien conoce una libreria de sdl q carga este tipo de imagenes o si hay alguna manera de poder cargarlas
mira sdl_image
ya lo he mirado pero nada :(
si uso esa libreria sdl_image y creo q es eso q la imagen lleva transparencias pero al pintarla con img_load...la funcion q uso para cargar la imagen es
SDL_Surface *load_sprite(const char *filename)
{
SDL_Surface *tmp, *bmp;
Uint32 color_key;
tmp=IMG_Load(filename);
if(!tmp) return 0;
color_key=SDL_MapRGB(tmp->format, 255, 0, 255);
SDL_SetColorKey(tmp, SDL_SRCCOLORKEY|SDL_RLEACCEL, color_key);
bmp=SDL_DisplayFormat(tmp);
SDL_FreeSurface(tmp);
if(!bmp) return 0;
return bmp;
}
y claro cuando el fichero q le paso es s.tif me falla me devuelve un 0 me falla en IMG_LOAD...
Como podria cargar una iamgen con transparencias??
Currate tu una funcion de carga manual de TGAs, que el formato está tirado.
y como se hace?pq en eso me pillas en fura de juego
Supongo que sera mirandote las cabeceras de un TGA y viendo como estan distribuidos los pixeles y pasarlos a una SDL_Surface de SDL...
Por si te vale de algo -->
FormatosSaludos! B)
creo que el problema es porque no le estás poniendo el SDL_SetAlpha o algo así...
yo tenía el mismo problema con los PNGs que no me mostraba transparencias...
y creo recordar que la solución fue el setalpha...
claro, esto crea otros problemillas si el modo gráfico no es 32 bpp o si en la misma función cargas imágenes sin transparencias...
es todo un lio :huh:
ALRAZ me puedes poner el codigo q usaste tu para solucionar eso?es q no te entiendo del todo ..es que si funciona pues las paso a png y ya esta solucionado
utiliza
bmp=SDL_DisplayFormatAlpha(tmp);
De todas formas creo que lo mejor que puedes hacer es utilizar PNG que para mi es el formato más completo. Yo estoy haciendo un juego en SDL y todas las imágenes las tengo en PNG y tienen transparencias y va de escándalo. Además te pilla los grados de opacidad en la imagen. Y ademas es un formato libre.
Lo unico que tendrás problemas al utilizar DisplayFormatAlpha, que no vas a poder utilizar SDL_SetAlpha si tiene transparecias el PNG. Para ello te vas a tener que currar una funcion, copiar la imagen en un nuevo SDL_Surface y quitar el color con ColorKey.
Saludos
pero una cosa si el png tienes ya incorporado las transparencias le haces lo del colorkey??o solo a los q quieres quitarle un color?pq entonces para q quieres hacer en png con transparencias si luego tienes q quirarle el fondo con colorkey?
claramente al png no hay que hacerle el colorkey
Si quieres puedes mirar unas librerías en SDL para hacer animaciones que he hecho
http://sdl-animation.software-libre.orgMira la documentacion. Puedes agregar un archivo XML que tiene toda la animacion. En el puedes cargar archivos PNG con transparencias. Puedes mirar el código y lo verás mas claro
Hay una demo con las tiras de bilo y nano y hay 1 archivo PNG con transparencias
saludos
Cómo lo solucioné yo...?
mmmm....
bueno, este código no es la cosa más inteligente; me llevó varios días hacer que funcionara bien a cualquier profundidad de color independientemente de la resolución. La tardanza fue porque el SDL_Image hace un lio con las imágenes que carga si la profundidad de color del archivo no es la misma que la de la pantalla
que si 32 sobre 16, 16 sobre 32, 32 y 32...
aún así no estoy convencido de que funcione :P
a mi no me da problemas con PNGs y un backbuffer de 32 bits. Te carga también bmps 24 bits
pero más de eso no he probado
//Todo esto va en un ciclo que extrae una imagen de una "biblioteca" y lo pone como archivo temporal
Surf = IMG_Load ("img.tmp");
//Checamos la profundidad de color de la imagen yen base a eso hacemos las adaptaciones necesarias
switch (Surf->format->BytesPerPixel)
{
case 1: //Paletizado... esto da miedo...
SDL_SetColorKey (Surf, SDL_SRCCOLORKEY, Color); //Aquí "Color" es un índice dentro de la paleta
Acumulador [i] = SDL_DisplayFormat(Surf); //Acumulador es un Arreglo de SDL_Surface *
SDL_SetColorKey (Acumulador [i], SDL_SRCCOLORKEY, Color);
break;
case 2: //16 y 24 bpp. Esto ya se ve mejor
case 3:
//Pantalla es mi Buffer de video y R, G, B los que tu sabes que son color key
SDL_SetColorKey (Surf, SDL_SRCCOLORKEY, SDL_MapRGB (Pantalla->format, R, G, B));
Acumulador [i] = SDL_DisplayFormat(Surf);
SDL_SetColorKey (Acumulador [i], SDL_SRCCOLORKEY, SDL_MapRGB (Pantalla->format, R, G, B));
break;
case 4: //32 bpp: el que andabamos buscando
SDL_SetColorKey (Surf, SDL_SRCCOLORKEY, SDL_MapRGBA (Pantalla->format, R, G, B, A));
//Si nuestra pantalla no es de 32 bpp, de nada nos sirve usar el canal Alpha
if (Pantalla->format->BytesPerPixel == 4)
{
//Sí es de 32 bits! que bien!
SDL_SetAlpha (Surf, SDL_SRCALPHA, SDL_ALPHA_OPAQUE);
Acumlador [i] = SDL_DisplayFormatAlpha(Surf);
}
else //Y si no es, pues ni modo :(
Acumulador [i] = SDL_DisplayFormat(Surf);
break;
}
Cómo vez, (aparentemente) es cuestion de usar el display format alpha sólo cuando tanto la pantalla como la imagen son de 32 bits; esta rutinilla también me carga las transparencias de los PNGs cuando la pantalla es de 16 bits.
La verdad no estoy seguro que esto de buenos resultados en cualquier profundidad de color.
Edit: Cuando la resolución de pantalla no es de 32 bpp, se usa el canal Alpha del Color_Key para darle transparencia a la imagen. Creo que por eso SDL te da dos funciones de color keying, una con alpha y otra sin alpha
olvidé algo muy importante!! (nooo)
Al final, luego de la última llave va esto:
SDL_FreeSurface (Surf);
//Aquí cierra el ciclo
El problema es q no reconoce el formato tiff pero he probado con la de setAlpha y las imagenes en png y funciona de putisima madre.Gracias a todos ;)