Sporeでは、.png
ファイルをエクスポートすることで、プレイヤーが作成したクリーチャーを共有できます。これ.png
はクリーチャーの写真ですが、ゲームにインポートされた場合、クリーチャーの情報(テクスチャ、サイズ、形状など)も一緒に表示されます。
このような機能を実装するにはどうすればよいですか?
Sporeでは、.png
ファイルをエクスポートすることで、プレイヤーが作成したクリーチャーを共有できます。これ.png
はクリーチャーの写真ですが、ゲームにインポートされた場合、クリーチャーの情報(テクスチャ、サイズ、形状など)も一緒に表示されます。
このような機能を実装するにはどうすればよいですか?
回答:
本当に必要なのがPNGファイルだけだった場合、単にファイルに情報を追加しただけである可能性があります。これは実際にはステガノグラフィの実践です。多くの場合、これは一見公開されているように見えるものにペイロードまたは秘密のメッセージを隠すために使用されます。ただし、この場合、この方法が使用された可能性があります。典型的なStegongraphyは内容を隠すために邪魔になりませんが、ファイルの最後にある画像からデータを単に追加して取得できない理由はありません。
いくつかのツールがこのデータをエンコードします。Google検索では、少なくともthisとthisが表示されます。
PNG $89
の先頭にはバイト署名があるため、PNG構造自体の後に情報が挿入され、SPOREゲームによって単純に解析された可能性があります。
しかし、他の回答とグーグルでの検索によって行われたさらなる研究は、Sporeが実際にアルファビットの情報を隠すためにステゴノグラフィーの単なるバージョンを使用していることを明らかにしています。これを念頭に置いて、追加データまたはメタデータの可能性を排除できます。
データがローカルで解析されている場合、メタデータは依然として非常に実行可能な選択肢であることに注意してください。その情報がWeb上で共有されたり、再エンコードされたりする可能性がある場合、エクスポートはすべての情報を保持するとは限りません。ピクセルデータを使用すると、ロスレス変換を問題なく実行できます。
PNG形式は、多かれ少なかれ任意のメタデータをサポートしています。PNG標準は、 PNGファイル、必要な(画像データを含む)されているいくつかの塊、本質的に一連の定義します。ただし、その他はオプションです。たとえば、ガンマ情報やヒストグラムデータを保存するためのチャンクがあります。
特に、任意のキー/値テキストのペアを保存するために使用できるtEXt
チャンクがあります。このデータを使用して、任意の種類の任意のデータを配布できます。ただし、そのデータをテキストとして表現できる場合は(かなり可能性が高い)
これらの追加チャンク(参照ライブラリなど)にアクセスして操作できるPNGライブラリが必要になります。または、自分で作成する必要があります。次に、必要なデータをキー/値のペアとしてエンコードする方法を選択するだけです。次のことをお勧めします。
より完全な回答を作成するために、別のアプローチ(以前は@Vaughnおよび@Alexisの回答で文書化されていました)があることも指摘します。必要な追加データを画像ピクセルに直接エンコードし、カラーチャネルの下位ビット。このアプローチでは、追加のメタデータを使用する必要がありません。つまり、それに依存したり、外部プログラムがそのメタデータを誤って処理することを心配せずに完全に実装できます。また、非常に高い「クール」係数があり、低次ビットのみを使用するため、画像は人間の目には正しく表示されます。ただし、画像サイズが保存できるデータ量の主な制御要因であることを意味します。より多くのストレージが必要な場合は、より多くのピクセルを画像に割り当てる必要があります。
他の人が指摘したように、このプロセスはとして知られているステガノグラフィ。
モナコの開発者は、実際に彼らとSporeの両方がこれを達成した方法について優れた記事を作成しました。
彼らがすることの基本的な要約はかなり簡単です:
データを取得するには、これを逆に行うだけです。
このプロセスの背後にある基本的な考え方は、画像には多くのピクセルがあり、各カラーチャンネルの最下位ビットは大きな違いをもたらさないということです。さらに、書き込むビットの約半分は、画像のビットがすでにあったものになります。返されるのは基本的に正しいイメージですが、奇妙なアーティファクトがあります。これらのアーティファクトは、コントラスト/彩度を実際に上げてズームインした場合にのみ顕著であることに注意するのに時間がかかります。
記事から:
最後の画像で、ノイズにほとんど識別できない水平線があることに注目してください。これでレベルデータの終わりです。つまり、最下位ビットのみを使用して、265x120ピクセルの画像にすべてのレベルデータを実際に適合させることができます。
トリッキーな補遺:
私ができること、そして胞子の人々も同じことをしたと思いますが、実際には100%透明なピクセルのすべてのカラービットを使用しています。これらのピクセルは透明なので、設定する色は関係ありません。
ただし、画像全体を使用しているため、これを行うことはできません。つまり、使用する透明ピクセルがありません。
なぜメタデータに保存するだけでなく、この手法を好むのですか?
追加クレジット:ノイズの目立ちやすさを減らすために、修正するピクセルを選択するために、固定シードを使用したPRNGを使用できます。同様の方法でカラーチャンネルの一部のみを変更することもできます。
SporepediaからいくつかのSporeクリーチャーをダウンロードして調べました。私はそれから学んだ:
これはSporeが行うことであり、他のほとんどの懸念よりも単純さを優先する方法であることに注意する価値があります。
追加のデータブロックではなく速記法を使用するという選択は、スケーリングやJpeg圧縮には耐えられないものの、たとえばWebサイトによって画像が再エンコードされた場合でもデータが生き残ることを意味します。
最も顕著な代替案は、実際には画像内のIDのみをエンコードし、実際のデータを中央サーバーに保存し、このIDを正確なクリーチャーデータと交換できるようにすることだと思います。このようなIDは、スケーリングおよび圧縮に耐性のある速記形式でエンコードできるほど短くなります。
胞子フォーマットの可能な単純な改良点は次のとおりです。