es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Manipulación directa de mapas de color PNG.

Estoy trabajando en un proyecto que convierte imágenes empaquetadas en un formato de contenedor exclusivo en imágenes PNG individuales que luego se empaquetan en un formato de contenedor más flexible. Una de las restricciones más extrañas es que el orden de las entradas del mapa de color es crítico para el correcto funcionamiento de la aplicación final (las paletas de algunas imágenes dependen de las paletas de otras imágenes que se muestran actualmente).

¿Hay alguna manera, preferiblemente en Perl, de manipular directamente el mapa de color de un PNG? Estoy utilizando PerlMagick para generar los archivos PNG píxel por píxel. Por favor, hágame saber si sería útil para mí describir más directamente lo que estoy haciendo.

(expansión debido a la sugerencia de Mark)

La pantalla se llena primero con elementos de fondo, como un marco decorativo y una rosa de los vientos. Partes de la rosa de los vientos se iluminan para indicar en qué dirección puede ir el jugador. Estas secciones iluminadas son imágenes separadas que toman sus indicaciones de color de lugares específicos en los mapas de color de las imágenes de fondo. Por lo tanto, el contenido y el orden de los mapas de color para los elementos de fondo son críticos.

(incluso más expansión)

Explicaré exactamente lo que estoy haciendo ahora. El formato de contenedor original fue creado por Infocom a fines de la década de 1980 para sus aventuras de texto gráficas. Para cada uno de los juegos gráficos, se crearon tres archivos de gráficos, uno para CGA, EGA y MCGA. Algunos archivos de gráficos de EGA se distribuyeron en dos contenedores. Para jugar en intérpretes modernos de la máquina Z, se realizó ingeniería inversa del formato y los gráficos dentro se convirtieron en PNG y se empaquetaron en contenedores Blorb (https://www.eblong.com/zarf/blorb/). La sección 11.3 habla sobre el comportamiento de cambio de color. Solo los paquetes MCGA se volvieron a empaquetar de esta manera. Quiero crear paquetes para los paquetes CGA y EGA. Desafortunadamente, no he podido contactar a la persona que preparó estos archivos Blorb para obtener información sobre este problema del mapa de color. La ingeniería inversa del formato de Infocom parece haberse perdido. Así que tomé herramientas existentes, principalmente pix2gif.c de Ztools (http://ifarchive.org/indexes/if-archive/infocom/tools/ztools/) y lo traduje a Perl para comprenderlo mejor. Con este programa Perl, logré extraer los datos EGA y CGA. Modifiqué mis propias herramientas (https://gitlab.com/DavidGriffith/blorbtools) para admitir los requisitos especiales de estos juegos.

Comenzando con los gráficos dirigidos a MCGA, no puedo llegar al punto de replicar el aspecto de jugar un juego con los archivos Blorb antiguos disponibles aquí: http://ifarchive.org/indexes/if-archive/infocom/media/blorb. Las imágenes con paletas cambiantes se dibujan con los colores incorrectos. Hay otros problemas con los gráficos EGA y CGA, pero tienen que ver con la resolución y no son relevantes aquí.

Los juegos específicos involucrados son los juegos de Infocom “Arthur”, “Shogun”, “Journey” y “Zork Zero”. Mantengo uno de los intérpretes de la máquina Z capaz de jugar estos juegos, que se puede encontrar en https://gitlab.com/DavidGriffith/frotz.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible manipular la tabla de colores de un archivo PNG utilizando PerlMagick. El método Set de la clase Magick::Pixel puede ser utilizado para establecer los valores de color en posiciones específicas de la tabla de colores. Por ejemplo, para establecer el color en la posición 3 de la tabla de colores como rojo (#FF0000), puedes utilizar el siguiente código:

    use Image::Magick;
    
    my $image = Image::Magick->new();
    $image->Read('image.png');
    
    my $red = '#FF0000';
    my $pixel = $image->Set('colormap', 3, $red);
    

    Puedes iterar a través de todas las posiciones de la tabla de colores y establecer los colores apropiados de acuerdo a tus requerimientos. Ten en cuenta que una vez que la tabla de colores ha sido modificada, afectará a cualquier operación posterior en la imagen. Para evitar esto, puedes clonar la imagen antes de modificar la tabla de colores:

    my $cloned_image = $image->Clone();
    

    ¡Espero que esto ayude! Si necesitas una guía más específica, por favor proporciona más detalles sobre tu proyecto.

Comments are closed.