O Spore permite que criaturas criadas por jogadores sejam compartilhadas exportando um .png
arquivo. Essa .png
é uma foto da criatura, mas se for importada para o jogo, as informações da criatura (como texturas, tamanho e forma) também serão fornecidas.
Como posso implementar esse recurso?
file-format
savegame
png
ibrabeicker
fonte
fonte
Respostas:
Se tudo o que você realmente precisava era o arquivo PNG, é provável que eles simplesmente adicionassem as informações ao arquivo. Esta é realmente uma prática de esteganografia . Na maioria das vezes, isso é usado para ocultar cargas úteis ou mensagens secretas em coisas aparentemente públicas. No entanto, é provável que, neste caso, esse método seja o que foi usado. A estegrafia típica não permite ocultar o conteúdo, mas não há razão para que não se possa simplesmente anexar os dados da imagem no final do arquivo e recuperá-los.
Várias ferramentas codificam esses dados para você, uma pesquisa no google traz pelo menos isso e isso .
Um PNG possui a assinatura de bytes
$89
no início, portanto, é possível que as informações tenham sido inseridas após a própria estrutura PNG e simplesmente analisadas pelo jogo SPORE.No entanto, pesquisas adicionais fornecidas por outras respostas e uma pesquisa no google revelam que Spore estava realmente usando apenas uma versão do Stegongraphy para ocultar as informações nos bits alfa. Com isso em mente, podemos descartar a possibilidade de dados anexados ou metadados.
Deve-se notar que os metadados ainda são uma opção muito viável, se os dados estiverem sendo analisados localmente. Se essas informações puderem ser compartilhadas na Web ou recodificadas, não é garantido que a exportação mantenha todas as suas informações. Quando dados de pixel são usados, eles podem sobreviver a conversões sem perdas sem problemas.
fonte
O formato PNG tem suporte para metadados mais ou menos arbitrários. O padrão PNG define um arquivo PNG, essencialmente uma série de blocos, alguns dos quais são necessários (e contêm os dados da imagem). Outros, no entanto, são opcionais. Por exemplo, há uma parte para armazenar informações de gama ou dados de histograma.
Em particular, há um
tEXt
pedaço que pode ser usado para armazenar pares de texto chave / valor arbitrários. Isso pode ser usado para enviar qualquer tipo de dados arbitrários que você desejar, desde que você possa representá-los como texto (o que é bastante provável).Você precisará de uma biblioteca PNG que permita acessar e manipular esses pedaços adicionais (como a biblioteca de referência ), ou precisará escrever um. Depois, basta escolher como codificar os dados que você deseja como pares de chave / valor. Eu sugiro o seguinte:
No interesse de fazer uma resposta mais completa, também apontarei que existe outra abordagem (previamente documentada pelas respostas de @Vaughn e @ Alexis): codifique os dados adicionais que você deseja diretamente nos pixels da imagem, distribuindo os dados pelos os bits de ordem inferior dos canais de cores. Essa abordagem não requer o uso de metadados extras, o que significa que você pode implementá-los completamente sem depender deles ou se preocupar com programas externos que lidam incorretamente com esses metadados. Ele também possui um fator "legal" muito alto e, como você usa apenas bits de baixa ordem, a imagem ainda parece correta para o olho humano. No entanto, isso significa que o tamanho da sua imagem é o principal fator de controle da quantidade de dados que você pode armazenar; se precisar de mais armazenamento, aloque mais pixels na imagem.
Como outros já apontaram, esse processo é conhecido como esteganografia .
fonte
O desenvolvedor do Mônaco realmente fez um excelente artigo sobre como eles e Spore conseguiram isso.
O resumo básico do que eles fazem é bastante simples:
Basta fazer isso no sentido inverso para recuperar seus dados.
A idéia básica por trás do processo é que existem muitos pixels em uma imagem, e os bits de ordem mais baixa de cada canal de cor não fazem grande diferença. Além disso, cerca da metade dos bits que você escreve será exatamente o que já existia na imagem. O que você recebe de volta é essencialmente a imagem certa, mas com artefatos estranhos. Ele leva um tempo para notar que esses artefatos são realmente perceptíveis se você realmente aumentar o contraste / saturação e aumentar o zoom. No entanto, ele possui imagens de origem com muito ruído inicial.
Do artigo:
Por que favorecer essa técnica em vez de apenas armazená-la nos metadados?
Crédito extra: para reduzir a perceptibilidade do ruído, você pode usar um PRNG com uma semente fixa para selecionar os pixels a serem modificados. Você também pode modificar apenas alguns dos canais de cores de maneira semelhante.
fonte
Baixei e examinei algumas criaturas Spore da Sporepedia. Daqueles eu aprendi que:
Vale a pena notar que é exatamente isso que o Spore faz, é um método que coloca a simplicidade antes da maioria das outras preocupações.
A escolha de usar a estenografia em vez de um bloco de dados adicional significa que os dados sobreviverão se a imagem for recodificada, por exemplo, por um site, embora não sobreviva ao dimensionamento ou à compressão JPEG.
Eu acho que a alternativa mais importante é realmente codificar apenas um ID na imagem e deixar os dados reais serem armazenados em um servidor central, onde esse ID pode ser trocado pelos dados exatos da criatura. Esse ID seria curto o suficiente para ser codificado em um formato de estenografia tolerante à escala e à compactação.
Possíveis melhorias simples no formato Spore incluem:
fonte