포자는 .png
파일 을 내보내 플레이어가 만든 생물체를 공유 할 수 있습니다 . 그것은 .png
생물의 사진이지만, 게임으로 가져 오면, 생물의 정보 (예 : 질감, 크기, 모양)도 함께 제공됩니다.
그러한 기능을 어떻게 구현할 수 있습니까?
포자는 .png
파일 을 내보내 플레이어가 만든 생물체를 공유 할 수 있습니다 . 그것은 .png
생물의 사진이지만, 게임으로 가져 오면, 생물의 정보 (예 : 질감, 크기, 모양)도 함께 제공됩니다.
그러한 기능을 어떻게 구현할 수 있습니까?
답변:
진정으로 필요한 모든 것이 PNG 파일이면 정보를 파일에 추가하기 만하면됩니다. 이것은 실제로 Steganography 의 관행입니다 . 많은 경우에, 이것은 공개적으로 보이는 것에서 페이로드 또는 비밀 메시지를 숨기는 데 사용됩니다. 그러나이 경우이 방법이 사용 된 것 같습니다. 일반적인 Stegongraphy는 내용을 숨기는 데 방해가되지만 파일 끝에있는 이미지에서 데이터를 단순히 추가하여 검색 할 수없는 이유는 없습니다.
여러 도구 가이 데이터를 인코딩하여 Google 검색에 적어도 이것 과 이것을 나타 냅니다.
PNG는 $89
시작시 바이트 서명 을 가지므로 정보는 PNG 구조 자체 뒤에 삽입되고 단순히 SPORE 게임에 의해 구문 분석 될 수 있습니다.
그러나 다른 답변과 Google 검색에 대한 추가 연구에 따르면 Spore는 실제로 알파 비트의 정보를 숨기기 위해 Stegongraphy 버전 만 사용하고 있음을 알 수 있습니다. 이를 염두에두고 추가 된 데이터 나 메타 데이터의 가능성을 배제 할 수 있습니다.
주목해야한다 메타 데이터는 데이터가 로컬로 해석되는 경우, 여전히 매우 실행 가능한 선택입니다. 해당 정보가 웹에서 공유되거나 다시 인코딩 될 수있는 경우, 내보내기가 모든 정보를 보존한다고 보장하지는 않습니다. 픽셀 데이터를 사용하면 문제없이 손실없이 변환 할 수 있습니다.
PNG 포맷은 다소간 임의의 메타 데이터에 대한 지원을 갖는다. PNG 표준은 PNG 파일, 필요한 (이미지 데이터를 포함) 중 일부의 덩어리, 본질적으로 시리즈를 정의합니다. 그러나 다른 것은 선택 사항입니다. 예를 들어, 감마 정보 또는 히스토그램 데이터를 저장하기위한 청크가 있습니다.
특히 임의의 키 / 값 텍스트 쌍을 저장하는 데 사용할 수 있는 tEXt
청크 가 있습니다. 이 데이터를 텍스트로 표현할 수 있다면 원하는 임의의 데이터를 전달하는 데 사용할 수 있습니다.
이러한 추가 청크 (예 : 참조 라이브러리 )에 액세스하고 조작 할 수있는 PNG 라이브러리가 필요 하거나 직접 작성해야합니다. 그런 다음 원하는 데이터를 키 / 값 쌍으로 인코딩하는 방법을 선택하면됩니다. 나는 다음을 제안한다.
더 완전한 답변을 얻기 위해 또 다른 접근 방법이 있음을 지적합니다 (이전에 @Vaughn 및 @Alexis의 답변에 문서화되어 있음). 이미지 픽셀에 직접 추가 데이터를 인코딩하여 데이터를 분산시킵니다. 컬러 채널의 하위 비트 이 방법을 사용하려면 추가 메타 데이터를 사용할 필요가 없습니다. 즉, 메타 데이터에 의존하거나 외부 프로그램이 해당 메타 데이터를 잘못 처리하지 않아도 걱정하지 않고 완전히 구현할 수 있습니다. 또한 "쿨"요소가 매우 높으며 하위 비트 만 사용하기 때문에 이미지는 여전히 사람의 눈에 맞습니다. 그러나 이미지 크기는 저장할 수있는 데이터 양의 주요 제어 요소임을 의미합니다. 더 많은 저장 공간이 필요한 경우 이미지에 더 많은 픽셀을 할당해야합니다.
다른 사람들이 지적 했듯이이 프로세스는 스테 가노 그라피 (steganography )라고합니다 .
모나코 개발자는 실제로 자신과 Spore가 어떻게이를 달성했는지에 대한 훌륭한 기사 를 작성했습니다.
그들이하는 일의 기본 요약은 매우 간단합니다.
데이터를 검색하려면이 작업을 반대로 수행하면됩니다.
이 과정의 기본 아이디어 는 이미지에 많은 픽셀이 있으며 각 색상 채널의 최하위 비트가 큰 차이를 만들지 않는다는 것 입니다. 또한, 작성하는 비트의 약 절반이 이미지의 비트가 이미었던 것입니다. 다시 얻는 것은 본질적으로 올바른 이미지이지만 이상한 유물이 있습니다. 그는 이러한 아티팩트가 실제로 대비 / 채도를 크랭크하고 확대하는 경우에만 눈에 띄게 나타납니다. 그는 초기 노이즈가 많은 소스 이미지를 가지고 있습니다.
기사에서 :
마지막 이미지에서 노이즈에 거의 식별 할 수없는 수평선이 있는지 확인하십시오. 이것이 레벨 데이터의 끝입니다. 이것이 의미하는 바는 실제로 모든 레벨 데이터를 265x120 픽셀 이미지에 맞출 수 있다는 것입니다.
TRICKY 부록 :
내가 할 수있는 일과 Spore 사람들도 실제로 100 % 투명 픽셀의 모든 색상 비트를 사용한다고 생각합니다. 해당 픽셀은 투명하기 때문에 어떤 색으로 설정했는지는 중요하지 않습니다.
그러나 전체 이미지를 사용하고 있기 때문에이 작업을 수행 할 수 없으므로 투명한 픽셀이 없습니다.
메타 데이터에 저장하는 것보다이 기술을 선호하는 이유는 무엇입니까?
추가 크레딧 : 노이즈의 눈에 띄는 것을 줄이기 위해 고정 시드가있는 PRNG를 사용하여 수정할 픽셀을 선택할 수 있습니다. 유사한 방식으로 일부 색상 채널 만 수정할 수도 있습니다.
Sporepedia에서 몇 가지 포자 생물을 다운로드하여 검사했습니다. 내가 배운 사람들로부터 :
이것이 Spore가하는 일이라는 점은 주목할 가치가 있으며, 대부분의 다른 관심사보다 단순성을 제공하는 방법입니다.
추가 데이터 블록 대신에 stenography를 선택하면 이미지가 웹 사이트에 의해 다시 인코딩 된 경우 데이터가 계속 유지되지만 크기 조정 또는 Jpeg 압축은 유지되지 않습니다.
가장 두드러진 대안은 실제로 이미지의 ID 만 인코딩하고 실제 데이터를 중앙 서버에 저장 하여이 ID를 정확한 생물 데이터와 교환 할 수 있다고 생각합니다. 그러한 ID는 스케일링 및 압축 내성 stenography 형식으로 인코딩 될 수있을 정도로 짧을 것입니다.
Spore 형식에 대한 간단한 개선 사항은 다음과 같습니다.