Breve tutorial de manipulación de imágenes de roms (.NCGR y .NCLR)

Bueno, como vi que habia gente interesada en el tema pues expongo mis conocimientos (mas bien mi modo de operar) la hora de editar imágenes en roms (que yo sepa .NCGR y .NCLR).
Primeramente se necestitan los siguientes programas:
DSLazy o ndstool
Tahaxan
Editor hexadecimal
Paint
Notepad

Primeramente tenemos que explorar nuestra rom con el Tahaxan, para encontrar mas facilmente que archivos necesitamos editar.
Imagen

Yo en mi caso he elegido una imagen de un icono con forma de cruz "+", como se puede apreciar en la siguiente imagen:
Imagen
Bién simple ella.
También es aconsejable memorizar (o en su defecto apuntar) el tamaño de la imagen (en este caso 16x16) y el número de colores de la paleta (16 también en este caso).
Supongo que tampoco habrá que decir que diferiencieis los nombres de los archivos siendo en mi caso:
co_b_add_s.NCGR el archivo de imagen
co_b_add_s.NCLR el archivo de paleta


Bueno, cuando ya tengamos esta información el siguiente paso es el de desenpaquetar la rom usando dslazy o ndstool.

Una vez desenpaquetado buscamos el archivo de imagen (en mi caso co_b_add_s.NCGR) y lo abrimos con un editor hexadecimal y nos aparecerá esto:
Imagen
Estamos un poco perdidos porque no sabemos donde empieza la imagen ni donde acaba, asique abrimos otro archivo .NCGR de la misma carpeta para compararlos:
Imagen

Y llegamos a la conclusión de donde acaba la cabecera y donde empieza la imagen y nos enteramos que los bits que determinan en que lugar se posiciona cada color son los siguientes (los que he metido en un recuadro):
Imagen

Esta misma cadena de caracteres es la que nos interesa:
Imagen

Ahora toca lo mas dificil y es invertir la posición de cada caracter en cada pareja de caracteres. En la siguiente imágen os pongo un ejemplo de a lo que yo llamo pareja de caracteres (están con en un cuadradito rojo):
Imagen
(obiamente no encerre en recuadros rojos a todas las cadenas de caracteres porque lo consideré inecesario).
Bueno, ahora lo de invertir la posición, quizás sea lo mas lioso de todo. Pero bueno, yo cuando digo invertir la posición me refiero a que la pareja 54 pasaria a ser 45, la 55 a 55, la 55 a 55, la 55 a 55, la 14 a 41.... así hasta el final quedando algo como esto (en mi caso).
Yo normalmente pongo el resultado de invertir las parejas en el notepad.
45 55 55 55 41 11 11 11 41 11 11 11 41 11 11 16
41 11 11 13 41 11 11 13 41 11 11 13 41 16 33 33
55 55 55 52 11 11 11 12 11 11 11 12 61 11 11 12
31 11 11 12 31 11 11 12 31 11 11 12 33 33 61 12
41 16 33 33 41 11 11 13 41 11 11 13 41 11 11 13
41 11 11 16 41 11 11 11 41 11 11 11 22 22 22 22
33 33 61 12 31 11 11 12 31 11 11 12 31 11 11 12
61 11 11 12 11 11 11 12 11 11 11 12 22 22 22 22

Bueno, ahora toca el turno a lo graciosamente complicado:
Yo para ver mejor los resultados prefiero eliminar los espacios:
Usando el reemplazar todo
45555555411111114111111141111116
41111113411111134111111341163333
55555552111111121111111261111112
31111112311111123111111233336112
41163333411111134111111341111113
41111116411111114111111122222222
33336112311111123111111231111112
61111112111111121111111222222222

(todabia se sigue sin ver nada claro eh xDD)

