게임 메타 데이터를 .png 파일로 저장하려면 어떻게해야합니까?


208

포자는 .png파일 을 내보내 플레이어가 만든 생물체를 공유 할 수 있습니다 . 그것은 .png생물의 사진이지만, 게임으로 가져 오면, 생물의 정보 (예 : 질감, 크기, 모양)도 함께 제공됩니다.

그러한 기능을 어떻게 구현할 수 있습니까?


5
점수가 훨씬 높아야한다는 것은 매우 흥미로운 질문입니다.
Pierre Arlaud

3
알파 채널은 이것에 대해 부분적으로 남용 될 수 있습니다.
Tobias Kienzler


1
이 데이터를 다른 파일에 저장하는 것이 좋습니다. 이 파일에는 데이터를 저장하려는 엔티티와 관련된 텍스처 파일의 이름이 있어야합니다. 우선, 명시 적으로하기 위해 (png 형식은 그래픽 용- "Portable Network Graphics") 둘째, 엔티티와 함께 ​​더 많은 이미지를 저장하려는 상황을 고려하면 해당 사용자 정의 파일에서 단순히 참조를 추가 할 수 있습니다. 하나의 PNG에 다른 이미지 (다른 크기, 다른 깊이 등)를 저장하는 데 문제가있을 수 있습니다.
luke1985

3
알파 채널은 많이 언급되었으며, 물론 PNG는 메타 데이터를 지원하지만, 내가 사용한 기술을 왼쪽에서 오른쪽으로, 위에서 아래로, 고정 된 순서로 채널을 통해 공유한다고 생각했습니다. , 값을 홀수 또는 짝수로 반올림 - 이 위 또는 아래로 중요하지 않습니다. 모든 채널에서 1을 변경해도 눈에 띄는 차이는 없으며 256x256 이미지 (픽셀 당 4 비트)로 인상적인 32KB의 데이터를 저장할 수 있습니다. 더 많은 것이 필요하다면, 대신 % 4로 반올림 할 수 있습니다 – 너무 많아서 오래된 GIF 마인드처럼 보이기 시작합니다.
Octopoid

답변:


56

진정으로 필요한 모든 것이 PNG 파일이면 정보를 파일에 추가하기 만하면됩니다. 이것은 실제로 Steganography 의 관행입니다 . 많은 경우에, 이것은 공개적으로 보이는 것에서 페이로드 또는 비밀 메시지를 숨기는 데 사용됩니다. 그러나이 경우이 방법이 사용 된 것 같습니다. 일반적인 Stegongraphy는 내용을 숨기는 데 방해가되지만 파일 끝에있는 이미지에서 데이터를 단순히 추가하여 검색 할 수없는 이유는 없습니다.

여러 도구 가이 데이터를 인코딩하여 Google 검색에 적어도 이것이것을 나타 냅니다.

PNG는 $89시작시 바이트 서명 을 가지므로 정보는 PNG 구조 자체 뒤에 삽입되고 단순히 SPORE 게임에 의해 구문 분석 될 수 있습니다.

그러나 다른 답변과 Google 검색에 대한 추가 연구에 따르면 Spore는 실제로 알파 비트의 정보를 숨기기 위해 Stegongraphy 버전 만 사용하고 있음을 알 수 있습니다. 이를 염두에두고 추가 된 데이터 나 메타 데이터의 가능성을 배제 할 수 있습니다.

주목해야한다 메타 데이터는 데이터가 로컬로 해석되는 경우, 여전히 매우 실행 가능한 선택입니다. 해당 정보가 웹에서 공유되거나 다시 인코딩 될 수있는 경우, 내보내기가 모든 정보를 보존한다고 보장하지는 않습니다. 픽셀 데이터를 사용하면 문제없이 손실없이 변환 할 수 있습니다.


3
내가 아는 한 PNG의 알파 채널 내부에 저장된 메타 데이터를 포자.
Tara

28
PNG가 임의의 메타 데이터 청크를 지원할 때 알파 채널 또는 스테 가노 그래피를 사용해야하는 이유는 무엇입니까?
Russell Borogove

8
"PNG는 시작시 바이트 서명"89 "를 가지므로 정보가 PNG 구조 자체 이전 또는 이후에 삽입되어 단순히 SPORE 게임에 의해 구문 분석되었을 가능성이 높습니다." 더 이상 PNG 파일이 아닙니다. 즉, 일반적인 이미지 뷰어는이를 표시 할 수 없습니다.
svick

