Leer paleta de un BMP

Soporte técnico sobre los lanzamientos de MojonTwins y comentarios sobre los güegos. Ofrecemos soporte técnico con Fourspriter, te ayudamos con ZX Basic o Z88DK, te damos pistas some cómo saltarse un bicho y cosas así.

Moderador: na_th_an

Avatar de Usuario
radastan
Mensajes: 692
Registrado: Vie, 20 Ago 2010, 12:54
Contactar:

Leer paleta de un BMP

Mensajepor radastan » Lun, 19 Ene 2015, 12:11

Buenas a todos.

Estoy realizando un conversor de BMP a código ASM para pasar sprites del modo radastaniano del zxuno a código. Los pixels los leo sin problemas, pero la paleta no se como cogerla.

El problema es que sin la paleta no puedo convertir los pixels a un color, ya que tengo el RGB de los mismos pero no se a que color de paleta corresponde.

¿Alguna idea?

A las malas tendré que definir en un fichero externo los colores de la paleta y cogerlos por aproximación.

PD. PO-FA-VÓ y esas cosas :jias:
Avatar de Usuario
na_th_an
Mensajes: 26413
Registrado: Vie, 09 Ene 2009, 12:18

Re: Leer paleta de un BMP

Mensajepor na_th_an » Lun, 19 Ene 2015, 12:29

¿Cómo funciona la paleta del modo este rarow? ¿Cuántos bits por componente? Sabiendo eso, es fácil detectar el indice más próximo de la paleta tiendo el R, G, y B del pixel original.

Como no sé cómo funcionan los colores en este modo, tampoco te puedo ayudar. Pero si es como pienso (X bits por componente) es tan sencillo como hacer shifts.
Como diría Rorshach: "Urm..."
Avatar de Usuario
radastan
Mensajes: 692
Registrado: Vie, 20 Ago 2010, 12:54
Contactar:

Re: Leer paleta de un BMP

Mensajepor radastan » Lun, 19 Ene 2015, 12:43

Eso lo tengo claro, oh Na_Th_An el grande, si es hasta sencillo. La pega es con que paleta comparar. Los BMP traen la paleta incluida, eso sería lo suyo (y de paso pasar a ASM la paleta). Lo que no quiero es tener que pasar la paleta a mano, ya que estoy programando una herramienta.

En cuanto la termine la modificaré para que sirva también para gráficos de ZX Spectrum, así mato dos pájaros de un tiro. Es que es con IDE, no tienes que pelearte con comandos, y encima multiplataforma (es java). Molaría mucho añadirlo al MK2, y luego hacer lo mismo para el conversor de mapas. Hasta podría hacer que cogiera el tileset, los sprites, y el mapa, y te lo pasara todo al código de una tacada. Vamos, la panacea.
Avatar de Usuario
na_th_an
Mensajes: 26413
Registrado: Vie, 09 Ene 2009, 12:18

Re: Leer paleta de un BMP

Mensajepor na_th_an » Lun, 19 Ene 2015, 13:21

Supuestamente, y sin saber qué estás usando para hacerlo, si cargas un archivo de gráfico puedes obtener el color de cada pixel, da igual si el archivo gráfico es con paleta o no. Y todo lo que conozco usa un formato de 32bits RGBA en el que sacar las componentes es trivial.

Es que creo que no estoy entendiendo muy bien tu pregunta :) Con qué paleta comparar ¿qué? Por eso te preguntaba por cómo genera el modo este los colores.

Por ejemplo, en la ULA+ las paletas son de 3 bits para R, 3 para G y 2 para B. De ese modo, teniendo un color (r, g, b) de una imagen, que tendrá 8 bits por componente, sólo tienes que hacer R = r >> 5; G = g >> 5; B = b >> 6 para obtener el color de ULA+.

Dependiendo del formato de paletas del modo este de ZX-Uno, habrá que hacer una cosa u otra.

En todos mis conversores trabajo por aproximación pura y dura. Como son para uso propio, sé con qué colores tengo que pintar en mi editor gráfico preferido para que la conversión sea como yo quiero. Así, siguiendo el ejemplo de la ULA+, yo dibujaría eligiendo colores que cumpliesen los requisitos de 8 niveles para R o G y cuatro para B.

Si te refieres a que quieres cuantizar primero para obtener una paleta y luego convertir en base a esa paleta, necesitarás dos pasadas... Hay varios algoritmos. Por ejemplo, sabiendo los bits por componente, vas recorriendo la imagen, convirtiendo los pixels, y contando cuántos píxels hay de cada color que vayas encontrando (ya convertidos). Luego coges los 16 colores más repetidos, y recorres de nuevo la imagen aproximando los demás colores a esos.

Otra forma algo más compleja (matemáticamente) es elegir los 16 colores de todos los que has encontrado que cumplan un espectro mayor. Pero para eso hay que cambiar a HLS y usar coordenadas polares (OUCH). Esto lo vi hace muuucho tiempo y apenas recuerdo nada.

De todos modos estas cosas no suelen salir bien. Es preferible que el diseñador trabaje con las restricciones en mente y que el conversor no tenga que adivinar nada. Si quieres hacerlo más universal, siempre puedes requerir que en la imagen haya 16 pixels en algún sitio definido que contengan los 16 colores.

Personalmente, prefiero las herramientas de linea de comandos que pueda meter en un batch. Así el trabajo manual es mínimo. En Ninjajar! cambiamos tantas veces los mapas y los gráficos... Pero cientos de veces. Y sólo había que ejecutar un make.bat para reconstruirlo todo y volver a probar :) Pero entiendo que hay otras formas de trabajar.
Como diría Rorshach: "Urm..."
Avatar de Usuario
iforeve
Mensajes: 731
Registrado: Vie, 09 Ene 2009, 19:49

Re: Leer paleta de un BMP

Mensajepor iforeve » Lun, 19 Ene 2015, 13:44

$this->bbcode_second_pass_quote('na_th_an', '.')..Pero entiendo que hay otras formas de trabajar.