Mit Spore können vom Spieler erstellte Kreaturen durch Exportieren einer .png
Datei geteilt werden. Das .png
ist ein Foto der Kreatur, aber wenn es in das Spiel importiert wird, werden auch die Informationen der Kreatur (wie Texturen, Größe und Form) mitgeliefert.
Wie kann ich eine solche Funktion implementieren?
file-format
savegame
png
ibrabeicker
quelle
quelle
Antworten:
Wenn alles, was Sie wirklich brauchten, die PNG-Datei war, haben Sie wahrscheinlich nur die Informationen in die Datei eingefügt. Dies ist eigentlich eine Praxis der Steganographie . In vielen Fällen wird dies verwendet, um Nutzdaten oder geheime Nachrichten in scheinbar öffentlich zugänglichen Objekten zu verbergen. In diesem Fall ist es jedoch wahrscheinlich, dass diese Methode angewendet wurde. Die typische Stegongraphie tut alles, um den Inhalt zu verbergen, aber es gibt keinen Grund, warum man die Daten nicht einfach am Ende der Datei aus dem Bild anhängen und abrufen könnte.
Mehrere Tools verschlüsseln diese Daten für Sie, eine Google-Suche bringt zumindest dies und das auf den Punkt .
Ein PNG hat
$89
zu Beginn die Bytesignatur, sodass es möglich ist, dass die Informationen nach der PNG-Struktur selbst eingefügt und vom SPORE-Spiel einfach analysiert wurden.Weitere Untersuchungen der anderen Antworten und eine Suche bei Google haben jedoch ergeben, dass Spore tatsächlich nur eine Version von Stegongraphy verwendete, um die Informationen in den Alphabits zu verbergen. In diesem Sinne können wir die Möglichkeit von angehängten Daten oder Metadaten ausschließen.
Es sollte beachtet werden, dass Metadaten immer noch eine sehr sinnvolle Wahl sind, wenn die Daten lokal analysiert werden. Wenn diese Informationen im Internet geteilt oder neu codiert werden, wird beim Export nicht garantiert, dass alle Ihre Informationen erhalten bleiben. Wenn Pixeldaten verwendet werden, können sie verlustfreie Konvertierungen problemlos überstehen.
quelle
Das PNG-Format unterstützt mehr oder weniger beliebige Metadaten. Der PNG-Standard definiert eine PNG-Datei, im Wesentlichen eine Reihe von Abschnitten, von denen einige erforderlich sind (und die Bilddaten enthalten). Andere sind jedoch optional. Zum Beispiel gibt es einen Block zum Speichern von Gammainformationen oder Histogrammdaten.
Insbesondere gibt es einen
tEXt
Block , in dem beliebige Schlüssel / Wert-Textpaare gespeichert werden können. Dies kann verwendet werden, um beliebige Daten zu versenden, vorausgesetzt, Sie können diese Daten als Text darstellen (was ziemlich wahrscheinlich ist).Sie benötigen eine PNG-Bibliothek, mit der Sie auf diese zusätzlichen Blöcke (z. B. die Referenzbibliothek ) zugreifen und sie bearbeiten können , oder Sie müssen selbst eine erstellen. Dann müssen Sie nur noch auswählen, wie die gewünschten Daten als Schlüssel / Wert-Paare codiert werden sollen. Ich würde folgendes vorschlagen:
Im Interesse einer vollständigeren Antwort möchte ich auch darauf hinweisen, dass es einen anderen Ansatz gibt (der zuvor durch die Antworten von @Vaughn und @ Alexis dokumentiert wurde): Kodieren Sie die zusätzlichen Daten, die Sie möchten, direkt in Ihre Bildpixel und verteilen Sie Ihre Daten auf mehrere die niederwertigen Bits der Farbkanäle. Für diesen Ansatz sind keine zusätzlichen Metadaten erforderlich. Dies bedeutet, dass Sie ihn vollständig implementieren können, ohne sich darauf verlassen zu müssen oder sich Sorgen über externe Programme zu machen, die diese Metadaten falsch verarbeiten. Es hat auch einen sehr hohen "coolen" Faktor, und da Sie nur Bits niedriger Ordnung verwenden, sieht das Bild für das menschliche Auge immer noch korrekt aus. Dies bedeutet jedoch, dass Ihre Bildgröße ein primärer Steuerungsfaktor für die Datenmenge ist, die Sie speichern können. Wenn Sie mehr Speicherplatz benötigen, müssen Sie dem Bild mehr Pixel zuweisen.
Wie bereits erwähnt, wird dieser Prozess als Steganographie bezeichnet .
quelle
Der Entwickler von Monaco hat tatsächlich einen hervorragenden Artikel darüber verfasst, wie sowohl sie als auch Spore dies erreicht haben.
Die grundlegende Zusammenfassung ihrer Tätigkeit ist recht einfach:
Tun Sie dies einfach in umgekehrter Reihenfolge, um Ihre Daten abzurufen.
Die Grundidee hinter dem Prozess ist, dass ein Bild viele Pixel enthält und die niedrigstwertigen Bits jedes Farbkanals keinen großen Unterschied machen. Darüber hinaus entspricht etwa die Hälfte der Bits, die Sie schreiben, dem Bit im Bild, das bereits vorhanden war. Was Sie zurückerhalten, ist im Wesentlichen das richtige Bild, aber mit seltsamen Artefakten. Er nimmt sich die Zeit zu bemerken, dass diese Artefakte nur dann wirklich auffallen, wenn Sie den Kontrast / die Sättigung wirklich ankurbeln und hineinzoomen. Er hat jedoch Quellbilder mit viel Anfangsrauschen.
Aus dem Artikel:
Warum sollte diese Technik der Speicherung in den Metadaten vorgezogen werden?
Zusätzliches Guthaben: Um die Wahrnehmbarkeit von Rauschen zu verringern, können Sie die zu ändernden Pixel mit einem PRNG mit festem Startwert auswählen. Sie können auch nur einige der Farbkanäle auf ähnliche Weise ändern.
quelle
Ich habe ein paar Sporenkreaturen von Sporepedia heruntergeladen und untersucht. Von denen habe ich gelernt, dass:
Es ist erwähnenswert, dass dies genau das ist, was Spore tut. Es ist eine Methode, die die Einfachheit vor die meisten anderen Bedenken stellt.
Die Wahl der Verwendung von Stenografie anstelle eines zusätzlichen Datenblocks bedeutet, dass die Daten überleben, wenn das Bild neu codiert wird, beispielsweise von einer Website, obwohl es die Skalierung oder die JPEG-Komprimierung nicht überlebt.
Ich denke, dass die prominenteste Alternative darin besteht, nur eine ID im Bild zu kodieren und die tatsächlichen Daten auf einem zentralen Server zu speichern, auf dem diese ID gegen die genauen Kreaturendaten ausgetauscht werden kann. Eine solche ID wäre kurz genug, um in einem skalierungs- und komprimierungstoleranten Stenografieformat codiert zu werden.
Mögliche einfache Verbesserungen des Spore-Formats sind:
quelle