Spore permet aux créatures créées par le joueur d'être partagées en exportant un .png
fichier. C'est .png
une photo de la créature, mais si elle est importée dans le jeu, les informations de la créature (telles que les textures, la taille et la forme) sont également fournies.
Comment puis-je implémenter une telle fonctionnalité?
file-format
savegame
png
ibrabeicker
la source
la source
Réponses:
Si vous n'aviez besoin que du fichier PNG, il est probable qu'ils ont simplement ajouté les informations dans le fichier. C'est en fait une pratique de la stéganographie . Souvent, cela est utilisé pour masquer des charges utiles ou des messages secrets dans des choses apparemment publiques. Cependant, il est probable dans ce cas que cette méthode soit celle qui a été utilisée. Une stégongraphie typique fera tout pour cacher le contenu, mais il n'y a aucune raison pour laquelle on ne pourrait pas simplement ajouter les données de l'image à la fin du fichier et les récupérer.
Plusieurs outils encodent ces données pour vous, une recherche sur Google fait apparaître au moins ceci et cela .
Un fichier PNG ayant la signature octet
$89
au début, il est donc possible que les informations aient été insérées après la structure PNG elle-même et simplement analysées par le jeu SPORE.Cependant, une recherche plus poussée donnée par les autres réponses et une recherche sur Google révèle que Spore utilisait en réalité une version de Stegongraphy pour masquer les informations contenues dans les bits alpha. En gardant cela à l'esprit, nous pouvons exclure la possibilité d'ajouter des données ou des méta-données.
Il convient de noter que les métadonnées restent un choix très viable si les données sont analysées localement. Si ces informations peuvent être partagées sur le Web ou réencodées, l’exportation n’est pas garantie pour conserver toutes vos informations. Lorsque des données de pixels sont utilisées, elles peuvent survivre sans conversions sans perte.
la source
Le format PNG prend en charge les métadonnées plus ou moins arbitraires. La norme PNG définit un fichier PNG, essentiellement une série de morceaux, dont certains sont nécessaires (et contiennent les données d'image). D'autres, cependant, sont facultatifs. Par exemple, un morceau permet de stocker des informations gamma ou des données d'histogramme.
En particulier, il existe un
tEXt
bloc qui peut être utilisé pour stocker des paires de texte clé / valeur arbitraires. Cela peut être utilisé pour envoyer n'importe quel type de données arbitraires, à condition que vous puissiez les représenter sous forme de texte (ce qui est assez probable).Vous aurez besoin d'une bibliothèque PNG qui vous permettra d'accéder à ces fragments supplémentaires (tels que la bibliothèque de référence ) et de les manipuler , ou vous devrez en écrire un vous-même. Ensuite, il suffit de choisir comment coder les données souhaitées sous forme de paires clé / valeur. Je suggère ce qui suit:
Dans l’intérêt d’une réponse plus complète, je soulignerai également qu’il existe une autre approche (déjà documentée par les réponses @Vaughn et @ Alexis): coder les données supplémentaires souhaitées directement dans vos pixels d’image, en répartissant vos données sur les bits de poids faible des canaux de couleur. Cette approche ne nécessite pas l’utilisation de métadonnées supplémentaires, ce qui signifie que vous pouvez l’implémenter entièrement sans vous en fier ou sans vous soucier des programmes externes qui gèrent ces métadonnées de manière incorrecte. Son facteur de "fraîcheur" est également très élevé et, du fait que vous n'utilisez que des bits de poids faible, l'image sera toujours correcte à l'œil humain. Toutefois, cela signifie que la taille de votre image est un facteur de contrôle principal pour la quantité de données que vous pouvez stocker. si vous avez besoin de plus de stockage, vous devrez allouer plus de pixels à l’image.
Comme d'autres l'ont souligné, ce processus s'appelle la stéganographie .
la source
Le développeur de Monaco a en fait fait un excellent article sur la façon dont Spore et eux ont accompli cela.
Le résumé de base de ce qu’ils font est assez simple:
Faites simplement cela en sens inverse pour récupérer vos données.
L'idée de base du processus est qu'il y a beaucoup de pixels dans une image et que les bits de poids faible de chaque canal de couleur ne font pas une grande différence. En outre, environ la moitié des bits que vous écrivez correspondront à ce qu’il était déjà dans l’image. Ce que vous récupérez est essentiellement la bonne image, mais avec des artefacts étranges. Il prend le temps de noter que ces artefacts ne sont vraiment visibles que si vous montez vraiment le contraste / la saturation et effectuez un zoom avant. Il a cependant des images source avec beaucoup de bruit initial.
De l'article:
Pourquoi préférer cette technique au stockage dans les métadonnées?
Crédit supplémentaire: pour réduire la visibilité du bruit, vous pouvez utiliser un PRNG avec une valeur de départ fixe pour sélectionner les pixels à modifier. Vous pouvez également modifier certains canaux de couleur de la même manière.
la source
J'ai téléchargé et examiné quelques créatures Spore de Sporepedia. De ceux que j'ai appris que:
Il convient de noter que c’est précisément ce que fait Spore, c’est une méthode qui place la simplicité avant la plupart des autres problèmes.
Le choix d'utiliser la sténographie plutôt qu'un bloc de données supplémentaire signifie que les données survivront si l'image est réencodée, par exemple par un site Web, bien qu'elle ne puisse pas survivre à la mise à l'échelle ou à la compression Jpeg.
Je pense que l'alternative la plus importante est en fait de ne coder qu'un identifiant dans l'image et de laisser les données réelles stockées sur un serveur central où cet identifiant peut être échangé contre les données exactes de la créature. Un tel identifiant serait suffisamment court pour pouvoir être encodé dans un format sténographique tolérant la mise à l'échelle et la compression.
Les améliorations simples possibles au format Spore incluent:
la source