Bueno, ahora toca (al menos en este caso, pero no está de mas tener la imagen a cambiar con la paleta aplicada como hace el tahaxan a mano para ver como iran los colores) se avanzan los ocho primeros números de la primera linea (o los 8 primeros pixeles de colores ;)) en mi caso (45555555) y justamente entre el octavo y el noveno número (5 y 4) en mi caso, se mete un salto de linea quedando esto:
45555555
411111114111111141111116
41111113411111134111111341163333
55555552111111121111111261111112
31111112311111123111111233336112
41163333411111134111111341111113
41111116411111114111111122222222
33336112311111123111111231111112
61111112111111121111111222222222

:ooo se ve algo xDDD; bueno, se sigue haciendo lo mismo con todoa la linea quedando esto:
45555555
41111111
41111111
41111116
41111113411111134111111341613333
55555552111111121111111261111112
31111112311111123111111233336112
41163333411111134111111341111113
41111116411111114111111122222222
33336112311111123111111231111112
61111112111111121111111222222222

Y también se hace con la segunda linea:
45555555
41111111
41111111
41111116
41111113
41111113
41111113
41163333
55555552111111121111111261111112
31111112311111123111111233336112
41163333411111134111111341111113
41111116411111114111111122222222
33336112311111123111111231111112
61111112111111121111111222222222

Perfecto, ahora ya tenemos un cuadro de 8 x 8 pixeles ^^:
45555555
41111111
41111111
41111116
41111113
41111113
41111113
41163333

Ahora toca seguir con la travesura.
Los siguientes 8 bits en vez de seguir iendo abajo, les tocará ir siguiendo a la primera linea, (la de 45555555) de la siguiente forma:
4555555555555552
41111111
41111111
41111116
41111113
41111113
41111113
41163333
111111121111111261111112
31111112311111123111111233336112
41163333411111134111111341111113
41111116411111114111111122222222
33336112311111123111111231111112
61111112111111121111111222222222

Y seguimos igualmente con lo que queda de linea y la siguiente:
4555555555555552
4111111111111112
4111111111111112
4111111661111112
4111111331111112
4111111331111112
4111111331111112
4116333333336112

41163333411111134111111341111113
41111116411111114111111122222222
33336112311111123111111231111112
61111112111111121111111222222222

Ya se aprecia ya se aprecia!!
Y ahora dependerá un tanto de la resolución de la imagen; es decir si tiene mas de 16 pixeles de anchura se seguirá por la derecha (hasta llegar al número de pixeles de la imagen teniendo en cuenta que se distribuyen de 8x8 y que cada númeor es un pixel).
Como mi imagen ya no tiene más pixeles de longitud, ahora toca la altura (16 pixeles en mi caso) es decir que en vez de continuar a la derecha se continua para abajo, con las siguientes dos lineas de caracteres hexadecimales, quedando esto:

4555555555555552
4111111111111112
4111111111111112
4111111661111112
4111111331111112
4111111331111112
4111111331111112
4116333333336112
41163333
41111113
41111113
41111113
41111116
41111111
41111111
22222222

33336112311111123111111231111112
61111112111111121111111222222222


Y continuando de nuevo por la derecha con las ultimas dos filas de caracteres, dando el siguiente resultado:
4555555555555552
4111111111111112
4111111111111112
4111111661111112
4111111331111112
4111111331111112
4111111331111112
4116333333336112
4116333333336112
4111111331111112
4111111331111112
4111111331111112
4111111661111112
4111111111111112
4111111111111112
2222222222222222


Bueno, con esto es más que suficiente para poder reconstruir la imagen requerida; ahora me voy a poner un poco a investigar y continuo el post con la manipulación de la paleta de colores.


Espero que os hayais aclarado un poco, porque reconozco que hacer tutoriales no es lo mio xDD.


Saludos y ya sabeis donde estoy para que me podais preguntar

PD: No se si todas las imágenes tienen la misma estructura (seguramente las de 256 colores usen los dos caracteres hexadecimales, pero por ahora no me he metido con ellas; además si lo que se pretende es traducir algún menú y tal normalmente serán con imágenes de 16 colores). Bueno, espero que furrule también para otro tipo de imágenes que no sean solo NCGR.
Muy ingenioso tututorial!! [ok] esto daria pie a alguien que sepa un poco mas del tema que se anime a hacer alguna aplicacion para simplificar un poco esto ya que se ve bastante complejo y elaborado...ahora me viene una duda ¿sabes como manipular las paletas?? ya que en algunos juegos valdria la pena cambiar algunos colores...
wow muchas gracias por la aportacion!!!
Muy buen tutorial, la pega es que es muy costoso de hacer.. :(
Como ya han dicho, debería haber algún programa que automatice el proceso, porque si no, nos podemos tirar horas para modificar sprites xD.

5 estrellas.
Excelente tutorial, muchas gracias :D , eso sí, laborioso laborioso el sistema pero con resultado perfecto. No todo es la simplicidad y la estética.

5 estrellas!!!
muy buen tutorial, pero bastante dificil de hacer, no me veo haciendo eso para cambiar los colores de algo [tomaaa] . esperemos que algien lo automatize
Un buen tutorial de 5* a la "Oldschooll"
Bueno, aqui os pongo una muy temprana beta de un programa que lo que hace es ordenar los bites de la imagen; espero pronto hacer que haga justamente lo inverso (es decir que metas una imagen con los números y te los ordene para poderlos meter en el archivo de la rom ^^).

Trabaja un poco burro (vamos que va leyendo de dos en dos los caracteres), pero esque yo soy muy burro programando xDD.

http://www.sendspace.com/file/28n3lq


Bueno, para que funcione bien, solo teneis que pegar los caracteres que indican donde se colocan los colores (los caracteres que explique en el primer post que hay que ordenar) sin espacios entre ellos, vamos, que los metais en el word y deis a reemplazar todos los espacios " " por nada "".
Y lo pegais en el primer cuadro de texto y seleccionais los pixeles de ancho y de alto (en el tahaxan te suelen poner lo que tiene la imagen).
Esta como bién os digo es una muy temprana beta, y está claro que en proximas versiones no hara falta ni tener un editor hexadecimal a mano y te diga mas o menos entre que valores de pixeles puedes meter.


A mi lo que si que me está ahora comiendo la moral es porque los valores FF7F vienen a ser el color blanco en las paletas de colores NCLR y eso que he encontrado cosas al respecto, pero ninguna me termina de satisfacer.


Bueno, espero que podais usar este programa y espero que evolucione a buen puerto ^^.


Saludos
buen tuto, pero eso es editar las imagenes a lo bruto, lo ideal seria un programa grafico para estas cosas a prueba de novatos, de todas formas se agradece
Muy buena iniciativa!!!! Por favor! animate y enseñanos a hacer más!!!

[boing]
Interesantes noticias para todos aquellos que siguen mis "descubrimientos", puesto que ya que he conseguido determinar como extraer los colores de las paletas estará proxima una versión del extractor de imágenes (en el cual se vean imágenes y no arte ascii ^^ xDD). A raiz de eso supongo que será mucho más facil incluir imágenes en nuestras backups desenpaquetadas.

Bueno, como Dr.Katts lo demanda, os voy a exponer cual es mi forma de sacarle los colores a las paletas .NCLR ^^ (sirve hasta para las paletas de 256 colores ^^).

Bueno, para lograrlo solo teneis que tener :
Un editor hexadecimal
La calculadora de windows en modo científico
y esta página http://www.webtaller.com/utilidades/csscoder/colores.php
O alguna otra tabla de colores.


Primeramente debemos abrir el archivo a analizar con un editor hexadecimal; y nos mostrará lo siguiente:
Imagen
Así a simple vista pues como que no se ve mucho color (sobre todo si es tu primera vez que te planteas ver una paleta en modo hexadecimal).
Asique mejor será abrir otro archivo de paleta para poder identificar sus cabeceras:
Imagen

Bueno observando las dos imágenes nos damos cuenta que la cabecera es eso que está antes de lo que he seleccionado en esta imagen:
Imagen
Realmente la paleta continuaria hasta el final del archivo, pero como el resto de colores son 00 00 (negro) pues como que no hacen falta ya que no se van a usar, al menos no normalmente.
Es posible que os penseis que por que seleccioné los 00 00 del principio si son iguales en ambas paletas, pero esque esos ceros son el color negro con el cual se inicia la paleta (al menos en esto casos); una forma mas segura de determinar donde empieza la paleta es contar 256 (por los colores) * 4 (que son los caracteres que conforman los colores) vamos, que hay que contar 512 caracteres desde el final.

Bueno, será mejor no liaros porque probablemente solo me entienda yo. ¿Y ahora que se hace con esos numerajos? en mi caso:
00 00 90 19 C8 0C FF 7F 1A 47 BE 6B D8 4E
Pues primero vamos a emparejarlos ya que cada color está representado por 4 caracteres hexadecimales; quedandonos, en mi caso:
(00 00) (90 19) (C8 0C) (FF 7F) (1A 47) (BE 6B) (D8 4E)

Así nos aclararemos mejor; pero ojo aquí que a los de nintendo pues se les ocurre una perreria (parecida a la de los números en las imágenes) y esque tenemos que invertir el orden de cada par de parejas de caracteres hexadecimales, como os muestro en mi caso:

(00 00) (19 90) (0C C8) (7F FF) (47 1A) (6B BE) (4E D8)

Bueno por ahora vamos bien xDD.

Ahora a sacar el color UFF (esto me llevo mucho tiempo determinar como xDD).

Primero lo que hago es coger una pareja de caracteres hexadecimales ya invertidos; por ejemplo (0C C8)
A continuación abro la calculadora en modo científico y la pongo en Hex e introduzco 0CC8; lo cambio a dec y me cambia a 3272, Ese número que me ha dado lo divido siempre por 1024; dando en mi caso 3,1953125 al cual resto la parte entera (3), la cual hay que recordar o apuntar y vuelbo a multiplicar por 1024 (vamos para que me devuelba el resto) dandome 200, a este resto lo divido esta vez por 32 (siempre hay que dividir el resto de dividir el numero por 1024, entre 32) y me queda 6,25 (vuelbo a hacer lo del resto y apunto la parte entera y el resto).
Ahora disponemos de 3 números diferentes:
3, 6 y 8; el siguiente paso es multiplicarlos cada uno por 8 quedandonos ahora estos números:
24, 48 y 64 Los metemos en la calculadora en modo dec y cambiamos el modo a hex y nos quedan:
18, 30 y 40 ya tenemos los valores RGB hexadecimales y los podemos comprovar a ver que color nos da en http://www.webtaller.com/utilidades/csscoder/colores.php

Introduciendo primero el 40 luego el 30 y por ultimo el 18 ej: #403018 y te remite el color de la paleta.

Bueno, como os digo es bastante probable que haya cierta diferencia de color (no mucha) pero es lo que he podido razonar por ahora (quizás mejore la técnica).


Luego para cambiar el color hay que hacer los mismos pasos solo que al revés para calcular la cadena hexadecimal de 4 caracteres del valor del color sin olvidarse de invertir de nuevo las parejas.


Espero que os hayais enterado, porque me da a mi que hacer tutoriales no es lo mio.


Saludos
angel_gore escribió:Interesantes noticias para todos aquellos que siguen mis "descubrimientos", puesto que ya que he conseguido determinar como extraer los colores de las paletas estará proxima una versión del extractor de imágenes (en el cual se vean imágenes y no arte ascii ^^ xDD). A raiz de eso supongo que será mucho más facil incluir imágenes en nuestras backups desenpaquetadas.

Bueno, como Dr.Katts lo demanda, os voy a exponer cual es mi forma de sacarle los colores a las paletas .NCLR ^^ (sirve hasta para las paletas de 256 colores ^^).

Bueno, para lograrlo solo teneis que tener :
Un editor hexadecimal
La calculadora de windows en modo científico
y esta página http://www.webtaller.com/utilidades/csscoder/colores.php
O alguna otra tabla de colores.


Primeramente debemos abrir el archivo a analizar con un editor hexadecimal; y nos mostrará lo siguiente:
Imagen
Así a simple vista pues como que no se ve mucho color (sobre todo si es tu primera vez que te planteas ver una paleta en modo hexadecimal).
Asique mejor será abrir otro archivo de paleta para poder identificar sus cabeceras:
Imagen

Bueno observando las dos imágenes nos damos cuenta que la cabecera es eso que está antes de lo que he seleccionado en esta imagen:
Imagen
Realmente la paleta continuaria hasta el final del archivo, pero como el resto de colores son 00 00 (negro) pues como que no hacen falta ya que no se van a usar, al menos no normalmente.
Es posible que os penseis que por que seleccioné los 00 00 del principio si son iguales en ambas paletas, pero esque esos ceros son el color negro con el cual se inicia la paleta (al menos en esto casos); una forma mas segura de determinar donde empieza la paleta es contar 256 (por los colores) * 4 (que son los caracteres que conforman los colores) vamos, que hay que contar 512 caracteres desde el final.

Bueno, será mejor no liaros porque probablemente solo me entienda yo. ¿Y ahora que se hace con esos numerajos? en mi caso:
00 00 90 19 C8 0C FF 7F 1A 47 BE 6B D8 4E
Pues primero vamos a emparejarlos ya que cada color está representado por 4 caracteres hexadecimales; quedandonos, en mi caso:
(00 00) (90 19) (C8 0C) (FF 7F) (1A 47) (BE 6B) (D8 4E)

Así nos aclararemos mejor; pero ojo aquí que a los de nintendo pues se les ocurre una perreria (parecida a la de los números en las imágenes) y esque tenemos que invertir el orden de cada par de parejas de caracteres hexadecimales, como os muestro en mi caso:

(00 00) (19 90) (0C C8) (7F FF) (47 1A) (6B BE) (4E D8)

Bueno por ahora vamos bien xDD.

Ahora a sacar el color UFF (esto me llevo mucho tiempo determinar como xDD).

Primero lo que hago es coger una pareja de caracteres hexadecimales ya invertidos; por ejemplo (0C C8)
A continuación abro la calculadora en modo científico y la pongo en Hex e introduzco 0CC8; lo cambio a dec y me cambia a 3272, Ese número que me ha dado lo divido siempre por 1024; dando en mi caso 3,1953125 al cual resto la parte entera (3), la cual hay que recordar o apuntar y vuelbo a multiplicar por 1024 (vamos para que me devuelba el resto) dandome 200, a este resto lo divido esta vez por 32 (siempre hay que dividir el resto de dividir el numero por 1024, entre 32) y me queda 6,25 (vuelbo a hacer lo del resto y apunto la parte entera y el resto).
Ahora disponemos de 3 números diferentes:
3, 6 y 8; el siguiente paso es multiplicarlos cada uno por 8 quedandonos ahora estos números:
24, 48 y 64 Los metemos en la calculadora en modo dec y cambiamos el modo a hex y nos quedan:
18, 30 y 40 ya tenemos los valores RGB hexadecimales y los podemos comprovar a ver que color nos da en http://www.webtaller.com/utilidades/csscoder/colores.php

Introduciendo primero el 40 luego el 30 y por ultimo el 18 ej: #403018 y te remite el color de la paleta.

Bueno, como os digo es bastante probable que haya cierta diferencia de color (no mucha) pero es lo que he podido razonar por ahora (quizás mejore la técnica).


Luego para cambiar el color hay que hacer los mismos pasos solo que al revés para calcular la cadena hexadecimal de 4 caracteres del valor del color sin olvidarse de invertir de nuevo las parejas.


Espero que os hayais enterado, porque me da a mi que hacer tutoriales no es lo mio.


Saludos


Joder, muchas gracias!!!! Aunque la cosilla se va complicando xDD

Lo suyo sería hacer un programa que automatizara todo para los noobs

[plas]
Hay roms que con el DSLazy ya te deja algunas imagenes BMP,como por ejemplo en el Need For Speed Carbono,y los iconos de los mapas y todo eso,que yo ya me he customizado unos propios,y con las carreteras y objetos,depende de que rom sea no es tan dificil [poraki] .
guillermo2501 escribió:Hay roms que con el DSLazy ya te deja algunas imagenes BMP,como por ejemplo en el Need For Speed Carbono,y los iconos de los mapas y todo eso,que yo ya me he customizado unos propios,y con las carreteras y objetos,depende de que rom sea no es tan dificil [poraki] .


Sipo, el CSI dark motives también tiene archivos de imágenes del estilo.

Ahora mismo tengo creada una aplicación que muestra las imagenes NCGR y NCBR a partir de archivos que tengan dicha extensión.
La verdad es que es bastante más lento que el tahaxan (a mi me llego a tardar 15 minutos en cargar una imagen, aunque supongo que ahora con la modificacion que le puse tardará la mitad xDD).
Pero bueno, al menos a mi me va haciendo evolucionar en el campo y a entender mas las imágenes. Y la forma de seleccionar la paleta la veo mas cómoda que la que tiene el tahaxan. Además también lee los iconos contenidos en el archivo banner y deja guardar los resultados en formato Bmp.
Espero pronto actualizar el lector de imágenes para poder cambiarlas facilmente, sin tener que usar editor hexadecimal, creando el archivo automaticamente y también la paleta. Hasta seria incluso viable el poder sustituir imágenes de 16 colores por imágenes de más colores ^^.
Pero bueno, espero al menos actualizar dicho programa antes de que acaben las vacaciones.

Saludos

PD: Si alguien quiere que suba este programa que me lo pida, pero está claro que el tahaxan lo supera en cuanto a rapidez; pero si os interesa y tal lo subo.
angel_gore escribió:PD: Si alguien quiere que suba este programa que me lo pida, pero está claro que el tahaxan lo supera en cuanto a rapidez; pero si os interesa y tal lo subo.


Yo te apoyo! Subeloo!!!! [amor]
judelco escribió:
Yo te apoyo! Subeloo!!!! [amor]


Siento la tardanza, pero esque se me petó el ordenador.

Aquí os dejo el programa este que ando haciendo (que por cierto es bastante lento cargando imágenes y eso, pero bueno, se irá mejorando).
http://vdb4ever.bravehost.com/visor%20de%20imagenes.rar

Soporta imágenes de hasta 256 colores tanto NCGR como NCBR (con cabecera) y los iconos banner.bin.

También resubí el programa del otro hilo.


Saludos
delno está baneado por "venga, que te hemos pillado"
y para los juegos que no tienen ncgr y ncbr no se pueden escanear los .bin?
Por ahora mi programa no es capáz; casi ni soy capáz de hacerlo yo a mano.
Lo que si se es que cada bin es diferente. Y por ejemplo en otro foro me preguntaro como modificar las banderas del Real Football 2008 y andube mirando el archivo flagh.bin y supongo que cambiando el .bin a .ncgr y creando una paleta a partir de unos bmp que hay en el mismo directorio se podria perfectamente abrir y mostrar todas las banderas; pero existen otros .bin que no son tan sencillos y que las cosas están de diferente forma.
Pero vamos, ahora tengo apalancado el estudio de imágenes, porque ando de examenes y tal y no debo perder mucho el tiempo.


Si eso prueva a abrir los archivos .bin en un editor hexadecimal; o dime que archivo quieres ver y lo podria investigar un poco a ver como se podria hacer.


Aunque algunos editores de tiles pueden servir... pero no siempre el resultado es 100% satisfactorio y hay que andar armando mucho.


Saludos
17 respuestas