Página 3 de 5

Re: Leer paleta de un BMP

Publicado: Jue, 22 Ene 2015, 19:29
por iforeve
Yo echaria una mano, pero tengo lio para por lo menos 20 o 21 dias. :cry:

Re: Leer paleta de un BMP

Publicado: Jue, 22 Ene 2015, 23:46
por radastan
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:

$this->bbcode_second_pass_code('', '
#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
')

Re: Leer paleta de un BMP

Publicado: Vie, 23 Ene 2015, 00:14
por antoniovillena
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.

Re: Leer paleta de un BMP

Publicado: Vie, 23 Ene 2015, 00:30
por radastan
$this->bbcode_second_pass_quote('antoniovillena', 'Y')o 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.

Re: Leer paleta de un BMP

Publicado: Vie, 23 Ene 2015, 00:41
por antoniovillena
Entonces no me he enterado de lo que quieres hacer.

Re: Leer paleta de un BMP

Publicado: Vie, 23 Ene 2015, 08:17
por na_th_an
¿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 ... :)

Re: Leer paleta de un BMP

Publicado: Vie, 23 Ene 2015, 12:10
por na_th_an
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.

Re: Leer paleta de un BMP

Publicado: Vie, 23 Ene 2015, 12:54
por na_th_an
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:

$this->bbcode_second_pass_code('', '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

$this->bbcode_second_pass_code('', '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:

$this->bbcode_second_pass_code('', '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:

$this->bbcode_second_pass_code('', 'radspr in.png out.h 0002080A1012181A8082888A9092989A')

con la imagen que adjunto, saca esto:

$this->bbcode_second_pass_code('', '#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.

Re: Leer paleta de un BMP

Publicado: Vie, 23 Ene 2015, 22:03
por radastan
:vahka: :vahka: :vahka: :vahka: :vahka:

¡Oleeeeeeeeeeeeeeeeeeeee!

Muchas gracias genio.

Re: Leer paleta de un BMP

Publicado: Vie, 23 Ene 2015, 23:35
por radastan
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:

Image

Y me sale esta paleta:

Image