Spore permite compartir criaturas creadas por el jugador al exportar un .png
archivo. Esa .png
es una foto de la criatura, pero si se importa al juego, la información de la criatura (como texturas, tamaño y forma) también viene con ella.
¿Cómo puedo implementar tal característica?
file-format
savegame
png
ibrabeicker
fuente
fuente
Respuestas:
Si todo lo que realmente necesitaba era el archivo PNG, es probable que simplemente agreguen la información al archivo. Esto es en realidad una práctica de esteganografía . Muchas veces, esto se usa para ocultar cargas útiles o mensajes secretos en cosas que aparentemente son públicas. Sin embargo, es probable en este caso que este método sea el utilizado. La Stegongraphy típica se saldrá del camino para ocultar el contenido, pero no hay ninguna razón por la que uno no pueda simplemente agregar los datos de la imagen al final del archivo y recuperarlos.
Varias herramientas codifican estos datos por usted, una búsqueda en Google trae al menos esto y esto .
Un PNG tiene la firma de bytes
$89
al comienzo, por lo que es posible que la información se haya insertado después de la estructura PNG y simplemente haya sido analizada por el juego SPORE.Sin embargo, una investigación adicional dada por las otras respuestas y una búsqueda en Google revela que Spore estaba usando solo una versión de Stegongraphy para ocultar la información en los bits alfa. Con esto en mente, podemos descartar la posibilidad de agregar datos o metadatos.
Cabe señalar que los metadatos siguen siendo una opción muy viable, si los datos se analizan localmente. Si esa información se comparte en la web o se vuelve a codificar, no se garantiza que la exportación conserve toda su información. Cuando se utilizan datos de píxeles, puede sobrevivir a las conversiones sin pérdida sin problemas.
fuente
El formato PNG es compatible con metadatos más o menos arbitrarios. El estándar PNG define un archivo PNG, esencialmente una serie de fragmentos, algunos de los cuales son necesarios (y contienen los datos de la imagen). Otros, sin embargo, son opcionales. Por ejemplo, hay un fragmento para almacenar información gamma o datos de histograma.
En particular, hay un
tEXt
fragmento que se puede utilizar para almacenar pares de texto de clave / valor arbitrarios. Esto se puede usar para enviar cualquier tipo de datos arbitrarios que desee, siempre que pueda representar esos datos como texto (lo cual es bastante probable).Necesitará una biblioteca PNG que le permita acceder y manipular estos fragmentos adicionales (como la biblioteca de referencia ), o deberá escribir uno usted mismo. Entonces es solo cuestión de elegir cómo codificar los datos que desea como pares clave / valor. Sugeriría lo siguiente:
En aras de dar una respuesta más completa, también señalaré que hay otro enfoque (previamente documentado por las respuestas de @Vaughn y @ Alexis): codifique los datos adicionales que desee directamente en los píxeles de su imagen, distribuyendo sus datos a través de los bits de bajo orden de los canales de color. Este enfoque no requiere el uso de metadatos adicionales, lo que significa que puede implementarlo por completo sin depender de él o preocuparse por los programas externos que manejan incorrectamente esos metadatos. También tiene un factor "genial" muy alto, y debido a que solo usa bits de bajo orden, la imagen seguirá siendo correcta para el ojo humano. Sin embargo, significa que el tamaño de su imagen es un factor de control primario para la cantidad de datos que puede almacenar; Si necesita más almacenamiento, deberá asignar más píxeles a la imagen.
Como otros han señalado, este proceso se conoce como esteganografía .
fuente
El desarrollador de Mónaco en realidad hizo un excelente artículo sobre cómo tanto ellos como Spore lograron esto.
El resumen básico de lo que hacen es bastante simple:
Simplemente haga esto a la inversa para recuperar sus datos.
La idea básica detrás del proceso es que hay muchos píxeles en una imagen, y los bits de orden más bajo de cada canal de color no hacen una gran diferencia. Además, aproximadamente la mitad de los bits que escriba serán lo que ya era en la imagen. Lo que obtienes es esencialmente la imagen correcta, pero con artefactos extraños. Se toma el tiempo para notar que estos artefactos solo son realmente notables si realmente aumenta el contraste / saturación y se acerca. Sin embargo, tiene imágenes de origen con mucho ruido inicial.
Del artículo:
¿Por qué favorecer esta técnica en lugar de almacenarla en los metadatos?
Crédito adicional: para reducir la notoriedad del ruido, puede usar un PRNG con una semilla fija para seleccionar los píxeles para modificar. También puede modificar solo algunos de los canales de color de manera similar.
fuente
Descargué y examiné algunas criaturas Spore de Sporepedia. De aquellos aprendí que:
Vale la pena señalar que esto es justo lo que hace Spore, es un método que pone la simplicidad antes que la mayoría de las otras preocupaciones.
La elección de usar estenografía en lugar de un bloque de datos adicional significa que los datos sobrevivirán si la imagen se vuelve a codificar, por ejemplo, por un sitio web, aunque no sobrevivirá a la escala o la compresión Jpeg.
Creo que la alternativa más destacada es en realidad codificar solo una identificación en la imagen y dejar que los datos reales se almacenen en un servidor central donde esta identificación se pueda intercambiar por los datos exactos de la criatura. Tal identificación sería lo suficientemente corta como para poder codificarse en un formato de estenografía tolerante a la compresión y al escalado.
Las posibles mejoras simples al formato Spore incluyen:
fuente