3
@RussellBorogove 한 가지 좋은 이유 : PNG가 Spore 이외의 것으로 디코딩 / 인코딩되면 임의의 메타 데이터 청크가 실제 이미지 데이터보다 무시되거나 손실 될 가능성이 높습니다. 이미지의 데이터를 인코딩하면 볼 수 있으면로드 할 가능성이 높아집니다 .
Tim S.

@svick 사실, 나는 유효한 PNG와 RAR 인 파일을 가지고 놀았습니다. PNG 이후 RAR 헤더가 시작되었고 RAR 추출기는 문제가 없었습니다. 다른 방법으로도 잘 작동 할 수 있습니다.
cortices

153

PNG 포맷은 다소간 임의의 메타 데이터에 대한 지원을 갖는다. PNG 표준은 PNG 파일, 필요한 (이미지 데이터를 포함) 중 일부의 덩어리, 본질적으로 시리즈를 정의합니다. 그러나 다른 것은 선택 사항입니다. 예를 들어, 감마 정보 또는 히스토그램 데이터를 저장하기위한 청크가 있습니다.

특히 임의의 키 / 값 텍스트 쌍을 저장하는 데 사용할 수 있는 tEXt청크 가 있습니다. 이 데이터를 텍스트로 표현할 수 있다면 원하는 임의의 데이터를 전달하는 데 사용할 수 있습니다.

이러한 추가 청크 (예 : 참조 라이브러리 )에 액세스하고 조작 할 수있는 PNG 라이브러리가 필요 하거나 직접 작성해야합니다. 그런 다음 원하는 데이터를 키 / 값 쌍으로 인코딩하는 방법을 선택하면됩니다. 나는 다음을 제안한다.

  • 조잡한 "네임 스페이스"시스템을 만드는 방법으로 프로젝트 이름 또는 코드 이름이 앞에 붙은 키 이름을 선택하고 다른 응용 프로그램의 데이터 사용과의 잠재적 충돌을 피하십시오.
  • 이 방법으로 실제 텍스처 를 저장하지 말고 게임 자체 자산 데이터베이스 내에있는 텍스처에 대한 참조를 저장하십시오
  • 생물체 또는 물체 크기, 무게 등의 데이터 (기본적으로 간단한 스칼라)를 간단하게 저장할 수 있습니다.

더 완전한 답변을 얻기 위해 또 다른 접근 방법이 있음을 지적합니다 (이전에 @Vaughn 및 @Alexis의 답변에 문서화되어 있음). 이미지 픽셀에 직접 추가 데이터를 인코딩하여 데이터를 분산시킵니다. 컬러 채널의 하위 비트 이 방법을 사용하려면 추가 메타 데이터를 사용할 필요가 없습니다. 즉, 메타 데이터에 의존하거나 외부 프로그램이 해당 메타 데이터를 잘못 처리하지 않아도 걱정하지 않고 완전히 구현할 수 있습니다. 또한 "쿨"요소가 매우 높으며 하위 비트 만 사용하기 때문에 이미지는 여전히 사람의 눈에 맞습니다. 그러나 이미지 크기는 저장할 수있는 데이터 양의 주요 제어 요소임을 의미합니다. 더 많은 저장 공간이 필요한 경우 이미지에 더 많은 픽셀을 할당해야합니다.

다른 사람들이 지적 했듯이이 프로세스는 스테 가노 그라피 (steganography )라고합니다 .


3
하나는 단순히 Base64로를 통해 데이터를 전송하고 단일 값으로 저장할 수
CodesInChaos

11
@ da4c30ff 메타 데이터만큼 실용적으로 스테 가노 그래피에는 군중이 저항하기 어려운 특정 스파이 판타지 멋진 요소가 있습니다. 이 작업을 직접 수행하는 경우 Josh Petrie가 제안한 확장 성 방법을 사용하지만 이미지와 텍스트가 서로 속해 있는지 확인하기 위해 스테 가노 그래피를 사용하여 이미지 자체의 체크섬을 숨기고 싶은 마음이 있습니다. 이것은 유용하거나 안전하지만 시원하기 때문입니다. ;)
DMGregory

