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
iforeve
Mensajes: 731
Registrado: Vie, 09 Ene 2009, 19:49

Re: Leer paleta de un BMP

Mensajepor iforeve » Jue, 22 Ene 2015, 19:29

Yo echaria una mano, pero tengo lio para por lo menos 20 o 21 dias. :cry:
Avatar de Usuario
radastan
Mensajes: 692
Registrado: Vie, 20 Ago 2010, 12:54
Contactar:

Re: Leer paleta de un BMP

Mensajepor radastan » Jue, 22 Ene 2015, 23:46

Lo que necesito es coger un bitmap (o png) y que en base a una paleta definida en un fichero de texto (16 valores en formato RRRGGGBB) lo convierta a valores de pixel de 4 bits y los devuelva en un fichero de texto.

Ejemplo de paleta:

147, 241, 3, 20, 28, 132, 1, 160, 224, 130, 68, 180, 252, 142, 255, 0

Ejemplo de salida:

Código: Seleccionar todo

#asm
   ._sprite_test
   DEFB   0, 0, 1, 1
   DEFB   2, 2, 3, 3
   DEFB   4, 4, 5, 5
   DEFB   6, 6, 7, 7
   DEFB   8, 8, 9, 9
   DEFB   10, 10, 11, 11
   DEFB   12, 12, 13, 13
   DEFB   14, 14, 15, 15

#endasm
antoniovillena
Mensajes: 494
Registrado: Jue, 24 Oct 2013, 15:52

Re: Leer paleta de un BMP

Mensajepor antoniovillena » Vie, 23 Ene 2015, 00:14

Yo hasta el miércoles que viene también estoy liado. Pero no entiendo por qué desempaquetas el sprite. Si en un byte puedes tener 2 píxeles, ¿por qué separarlos?. Es más, la rutina que te pinte los sprites tomando nibbles separados va a ser mucho más lenta que otra que imprima los bytes ya empaquetados.
Avatar de Usuario
radastan
Mensajes: 692
Registrado: Vie, 20 Ago 2010, 12:54
Contactar:

Re: Leer paleta de un BMP

Mensajepor radastan » Vie, 23 Ene 2015, 00:30

antoniovillena escribió:Yo hasta el miércoles que viene también estoy liado. Pero no entiendo por qué desempaquetas el sprite. Si en un byte puedes tener 2 píxeles, ¿por qué separarlos?. Es más, la rutina que te pinte los sprites tomando nibbles separados va a ser mucho más lenta que otra que imprima los bytes ya empaquetados.


¿?

Yo no estoy desempaquetando el sprite, ni los separo. Esto no tiene nada que ver con la rutina de imprimir pixels.

La rutina de sprites ya funciona y va de perlas.

Eso si, vaya por adelantado el agradecimiento a todos por la ayuda, aunque sea tardía. Necesito poner en práctica unas ideas que tengo en mente para el ZXUno.
antoniovillena
Mensajes: 494
Registrado: Jue, 24 Oct 2013, 15:52

Re: Leer paleta de un BMP

Mensajepor antoniovillena » Vie, 23 Ene 2015, 00:41

Entonces no me he enterado de lo que quieres hacer.
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Leer paleta de un BMP

Mensajepor na_th_an » Vie, 23 Ene 2015, 08:17

¿Quieres que saque esos 32 bytes por cada cacho de 8x8 del PNG original? ¿4 bits por pixel, en el orden natural? Voy a ver si tengo rato luego, parece sencillo y ya he hecho tantos ... :)
Como diría Rorshach: "Urm..."
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Leer paleta de un BMP

Mensajepor na_th_an » Vie, 23 Ene 2015, 12:10

Lo tengo casi. Ha sido fácil porque he empleado una reducción de colores bastante tonta, pero tengo que probar que lo he hecho bien.

Lo de la reducción de colores es lo de menos si el grafista usa los colores buenos cuando edite la imagen.
Como diría Rorshach: "Urm..."
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Leer paleta de un BMP

Mensajepor na_th_an » Vie, 23 Ene 2015, 12:54

Yastá.

No he trabajado con estas paletas nada. El problema principal es que las conversiones de RRRGGGBB a RGB las hago simplemente multiplicando, por lo que las intensidades nunca llegan al máximo de 255. Por ejemplo, el valor máximo de R sería 11100000, o sea, desplazando 5 veces a la izquierda. No sé cómo escalar mejor, la verdad.

He incluido el código fuente por si lo quieres cambiar por un cálculo mejor. Necesitas freeBasic para compilar. Las bibliotecas de leer PNG están incluidas en el RAR. La función que hace el cálculo de paleta RRRGGGBB a RGB normal es esta:

Código: Seleccionar todo

For i = 0 To 15
   ' Palette format is RRRGGGBB
   orgPalEntry = Val ("&H" & Mid (Command (3), 1 + (i * 2), 2))

   ' Extract & convert R
   r = (orgPalEntry And &HE0)
   
   ' Extract & convert G
   g = (orgPalEntry And &H1C) Shl 3
   
   ' Extract & convert B
   b = ((orgPalEntry And &H03) Shl 6)
   
   ' Store
   cnvPal (i) = RGB (r, g, b)
Next i


