Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Lucas333 en 18 de Diciembre de 2004, 01:14:06 AM

Título: Q Libreria De Sdl .....
Publicado por: Lucas333 en 18 de Diciembre de 2004, 01:14:06 AM
 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  
Título: Q Libreria De Sdl .....
Publicado por: CoLSoN2 en 18 de Diciembre de 2004, 02:27:50 AM
 mira sdl_image
Título: Q Libreria De Sdl .....
Publicado por: Lucas333 en 18 de Diciembre de 2004, 12:47:58 PM
 ya lo he mirado pero nada :(
Título: Q Libreria De Sdl .....
Publicado por: Lucas333 en 18 de Diciembre de 2004, 01:42:46 PM
 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??
Título: Q Libreria De Sdl .....
Publicado por: Javi SJ Cervera en 18 de Diciembre de 2004, 02:36:40 PM
 Currate tu una funcion de carga manual de TGAs, que el formato está tirado.
Título: Q Libreria De Sdl .....
Publicado por: Lucas333 en 18 de Diciembre de 2004, 02:50:19 PM
 y como se hace?pq en eso me pillas en fura de juego  
Título: Q Libreria De Sdl .....
Publicado por: nsL en 18 de Diciembre de 2004, 04:14:59 PM
 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 --> Formatos

Saludos!  B)  
Título: Q Libreria De Sdl .....
Publicado por: ALRAZ en 22 de Diciembre de 2004, 07:19:10 AM
 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:  
Título: Q Libreria De Sdl .....
Publicado por: Lucas333 en 23 de Diciembre de 2004, 05:26:29 PM
 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
Título: Q Libreria De Sdl .....
Publicado por: javiel en 23 de Diciembre de 2004, 05:57:07 PM
 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
Título: Q Libreria De Sdl .....
Publicado por: Lucas333 en 23 de Diciembre de 2004, 06:29:02 PM
 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?
Título: Q Libreria De Sdl .....
Publicado por: javiel en 23 de Diciembre de 2004, 09:43:15 PM
 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.org

Mira 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
Título: Q Libreria De Sdl .....
Publicado por: ALRAZ en 23 de Diciembre de 2004, 09:51:23 PM
 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
Título: Q Libreria De Sdl .....
Publicado por: ALRAZ en 23 de Diciembre de 2004, 10:19:11 PM
 olvidé algo muy importante!! (nooo)

Al final, luego de la última llave va esto:


     SDL_FreeSurface (Surf);

     //Aquí cierra el ciclo
Título: Q Libreria De Sdl .....
Publicado por: Lucas333 en 24 de Diciembre de 2004, 02:29:10 PM
 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 ;)