여기서 "텍스트"는 정확히 무엇을 의미합니까? ASCII 만 (문자 <= 127)? 0을 제외한 모든 바이트? 전혀 바이트? 또는 다른 것? (이것은 이진 데이터를 쓰는 데 사용해야하는 인코딩에 영향을 미칩니다. 예 : base64가 필요한지 여부)
svick

1
텍스트 청크의 표준에 대한 링크로 답변을 업데이트했습니다. 그러나 기본적으로 텍스트는 ISO 8859-1 (8 비트, 1 바이트, 라틴 -1 문자)에 따라 해석됩니다.
Josh

51

모나코 개발자는 실제로 자신과 Spore가 어떻게이를 달성했는지에 대한 훌륭한 기사 를 작성했습니다.

그들이하는 일의 기본 요약은 매우 간단합니다.

  • 데이터를 이진으로 변환
  • 대상 이미지를 원시 비트 맵으로 변환
  • 이미지의 픽셀을 따라 예측 가능한 패턴으로 걷습니다 (왼쪽에서 오른쪽 위 모서리에서 왼쪽에서 오른쪽으로 수행).
  • 각 픽셀의 각 컬러 채널의 최하위 비트에 1 비트 쓰기
  • 수정 된 비트 맵을 다시 png로 내보내기

데이터를 검색하려면이 작업을 반대로 수행하면됩니다.

이 과정의 기본 아이디어 는 이미지에 많은 픽셀이 있으며 각 색상 채널의 최하위 비트가 차이를 만들지 않는다는 것 입니다. 또한, 작성하는 비트의 약 절반이 이미지의 비트가 이미었던 것입니다. 다시 얻는 것은 본질적으로 올바른 이미지이지만 이상한 유물이 있습니다. 그는 이러한 아티팩트가 실제로 대비 / 채도를 크랭크하고 확대하는 경우에만 눈에 띄게 나타납니다. 그는 초기 노이즈가 많은 소스 이미지를 가지고 있습니다.

기사에서 :

마지막 이미지에서 노이즈에 거의 식별 할 수없는 수평선이 있는지 확인하십시오. 이것이 레벨 데이터의 끝입니다. 이것이 의미하는 바는 실제로 모든 레벨 데이터를 265x120 픽셀 이미지에 맞출 수 있다는 것입니다.

TRICKY 부록 :

내가 할 수있는 일과 Spore 사람들도 실제로 100 % 투명 픽셀의 모든 색상 비트를 사용한다고 생각합니다. 해당 픽셀은 투명하기 때문에 어떤 색으로 설정했는지는 중요하지 않습니다.

그러나 전체 이미지를 사용하고 있기 때문에이 작업을 수행 할 수 없으므로 투명한 픽셀이 없습니다.

메타 데이터에 저장하는 것보다이 기술을 선호하는 이유는 무엇입니까?

  • 더 재미 있어요! :)
  • 서비스는 메타 데이터 (개인 정보 보호 / 보안 기능)를 맹 글링 할 수 있지만 공격적인 이미지 호스팅 요구 사항이없는 경우 (PNF의 페이스 북) PNG 픽셀을 엉망으로 만들면 안됩니다. 그러나 이미지를 완전히 다시 내보내는 경우 안정적으로 수행 할 수 있는 작업이 없습니다.

추가 크레딧 : 노이즈의 눈에 띄는 것을 줄이기 위해 고정 시드가있는 PRNG를 사용하여 수정할 픽셀을 선택할 수 있습니다. 유사한 방식으로 일부 색상 채널 만 수정할 수도 있습니다.


6
Monaco 방법보다 이미지 스케일링 / 컬러 조정에 대해 더 강력한 스테 가노 그래피 알고리즘이 있습니다. (일반적으로 데이터는 상당히 낮은 밀도로 저장되지만) 월드 오브 워크래프트 스크린 샷에 사용 된 워터 마킹은 다음과 같습니다. ownedcore.com/forums/world-of-warcraft/…
DMGregory

@DMGregory 좋은 발견! 선택한 정확한 알고리즘은 특정 사용 사례 (공간, 내구성, 비밀 등)에 따라 결정되어야합니다.
Alexis Beingessner