Es quizá lo único que cabría mejorar.

En teoría se traga cualquier png con cualquier número de colores y cuantiza. La cuantización se hace por aproximación pura y dura de una media entre R, G y B... No es el mejor algoritmo pero funciona bien - y si pintas la imagen con los colores correctos la conversión es, obviamente, perfecta.

El paquetón

He metido varias utilidades. En todas las utilidades que hay que especificar una paleta, en vez de un archivo de texto, he preferido hacerlo por linea de comandos. La paleta se especifica siempre como una cadena de 32 caracteres, que corresponden a 16 valores en hexadecimal de 2 dígitos cada uno. Por ejemplo, la paleta que me has pasado sería

Código: Seleccionar todo

93F103141C8401A0E08244B4FC8EFF00


Estos son los programas

gennice.exe - genera una paleta más o menos completa de 15 colores. Para probar. Saca nicepal.png con la paleta para que puedas meterla en tu editor gráfico y dibujar.

genpal.exe - Toma como parámetros un archivo de salida y una paleta en formato HEX y te saca un png con la paleta para que la puedas usar para dibujar. Me lo he hecho para probar yo, pero puede servir. Por ejemplo:

Código: Seleccionar todo

genpal paltest.png 0002080A1012181A8082888A9092989A


radspr.exe - Es el conversor. Pilla un png con los gráficos (no compruebo nada, pero para que vaya bien las medidas tienen que ser múltiplos de 8) y saca cada cacho de 8x8 en el archivo de salida. Por ejemplo:

Código: Seleccionar todo

radspr in.png out.h 0002080A1012181A8082888A9092989A


con la imagen que adjunto, saca esto:

Código: Seleccionar todo

#asm

; Sprite #0
    defb 0xFF, 0xF8, 0x8F, 0xFF
    defb 0xFF, 0xF8, 0x8F, 0xFF
    defb 0xF9, 0x99, 0x99, 0x9F
    defb 0x99, 0xFA, 0xAF, 0x99
    defb 0x99, 0xFA, 0xAF, 0x99
    defb 0xFF, 0xAA, 0xAA, 0xFF
    defb 0xFA, 0xAF, 0xFA, 0xAF
    defb 0xFA, 0xAF, 0xFA, 0xAF

; Sprite #1
    defb 0x00, 0x00, 0x00, 0x00
    defb 0x00, 0xEE, 0xEE, 0x00
    defb 0x0E, 0xEE, 0xEE, 0xE0
    defb 0x0E, 0xEE, 0xEE, 0xE0
    defb 0x0E, 0xEE, 0xEE, 0xE0
    defb 0x0E, 0xEE, 0xEE, 0xE0
    defb 0x00, 0xEE, 0xEE, 0x00
    defb 0x00, 0x00, 0x00, 0x00

; Sprite #2
    defb 0xFF, 0xFF, 0xFF, 0xFF
    defb 0xFF, 0xFF, 0xF6, 0x6F
    defb 0xFF, 0xFF, 0xF6, 0x6F
    defb 0xFF, 0xF2, 0x2F, 0xFF
    defb 0xFF, 0xF2, 0x2F, 0xFF
    defb 0xFD, 0xDF, 0xFF, 0xFF
    defb 0xFD, 0xDF, 0xFF, 0xFF
    defb 0xFF, 0xFF, 0xFF, 0xFF

; Sprite #3
    defb 0x00, 0x00, 0x00, 0x00
    defb 0x07, 0x77, 0x77, 0x70
    defb 0x07, 0x11, 0x11, 0x70
    defb 0x07, 0x11, 0x11, 0x70
    defb 0x07, 0x11, 0x11, 0x70
    defb 0x07, 0x11, 0x11, 0x70
    defb 0x07, 0x77, 0x77, 0x70
    defb 0x00, 0x00, 0x00, 0x00

#endasm


Parece funcionar... Lo único que no me gusta es la conversión de paleta a RGB, porque las multiplicaciones, como digo, nunca llegan al máximo. Pero aparte de ese detalle, va guay. Con dibujar con la paleta que saca genpal, creo que no habrá mucho problema.
Adjuntos
in.png
in.png (316 Bytes) Visto 4187 veces
radasmode.rar
(220.81 KiB) Descargado 170 veces
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 » Vie, 23 Ene 2015, 22:03

:vahka: :vahka: :vahka: :vahka: :vahka:

¡Oleeeeeeeeeeeeeeeeeeeee!

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

Re: Leer paleta de un BMP

Mensajepor radastan » Vie, 23 Ene 2015, 23:35

Bueno, pues el conversor de paletas al menos no va bien.

Trato de usar la paleta corregida de Mc Leod (que supuestamente cumple 100% la ULA+) y no consigo una paleta igual.

http://www.zonadepruebas.com/viewtopic.php?f=26&t=4796&start=30

Me salen colores muy verdosos.

Por citar un ejemplo, meto esta imagen, escrupulosa con la paleta ULAPLUS:

Imagen

Y me sale esta paleta:

Imagen
Adjuntos
nicepal.png
nicepal.png (136 Bytes) Visto 4146 veces
test.png
test.png (981 Bytes) Visto 4139 veces

Volver a “Ayuda”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado