Ver la versión completa : Crear imágenes de 16bpp
Hola. Aunque esto de entrada no tiene que ver mucho con programación luego veréis la relación.
El caso es que estoy programando una aplicación con SDL y quiero usar 16 bits por píxel. Si creo una imágen desde Graphics Gale a 16 bpp o desde Photoshop a 8 bpp (aquí son 8 por canal) obtengo imágenes de 24 bpp, y no sé por qué. Las imágenes tienen formato PNG.
Como resultado, para cargar las imágenes vía SDL_image tengo que convertirlas a 16 bpp al principio, porque en caso contrario SDL las convierte cada vez que las ha de pintar, y eso en el ordenador no se nota, pero en la consola sí. Esto es lo que tengo que hacer:
SDL_Surface* tmpButtonSet = IMG_Load("data/buttonset.png");
if (tmpButtonSet == NULL)
{
cerr << "Error reading <data/buttonset.png>: " << SDL_GetError() << endl;
exit(1);
}
SDL_SetColorKey(tmpButtonSet, SDL_SRCCOLORKEY, SDL_MapRGB(mSurface->format, 1, 0, 0));
mButtonSet = SDL_DisplayFormat(tmpButtonSet);
SDL_FreeSurface(tmpButtonSet);
En resumen, cargo la imagen en una variable temporal, le digo cuál es el color transparente, y hago una copia convertida (es lo que hace SDL_DisplayFormat).
¿Sabéis cómo las puedo crear directamente de 16 bpp, o algún programa que lo haga, o a malas, algún programa que haga la conversión?
Hombre lo que yo hacia era convertir la imagen en el mismo formato de pixels que la screen con lo siguiente
SDL_Surface *newimage = SDL_ConvertSurface(image, screen->format, SDL_SWSURFACE);aunque no se si era esto lo que preguntabas... :(
Si lo que quieres es convertir imagenes a la profundidad de color que quieras, te recomiendo que uses la utilidad convert de ImageMagick, un paquete de herramientas (y librerías) disponible en varias plataformas, como Linux y Windows, y puedes crearte un script (o un archivo batch si usas Windows) para convertir varias a la vez, por ejemplo:
convert -depth 16 -quality 90 imagen_original.png imagen_convertida_a_16_bpp.png
El parametro de calidad de compresión, quality, es opcional, el importante en este caso es depth para indicar la profundidad de color de la imagen de salida a 16 bpp.
En la pagina de ImageMagick (http://www.imagemagick.org/) tienes más info y las descargas, y aquí (http://www.cit.gu.edu.au/~anthony/graphics/imagick6/) una pagina dedicada a estas herramientas.
Si lo que quieres es convertir imagenes a la profundidad de color que quieras, te recomiendo que uses la utilidad convert de ImageMagick, un paquete de herramientas (y librerías) disponible en varias plataformas, como Linux y Windows, y puedes crearte un script (o un archivo batch si usas Windows) para convertir varias a la vez, por ejemplo:
convert -depth 16 -quality 90 imagen_original.png imagen_convertida_a_16_bpp.png
Muchísimas gracias Uncanny. ImageMagick me sonaba de Linux (si no me equivoco, viene en Ubuntu) pero nunca lo había utilizado directamente. Pero lo de convertir a 16 bpp empieza a parecer una tarea imposible, ya que he ejecutado el comando tal como tu lo has escrito (bueno, sin "-quality 90") y sigue teniendo 24 bits. Por curiosidad, le he dado profundidades de 1, 8 y 32, y nada. He buscado algún comando que me muestre información de la imagen (identify -verbose imagen.png) y los resultados sin convertir y convertida son los mismos.
Sin convertir:
Image: buttonset.png
Format: PNG (Portable Network Graphics)
Class: DirectClass
Geometry: 192x96
Type: TrueColor
Endianess: Undefined
Colorspace: RGB
Channel depth:
Red: 8-bits
Green: 8-bits
Blue: 8-bits
Convertida:
Image: buttonset2.png
Format: PNG (Portable Network Graphics)
Class: DirectClass
Geometry: 192x96
Type: TrueColor
Endianess: Undefined
Colorspace: RGB
Channel depth:
Red: 8-bits
Green: 8-bits
Blue: 8-bits
Como ves, lo único que cambia es el nombre del fichero, y en las dos hay 8 bits por canal. No entiendo nada. Bueno, qué voy a entender si tengo muy poca idea sobre los formatos de imagen...
EDITO:
Se nota que era tarde y malinterpreté todo xDD porque cuando me ha dado de nuevo por ver tu duda he visto que es lo que pedías y no era esto que te di con otros parametros:
Resultado:
Image: imagen_a_16_bits.png
Format: PNG (Portable Network Graphics)
Geometry: 1024x768
Class: DirectClass
Type: TrueColor
Endianess: Undefined
Colorspace: RGB
Channel depth:
Red: 16-bits
Green: 16-bits
Blue: 16-bits
Lo que ocurre es que eso son 48 bits, a 16 bits por cada uno de los canales de color RGB (y es que también se le denomina "erroneamente" como modo de 16 bits, por ser el valor de cada componente de color), y tu buscas 16 bits tipo "High Color" (lo cual es lógico si hablamos de programar con SDL), vamos, un maximo de 65536 colores dados por 5 bits en el rojo, 5 bits en el azul y 6 bits en el verde... pues eso se me antoja complicado, porque con convert solo se puede especificar profundidades de color pero no por cada canal, y además solo de 8 o 16 bits.
Una opción sería es usar solo el parametro -colors 65536 para limitar la cantidad total de colores de la imagen salida y que no sea "True Color" por así decirlo, aunque a los efectos sigua usando 8 bits por canal (resultando 24 bits).
Habrá que buscar otro metodo... :(
Efectivamente, lo probé y creaba una imagen de 48 bits. Y sí, lo que busco son 16 bits en total. Pero bueno, si es tan complicado (yo hace tiempo que busqué por Internet y no fue fácil; eso, y que los programas no den facilidades para la conversión es sintomático) hago la conversión desde programa y ya está. Yo pensaba que hacer la conversión internamente era "lo raro", pero por lo que veo no. Me pregunto qué hace el resto de gente que programa para 16 bpp...
Muchas gracias igualmente, Uncanny. :brindis:
Creo que esto te interesara:
http://es.wikipedia.org/wiki/PNG
Fijate que para imagenes PNG que sean RGB la profundidad minima de colores es de 24 bits.
¿Y porqué no te creas tu propia utilidad?
Es mucho más fácil de lo que parece.
Sobretodo si partes de un archivo BMP 24 bits, que son muy fácil de leer. En algún lugar debo de tener alguna librearía (inacabada) para leer BMPs, si te puede servir me lo dices.
Puck2099
02/02/2006, 05:33
El caso es que estoy programando una aplicación con SDL y quiero usar 16 bits por píxel. Si creo una imágen desde Graphics Gale a 16 bpp o desde Photoshop a 8 bpp (aquí son 8 por canal) obtengo imágenes de 24 bpp, y no sé por qué. Las imágenes tienen formato PNG.
Uhm, pues yo con el Photoshop las convertía a BMPs de 16 bits sin problemas... Y eran 16 bits reales, porque cada imagen de 320x240 ocupaba 150 KBs.
También puedes usar el Paint Shop Pro que es shareware :)
Saludos
Ke interesante O_o Nadie me dijo ke convirtiéndolas aumentaría tanto la eficiencia! En PC ha pasado de ~160fps a ~950fps, y en la GP2X pasa de ~6fps a ~70fps >_< Con esto ya no me hacen falta las SDL aceleradas... Si ya decía yo ke mi programa no exigía tanto... Pero tengo un problema. Uso png, y como buen png, tiene transparencia, y ésta no la ve SDL cuando convierto las surfaces. Ké haceis para usar el canal alfa de los png sin sacrificar demasiada velocidad?
Creo que esto te interesara:
http://es.wikipedia.org/wiki/PNG
Fijate que para imagenes PNG que sean RGB la profundidad minima de colores es de 24 bits.
Gracias por el enlace, BuD. Además, por lo que leo hay algo que parece clave:
Las imagenes en formato PNG pueden ser imágenes de paleta indexada o estar formadas por uno o varios canales. Si existe más de un canal, todos los canales tienen el mismo número de bits por pixel (también llamado profundidad de bits por canal).
Lo que entiendo es que si es paleta indexada ha de ser de 8 bits en total. Así que sólo quedaría la opción de tener varios canales, pero como dice que cada uno ha de tener el mismo número de bits por píxel ya no hay nada que hacer: sin canal alfa, a 5 bits por canal sobraría un bit, y con canal alfa tocaría a 4 bits (demasiados pocos).
¿Y porqué no te creas tu propia utilidad?
Es mucho más fácil de lo que parece.
Sobretodo si partes de un archivo BMP 24 bits, que son muy fácil de leer. En algún lugar debo de tener alguna librearía (inacabada) para leer BMPs, si te puede servir me lo dices.
Gràcies Oankali. Pero es que no quiero perder tiempo con lo de los bpp. Si al fin y al cabo convirtiendo desde SDL lo tengo solucionado. Lo que pasa es que me parecía un poco guarro.
Uhm, pues yo con el Photoshop las convertía a BMPs de 16 bits sin problemas... Y eran 16 bits reales, porque cada imagen de 320x240 ocupaba 150 KBs.
También puedes usar el Paint Shop Pro que es shareware :)
Saludos
Creo recordar (pero no estoy seguro del todo porque lo leí hace tiempo y no sé dónde) que desde no sé qué versión de Photoshop no se podía trabajar a 16 bits. De hecho, al crear una imagen nueva, sólo da opciones para 1, 8 y 16 bits. La de 1 bit no sé, pero el resto se refiere a bits por canal.
Puck, tu Lady Killer, por ejemplo ¿trabaja a 16 bits? ¿Cuál es el formato de las imágenes? Bueno, igual me avanzo y lo descargo para comprobarlo.
Bueno, si me da igual pruebo con Paint Shop Pro. Gracias por la recomendación. Anda que no hace años que no toco ese programa... :)
Puck2099
02/02/2006, 06:38
Creo recordar (pero no estoy seguro del todo porque lo leí hace tiempo y no sé dónde) que desde no sé qué versión de Photoshop no se podía trabajar a 16 bits. De hecho, al crear una imagen nueva, sólo da opciones para 1, 8 y 16 bits. La de 1 bit no sé, pero el resto se refiere a bits por canal.
Pues no sé, pero al menos en el Photoshop 7 que uso yo son 8 o 16 bits en total, no por canal...
Puck, tu Lady Killer, por ejemplo ¿trabaja a 16 bits? ¿Cuál es el formato de las imágenes? Bueno, igual me avanzo y lo descargo para comprobarlo.
Bueno, si me da igual pruebo con Paint Shop Pro. Gracias por la recomendación. Anda que no hace años que no toco ese programa... :)
Pues el LK de la GP32 son BMPs a 8 bits, pero el de la GP2X son BMPs a 16 bits :)
Saludos
Ke interesante O_o Nadie me dijo ke convirtiéndolas aumentaría tanto la eficiencia! En PC ha pasado de ~160fps a ~950fps, y en la GP2X pasa de ~6fps a ~70fps >_< Con esto ya no me hacen falta las SDL aceleradas... Si ya decía yo ke mi programa no exigía tanto... Pero tengo un problema. Uso png, y como buen png, tiene transparencia, y ésta no la ve SDL cuando convierto las surfaces. Ké haceis para usar el canal alfa de los png sin sacrificar demasiada velocidad?
Jeje... Yo programé Tilematch casi entero en Windows y Linux y no tuve en cuenta esa conversión. La primera vez que lo probé en la consola me acojoné porque iba a unos 10 FPS, hasta que leí en la documentación que si no se hacía antes, SDL la hacía automáticamente cada vez que se pintaba. El cambio, como tú mismo has comprobado es bastante grande.
Para lo de las transparencias lo que hago es asignar un color con SDL_SetColorKey (1,0,0):
SDL_SetColorKey(tmpButtonSet, SDL_SRCCOLORKEY, SDL_MapRGB(mSurface->format, 1, 0, 0));
Y creo que lo hago así porque no conseguí que me pillara la transparencia directamente. Diría (pero de esto ya hace tiempo y no estoy muy seguro) que con los BMPs sí era directo.
Pues no sé, pero al menos en el Photoshop 7 que uso yo son 8 o 16 bits en total, no por canal...
Yo es que el que tengo es el CS2 (o sea, la 9).
Pues el LK de la GP32 son BMPs a 8 bits, pero el de la GP2X son BMPs a 16 bits :)
Mola saberlo. A ver si volveré a pasarme a los BMPs...
Para lo de las transparencias lo que hago es asignar un color con SDL_SetColorKey (1,0,0):
SDL_SetColorKey(tmpButtonSet, SDL_SRCCOLORKEY, SDL_MapRGB(mSurface->format, 1, 0, 0));Claro, el color keying siempre es una solución :S pero preferiría poder usar el canal alfa :( Seguro ke hay un trucu para eso.
Lo encontré. Usando SDL_Surface* newtmp = SDL_DisplayFormatAlpha(tmp); te respeta el canal alfa :) Me ha bajado de ~70fps a ~40fps, pero bueno, sigue estando bien.
Lo encontré. Usando SDL_Surface* newtmp = SDL_DisplayFormatAlpha(tmp); te respeta el canal alfa :) Me ha bajado de ~70fps a ~40fps, pero bueno, sigue estando bien.
Ups, la bajada de rendimiento echa patrás. Pero es bueno saberlo... :)
Yo en el caso de querer usar 16 bits no usaría PNG, porque es un formato que solo admite 8 o 24 bits (Si quieres comprobarlo, intenta guardar la imágen con: Exportar para web).
Asi que tu problema no es el photoshop, sino los PNG. Si quieres usar 16 bits reales, tendrás que usar BMP, que al salvar te da la posibilidad de guardarlo en 16 bits.
Perderás la posibilidad de usar el alpha de los PNG, pero ya veo que no la usas, asi que deberia darte igual (excepto porque te tienes que pegar la currada de convertir todas las imágenes, claro)
Puck2099
02/02/2006, 16:07
Perderás la posibilidad de usar el alpha de los PNG, pero ya veo que no la usas, asi que deberia darte igual (excepto porque te tienes que pegar la currada de convertir todas las imágenes, claro)
Usando el Photoshop no es currada para nada, puedes hacer un proceso en lotes y dejarle a él que las convierta todas :)
Saludos
KaosOverride
02/02/2006, 17:33
Al trastear con el xRick me llamo la atencion que todos los graficos estaban convertidos a variables de matrices hexadecimales en los .h, supongo que el autor se encontraria algo similar a esto y decidio hacer la conversion "ANTES" incluso de la compilacion...
Supongo que una utilidad que cargue los graficos mas importantes (menus, presentaciones, GUI, etc), y los escupa en cabeceras .h, puede ser de gran ayuda, y despues una carga por demanda de los graficos menos habituales (Elmentos sueltos del juego, bloques de graficos de niveles...) y convertirlos en tiempo de carga, para conseguir en total menos "paron" para procesar las conversiones...
Asi los graficos habituales quedan "incrustados" en el ejecutable, pero ya van definidos en el formato correcto y ahorran tiempo... (No mola un paron de pantalla negra de 8 segundos, no??) :)
Ya existen diversas utilidades que hacen eso exactamente.
Yo para mis juegos de la GP32 utilizo GP32Converter.exe. No es genial, pero hace su función.
Puck2099
02/02/2006, 17:57
Sí, como dice Oankali, lo de incluir los gráficos en archivos .h se usaba mucho también en la GP32. Además, puede ser útil para que no te "retoquen" los gráficos de tu juego.
Por ejemplo, mi LK de la GP2X ocupa tanto (y tarda un ratillo en cargar) porque tiene los gráficos a 16 bits "incluídos" dentro del propio ejecutable.
Yo bajo Linux modifiqué un programa para que me cree los archivos .h a partir de otros en formato .bmp, convirtiendo todos los que se encuentren en la ruta desde donde lo ejecutes (muchísimo más cómodo y rápido que el GP32Converter que tienes que ir uno a uno...). Si lo quiere alguien que lo diga y lo busco :)
Saludos
Interesante, lo de incluir las imágenes en los ficheros de cabecera...
Interesantisimo. Ya me preguntaba yo de donde K-teto sacaba el fondo de su selector de skins y de la presentacion del principio...
Yo bajo Linux modifiqué un programa para que me cree los archivos .h a partir de otros en formato .bmp, convirtiendo todos los que se encuentren en la ruta desde donde lo ejecutes (muchísimo más cómodo y rápido que el GP32Converter que tienes que ir uno a uno...). Si lo quiere alguien que lo diga y lo busco :) ¿Modificaste al final el bin2c para que hiciera conversiones en masa sin tener que llamarlo desde un script en bash o similar? Si es así, si puedes, sería interesante que pusieras el programilla, puede ser bastante util (sobre todo con muchas imagenes) :)
Puck2099
03/02/2006, 04:05
¿Modificaste al final el bin2c para que hiciera conversiones en masa sin tener que llamarlo desde un script en bash o similar? Si es así, si puedes, sería interesante que pusieras el programilla, puede ser bastante util (sobre todo con muchas imagenes) :)
Uhm, pues ya no me acuerdo si lo modifiqué para que hiciera las conversiones en masa o lo usaba junto a un script para tal fin.
Lo que sí sé seguro es que, con ejecutar un comando en el terminal, convertía todas las imágenes sin tener que pasarles parámetros :)
En un ratillo lo busco (acabo de llegar a casa tras un día agotador) y posteo lo que tenga :)
Saludos
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.