1
이것이 들리는 것처럼 시원하면 나쁜 생각입니다. PNG 이미지는 무손실 이미지 압축을 사용합니다. 이미지의 비트가 적 으면 이미지 품질이 약간 저하되는 동시에 파일 크기가 커질 수 있습니다. 절대적으로 모든 정보를 "텍스트"로 인코딩 할 수 있으므로 메타 데이터 청크를 사용하는 것이 분명히 올바른 방법입니다. 실제로 스테 가노 그래피를 필요로하지 않고 이미지 비트를 조작하는 사람은 바퀴벌레가 터지는 것입니다.
dfeuer

1
@dfeuer-Spore와 Monaco는 모두 .PNG를 베어 비트 맵으로 분리하는 자산 로딩 파이프 라인이있는 게임 프레임 워크를 사용하고 있었기 때문에 메타 데이터 청크가 통과하지 못했습니다.
Russell Borogove

1
@ dfeuer 나는 순진한 테스트를했습니다. 메타 데이터 접근 방식은 1920x1080px 이미지에 100kB의 임의 비트를 쓸 때 속기 접근 방식에 의해 추가 된 크기의 약 80 %를 추가하는 것으로 보입니다. 빈 이미지와 바탕 화면을 테스트했습니다. 정확히 치명적인 차이는 아니지만 실제로 40kB 이상을 염려한다면 meatadata가 확실히 더 우수하고 일관성이 있습니다. 메타 데이터는 여전히 매우 비효율적입니다. 100kB의 데이터를 작성하여 181kB를 얻었습니다! 문자열이 인코딩되는 방식 또는 무언가를 최적화 할 공간이 될 수 있습니다.
Alexis Beingessner

7

Sporepedia에서 몇 가지 포자 생물을 다운로드하여 검사했습니다. 내가 배운 사람들로부터 :

  • 이미지에는 표준 이미지 데이터 외에 정보가 없습니다.
  • 협착 데이터는 이미지를 고려하지 않고 저장되었으므로 투명한 부분이 독점적으로 사용되었다고 상상할 수는 있지만 그렇지 않습니다.
  • 스토리지 사용은 저장해야하는 정보의 양에 따라 다르며, 일부 이미지는 데이터 저장을 위해 최하위 비트 만 사용하고, 일부는 최소 2 비트를 사용했으며, 일부는 더 많이 사용할 수 있습니다.
  • 포자 형식은 이미지의 일부에만 비트를 사용하지 않고 전체 이미지에서 최하위 비트가 변경되며, 두 번째 최하위 비트가 사용되는 경우 전체 이미지에 사용됩니다. 이것은 아마도 임의 패딩을 사용하여 수행됩니다. 이것은 노이즈 자체보다 시청자에게 더 혼란 스러울 수있는 품질의 변화를 피합니다.
  • 4 개의 채널 모두가 똑같이 사용되며, 불투명 채널에는 특별한 처리가 없으므로, 일부 투명 픽셀은 약간 불투명하고 일부 불투명 픽셀은 약간 투명합니다.

이것이 Spore가하는 일이라는 점은 주목할 가치가 있으며, 대부분의 다른 관심사보다 단순성을 제공하는 방법입니다.

추가 데이터 블록 대신에 stenography를 선택하면 이미지가 웹 사이트에 의해 다시 인코딩 된 경우 데이터가 계속 유지되지만 크기 조정 또는 Jpeg 압축은 유지되지 않습니다.

가장 두드러진 대안은 실제로 이미지의 ID 만 인코딩하고 실제 데이터를 중앙 서버에 저장 하여이 ID를 정확한 생물 데이터와 교환 할 수 있다고 생각합니다. 그러한 ID는 스케일링 및 압축 내성 stenography 형식으로 인코딩 될 수있을 정도로 짧을 것입니다.

Spore 형식에 대한 간단한 개선 사항은 다음과 같습니다.

  • 투명 픽셀의 색상 값만 사용하거나 선호하지만 시각적으로 차이가 없습니다.
  • 파란색 채널을 더 많이 사용하고 녹색 채널을 더 적게 사용하면 파란색이 이미지에 미치는 영향이 더 낮습니다.
  • 각 픽셀의 휘도를 변경하지 않고 가깝게 유지하고 데이터를 크로마로 인코딩하면이 매개 변수의 작은 노이즈는 거의 감지 할 수 없습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.