ฉันจะเก็บข้อมูลเมตาของเกมในไฟล์. png ได้อย่างไร


208

Spore อนุญาตให้แบ่งปันสิ่งมีชีวิตที่ผู้เล่นสร้างขึ้นด้วยการส่งออก.pngไฟล์ นั่น.pngคือรูปถ่ายของสิ่งมีชีวิต แต่ถ้ามันถูกนำเข้าไปในเกมข้อมูลของสิ่งมีชีวิต (เช่นพื้นผิวขนาดและรูปร่าง) ก็มาพร้อมกับมันด้วย

ฉันจะใช้คุณสมบัติดังกล่าวได้อย่างไร


5
ควรมีคะแนนที่สูงขึ้นมากนั่นเป็นคำถามที่น่าสนใจมาก
Pierre Arlaud

3
ช่องทางอัลฟาจะถูกทำร้ายบางส่วนนี้ ...
โทเบียส KIENZLER

3
อาจเป็นไปได้ของการใช้งาน: stackoverflow.com/questions/9542359/…
ตรรกะหน่วยที่

1
ฉันคิดว่าการเก็บข้อมูลนี้ในไฟล์อื่นดีกว่า ในไฟล์นี้ควรมีชื่อของไฟล์พื้นผิวที่เกี่ยวข้องกับเอนทิตีที่คุณต้องการจัดเก็บข้อมูล ประการแรกเพื่อประโยชน์ในการอธิบาย (รูปแบบ png สำหรับกราฟิก - "กราฟิกเครือข่ายพกพา") ประการที่สอง: พิจารณาสถานการณ์ที่คุณต้องการเก็บภาพมากขึ้นด้วยเอนทิตีคุณสามารถเพิ่มการอ้างอิงจากไฟล์ที่กำหนดเองนั้นได้ คุณอาจจะมีปัญหาในการจัดเก็บภาพที่แตกต่างกัน (ขนาดแตกต่างกัน, ความลึกที่แตกต่างกัน ฯลฯ .. ) ในหนึ่ง PNG
luke1985

3
ช่องอัลฟาได้รับการกล่าวถึงอย่างหนักและแน่นอน PNGs รองรับข้อมูลเมตาอยู่แล้ว แต่ฉันแค่คิดว่าฉันจะแบ่งปันเทคนิคที่ฉันใช้ - ก้าวจากซ้ายไปขวาบนลงล่างและผ่านช่องตามลำดับที่แน่นอน และการปัดเศษค่าเป็นอัตราเดิมพันหรือ evens - ไม่สำคัญว่าจะขึ้นหรือลง การเปลี่ยนแปลง 1 ในช่องใด ๆ ไม่ทำให้เห็นความแตกต่างและในภาพขนาด 256x256 (ที่ 4 บิตต่อพิกเซลแน่นอน) คุณสามารถจัดเก็บข้อมูล 32KB ที่น่าประทับใจ หากคุณต้องการมากกว่านี้คุณสามารถปัดเศษเป็น% 4 แทนได้ - มากเกินไปและมันจะดูเหมือนจิตใจเก่าแก่ของ GIF ..
Octopoid

คำตอบ:


56

หากสิ่งที่คุณต้องการอย่างแท้จริงคือไฟล์ PNG โอกาสที่พวกเขาเพียงแค่เพิ่มข้อมูลลงในไฟล์ นี้เป็นจริงการปฏิบัติของซูรินาเม หลายครั้งสิ่งนี้ใช้เพื่อซ่อน payloads หรือข้อความลับในสิ่งที่ดูเหมือนเป็นสาธารณะ อย่างไรก็ตามมีโอกาสในกรณีนี้ว่าวิธีนี้เป็นสิ่งที่ใช้ Stegongraphy ทั่วไปจะออกนอกทางเพื่อซ่อนเนื้อหา แต่ไม่มีเหตุผลว่าทำไมเราไม่สามารถผนวกข้อมูลจากภาพในตอนท้ายของไฟล์และดึงข้อมูลได้

เครื่องมือต่างๆเข้ารหัสข้อมูลนี้ให้คุณค้นหา google นำขึ้นอย่างน้อยนี้และนี้

PNG มีลายเซ็นเป็นไบต์$89ในตอนเริ่มต้นดังนั้นจึงเป็นไปได้ที่ข้อมูลจะถูกแทรกหลังจากโครงสร้าง PNG และแยกวิเคราะห์โดยเกม SPORE

อย่างไรก็ตามการวิจัยเพิ่มเติมที่ได้รับจากคำตอบอื่น ๆ และการค้นหาบน Google พบว่าสปอร์ใช้จริงเพียง Stegongraphy รุ่นหนึ่งเพื่อซ่อนข้อมูลในอัลฟาบิต ด้วยความคิดนี้เราจึงสามารถแยกแยะความเป็นไปได้ของข้อมูลที่ต่อท้ายหรือเมตาดาต้า

ควรสังเกตว่าข้อมูลเมตายังคงเป็นตัวเลือกที่มีศักยภาพมากหากข้อมูลถูกแยกวิเคราะห์ในพื้นที่ หากข้อมูลนั้นอาจถูกแบ่งปันในเว็บหรือเข้ารหัสใหม่การส่งออกจะไม่รับประกันว่าจะเก็บข้อมูลทั้งหมดของคุณไว้ เมื่อใช้ข้อมูลพิกเซลจะสามารถอยู่รอดได้โดยไม่เกิดปัญหา Conversion


3
เท่าที่ฉันรู้สปอร์เก็บข้อมูลเมตาภายในช่องอัลฟาของ PNG
ธารา

28
เหตุใดจึงต้องใช้ช่องสัญญาณอัลฟาหรือซูรินากเมื่อ PNG สนับสนุนชิ้นข้อมูลเมตาโดยพลการ
Russell Borogove

8
“ PNG มีลายเซ็นของไบต์” 89” ในตอนเริ่มต้นดังนั้นจึงมีความเป็นไปได้มากที่ข้อมูลจะถูกแทรกก่อนหรือหลังโครงสร้าง PNG และแยกวิเคราะห์โดยเกม SPORE” หากเป็นเช่นนั้นมันจะไม่ ' ไม่ต้องเป็นไฟล์ PNG อีกต่อไป เช่นผู้ดูภาพทั่วไปจะไม่สามารถแสดงได้
svick

3
@RussellBorogove เหตุผลหนึ่งที่ค่อนข้างดี: หาก PNG ถูกถอดรหัส / เข้ารหัสโดยบางสิ่งนอกเหนือจากสปอร์ชิ้นส่วนเมตาดาต้าตามอำเภอใจมักจะถูกละเว้นหรือสูญหายมากกว่าข้อมูลภาพจริง การเข้ารหัสข้อมูลในภาพช่วยเพิ่มโอกาสที่ถ้าคุณสามารถเห็นมันคุณสามารถโหลดมัน
ทิม S.

@svick ที่จริงฉันเล่นกับไฟล์ที่เป็น PNG และ RAR ที่ถูกต้อง ส่วนหัว RAR เริ่มต้นหลังจาก PNG และตัวแยก RAR นั้นใช้ได้ มันสามารถทำงานได้ดีในทางอื่นเช่นกัน
cortices

153

รูปแบบ PNGมีการสนับสนุนมากขึ้นหรือน้อยเมตาดาต้าโดยพลการ มาตรฐาน PNGกำหนดไฟล์ PNG, หลักชุดของชิ้นบางส่วนที่จะต้อง (และมีข้อมูลภาพ) คนอื่น ๆ แต่เป็นตัวเลือก ตัวอย่างเช่นมีชิ้นส่วนสำหรับจัดเก็บข้อมูลแกมมาหรือฮิสโตแกรมข้อมูล

โดยเฉพาะอย่างยิ่งมีtEXtกลุ่มข้อมูลที่สามารถใช้เพื่อเก็บคู่ข้อความ / ค่าคีย์โดยพลการ สิ่งนี้สามารถใช้เพื่อจัดส่งข้อมูลตามอำเภอใจใด ๆ ที่คุณต้องการหากคุณสามารถแสดงข้อมูลนั้นเป็นข้อความ (ซึ่งมีโอกาสมาก)

คุณจะต้องมีไลบรารี PNG ที่อนุญาตให้คุณเข้าถึงและจัดการชิ้นส่วนเพิ่มเติมเหล่านี้ (เช่นไลบรารีอ้างอิง ) หรือคุณต้องเขียนด้วยตนเอง จากนั้นเป็นเพียงเรื่องของการเลือกวิธีการเข้ารหัสข้อมูลที่คุณต้องการเป็นคู่ของคีย์ / ค่า ฉันขอแนะนำต่อไปนี้:

  • เลือกชื่อคีย์ที่ขึ้นต้นด้วยชื่อโครงการหรือชื่อรหัสของคุณเพื่อสร้างระบบ "namespace" ที่หยาบและหลีกเลี่ยงความขัดแย้งที่อาจเกิดขึ้นกับการใช้ข้อมูลของแอปพลิเคชันอื่น
  • อย่าพยายามจัดเก็บพื้นผิวจริงด้วยวิธีนี้เก็บการอ้างอิงถึงพื้นผิวเหล่านั้นที่อยู่ในฐานข้อมูลเนื้อหาของเกมของคุณ
  • ข้อมูลเช่นสิ่งมีชีวิตหรือขนาดวัตถุน้ำหนักและอื่น ๆ - สเกลาร์ง่าย ๆ โดยทั่วไป - สามารถเก็บไว้ได้เล็กน้อย

เพื่อประโยชน์ในการทำคำตอบที่สมบูรณ์ยิ่งขึ้นฉันจะชี้ให้เห็นว่ามีวิธีการอื่น (บันทึกไว้ก่อนหน้านี้โดยคำตอบของ @Vaughn และ @ Alexis): เข้ารหัสข้อมูลเพิ่มเติมที่คุณต้องการโดยตรงในพิกเซลภาพกระจายข้อมูลของคุณทั่ว บิตลำดับต่ำของช่องสี วิธีนี้ไม่จำเป็นต้องใช้ข้อมูลเมตาเพิ่มเติมซึ่งหมายความว่าคุณสามารถใช้งานได้ทั้งหมดโดยไม่ต้องพึ่งพาหรือกังวลเกี่ยวกับโปรแกรมภายนอกที่จัดการข้อมูลเมตานั้นไม่ถูกต้อง นอกจากนี้ยังมีปัจจัย "เจ๋ง" ที่สูงมากและเนื่องจากคุณใช้บิตที่มีลำดับต่ำเท่านั้นภาพจะยังคงถูกต้องต่อสายตามนุษย์ อย่างไรก็ตามหมายความว่าขนาดรูปภาพของคุณเป็นปัจจัยควบคุมหลักสำหรับปริมาณข้อมูลที่คุณสามารถจัดเก็บได้ หากคุณต้องการพื้นที่เก็บข้อมูลเพิ่มเติมคุณต้องจัดสรรพิกเซลให้กับรูปภาพมากขึ้น

ตามที่คนอื่น ๆ ได้ชี้ให้เห็นกระบวนการนี้เป็นที่รู้จักกันในนามของซูรินาเม


3
เพียงแค่สามารถส่งข้อมูลผ่าน Base64 และเก็บไว้เป็นค่าเดียว
CodesInChaos

11
@ da4c30ff เช่นเดียวกับที่ใช้ในทางปฏิบัติ metadata คือ Steganography มีปัจจัยที่ยอดเยี่ยมในสายลับแฟนตาซีที่ยากสำหรับฝูงชนของเราที่จะต่อต้าน ถ้าฉันทำสิ่งนี้ด้วยตัวเองฉันจะใช้วิธีที่เสนอโดย Josh Petrie เพื่อขยายขีดความสามารถ แต่ฉันถูกล่อลวงอย่างมากที่จะใช้ Steganography เพื่อซ่อนเช็คซัมในรูปภาพเพื่อยืนยันว่ารูปภาพและข้อความเป็นของกันและกัน - ไม่ใช่เพราะ สิ่งนี้มีประโยชน์หรือปลอดภัย แต่เพียงเพราะมันยอดเยี่ยม ;)
DMGregory

"ข้อความ" หมายถึงอะไรที่นี่? เฉพาะ ASCII (ตัวอักษร <= 127) ไบต์ใดก็ได้ยกเว้น 0 ไบต์ใด ๆ เลย? หรืออย่างอื่น? (ซึ่งจะส่งผลกระทบต่อการเข้ารหัสที่คุณจำเป็นต้องใช้ในการเขียนข้อมูลไบนารีเช่นว่าคุณต้อง base64 หรือไม่..)
svick

1
ฉันอัพเดตคำตอบพร้อมลิงก์ไปยังมาตรฐานสำหรับกลุ่มข้อความ แต่โดยทั่วไปข้อความจะถูกตีความตามมาตรฐาน ISO 8859-1 (8 บิต, ไบต์เดียว, อักขระละติน -1)
Josh

51

นักพัฒนาของโมนาโกทำบทความที่ยอดเยี่ยมเกี่ยวกับวิธีที่พวกเขาและสปอร์บรรลุผลสำเร็จ

สรุปพื้นฐานของสิ่งที่พวกเขาทำนั้นค่อนข้างง่าย:

  • แปลงข้อมูลของคุณเป็นแบบไบนารี่
  • แปลงภาพเป้าหมายของคุณให้เป็นบิตแมปแบบดิบ
  • เดินไปตามพิกเซลของภาพในรูปแบบที่คาดเดาได้บางอย่าง (พวกเขาทำจากซ้ายไปขวาจากมุมบนซ้าย)
  • เขียนหนึ่งบิตถึงบิตลำดับต่ำสุดของแต่ละช่องสีของแต่ละพิกเซล
  • ส่งออกบิตแมปที่ปรับเปลี่ยนเป็น png อีกครั้ง

เพียงทำสิ่งนี้ในสิ่งที่ตรงกันข้ามเพื่อดึงข้อมูลของคุณ

แนวคิดพื้นฐานเบื้องหลังกระบวนการคือมีพิกเซลจำนวนมากในภาพและบิตลำดับต่ำสุดของแต่ละช่องสีไม่ได้สร้างความแตกต่างใหญ่ นอกจากนี้ประมาณครึ่งหนึ่งของบิตที่คุณเขียนจะเป็นเพียงบิตของรูปภาพที่มีอยู่แล้ว สิ่งที่คุณจะได้รับกลับมาคือภาพลักษณ์ที่ถูกต้อง แต่มีสิ่งประดิษฐ์แปลก ๆ เขาใช้เวลาในการสังเกตว่าสิ่งประดิษฐ์เหล่านี้จะสังเกตเห็นได้ชัดก็ต่อเมื่อคุณเหวี่ยงความเปรียบต่าง / ความอิ่มตัวของสีและซูมเข้าจริง ๆ เขามีแหล่งที่มาของภาพที่มีเสียงรบกวนเบื้องต้นมากมาย

จากบทความ:

สังเกตุในภาพสุดท้ายว่าเสียงในแนวนอนนั้นสังเกตได้ยากเพียงใด นั่นคือจุดสิ้นสุดของข้อมูลระดับ สิ่งนี้หมายความว่าฉันสามารถใส่ข้อมูลทุกระดับให้เป็นภาพขนาด 265x120 พิกเซลโดยใช้บิตที่มีนัยสำคัญน้อยที่สุดเท่านั้น

ภาคผนวกที่แสนอร่อย:

สิ่งที่ฉันสามารถทำได้และฉันเชื่อว่า Spore folks ทำได้ดีจริง ๆ แล้วใช้บิตสีทั้งหมดในพิกเซลที่โปร่งใส 100% เนื่องจากพิกเซลเหล่านั้นโปร่งใสจึงไม่สำคัญว่าคุณจะตั้งค่าสีใด

อย่างไรก็ตามฉันไม่สามารถทำได้เนื่องจากฉันใช้รูปภาพทั้งหมดซึ่งหมายความว่าฉันไม่มีพิกเซลแบบโปร่งใสที่จะใช้งานได้

ทำไมชอบเทคนิคนี้มากกว่าแค่เก็บไว้ในเมทาดาทา

  • มันสนุกมาก! :)
  • บริการอาจทำลายข้อมูลเมตา (อาจเป็นคุณลักษณะความเป็นส่วนตัว / ความปลอดภัย) แต่ไม่ควรทำให้พิกเซลของ png ของคุณยุ่งเหยิงเว้นแต่ว่าพวกเขามีข้อกำหนดด้านการโฮสต์ภาพที่ก้าวร้าว (มองคุณ, Facebook) แต่ถ้าพวกเขาส่งออกภาพของคุณใหม่อย่างสมบูรณ์คุณจะไม่สามารถทำสิ่งใดได้อย่างน่าเชื่อถือ

เครดิตพิเศษ: เพื่อลดความน่าสนใจของเสียงคุณสามารถใช้ PRNG พร้อมเมล็ดคงที่เพื่อเลือกพิกเซลที่จะแก้ไข คุณสามารถแก้ไขแชนเนลสีบางช่องในลักษณะที่คล้ายกันได้เท่านั้น


6
มีอัลกอริธึม steganographic ที่แข็งแกร่งกว่าการปรับขนาดภาพ / สีมากกว่าวิธีการโมนาโก (แม้ว่าโดยทั่วไปแล้วพวกเขาเก็บข้อมูลที่ความหนาแน่นต่ำกว่าอย่างมาก) ตัวอย่างหนึ่งคือลายน้ำที่ใช้ในภาพหน้าจอของ World of Warcraft: ownercore.com/forums/world-of-warcraft/…
DMGregory

@DMGregory ดีหา! แน่นอนว่าอัลกอริทึมที่แม่นยำที่คุณเลือกควรได้รับการตัดสินโดย usecase เฉพาะของคุณ (พื้นที่, ความทนทาน, ความลับ, ฯลฯ )
Alexis Beingessner

1
เท่อย่างที่อาจฟังดูเป็นความคิดที่ไม่ดี ภาพ PNG ใช้การบีบอัดภาพแบบไม่สูญเสียภาพ ; การวนรอบด้วยภาพที่มีขนาดเล็กจะทำให้ไฟล์มีขนาดใหญ่ขึ้นในเวลาเดียวกันเนื่องจากคุณภาพของภาพจะลดลงเล็กน้อย ข้อมูลใด ๆ สามารถเข้ารหัสเป็น "ข้อความ" ได้ดังนั้นการใช้เมทาดาทาอันเป็นวิธีที่ถูกต้องชัดเจนในการทำสิ่งนี้ ใครบางคนที่เล่นซอบิตของภาพโดยไม่จำเป็นต้องมีซูรินาเมเป็นแค่ popping wheelies
dfeuer

1
@dfeuer - เห็นได้ชัดว่าทั้ง Spore และ Monaco กำลังใช้เฟรมเวิร์กของเกมที่มีการโหลดเนื้อหาที่ตัด. PNG ลงไปที่บิตแมปเปล่าดังนั้น metadata chunks จึงไม่สามารถทำได้
รัสเซล Borogove

1
@dfeuer ฉันได้ทำการทดสอบที่ไร้เดียงสา เมตาดาต้าเมธอดปรากฏขึ้นเพื่อเพิ่มขนาดประมาณ 80% ของขนาดที่เพิ่มโดยวิธีสเตโนกราฟเมื่อเขียน 100kB ของบิตสุ่มไปยังรูปภาพขนาด 1920x1080px ทดสอบในภาพว่างเปล่าและภาพหน้าจอเดสก์ท็อป ไม่แตกต่างกันอย่างมหันต์ แต่เนื้อสัตว์ดีกว่าแน่นอน (และสอดคล้องกันมากขึ้น) ถ้าคุณกังวลมากกว่า 40kB โปรดทราบว่าข้อมูลเมตายังไม่มีประสิทธิภาพพอสมควร ฉันได้รับ 181kB สำหรับการเขียนข้อมูล 100kB! อาจเป็นพื้นที่สำหรับเพิ่มประสิทธิภาพวิธีการเข้ารหัสสตริงหรือบางสิ่งบางอย่าง
Alexis Beingessner

7

ฉันดาวน์โหลดและตรวจสอบสิ่งมีชีวิต Spore จาก Sporepedia จากสิ่งที่ฉันได้เรียนรู้ว่า:

  • รูปภาพไม่มีข้อมูลเพิ่มเติมจากข้อมูลภาพมาตรฐาน
  • ข้อมูลชวเลขถูกเก็บไว้โดยไม่คำนึงถึงภาพใคร ๆ ก็นึกภาพได้ว่าชิ้นส่วนที่โปร่งใสนั้นถูกใช้โดยเฉพาะ แต่ไม่ใช่
  • การใช้ที่เก็บข้อมูลขึ้นอยู่กับปริมาณข้อมูลที่ต้องจัดเก็บภาพบางภาพใช้บิตที่มีนัยสำคัญน้อยที่สุดสำหรับการจัดเก็บข้อมูลบางภาพใช้บิตที่มีความสำคัญน้อยที่สุดสองอย่างบางอย่างอาจใช้มากกว่านี้
  • รูปแบบสปอร์หลีกเลี่ยงการใช้บิตเพียงส่วนเดียวของภาพบิตที่มีการเปลี่ยนแปลงอย่างมีนัยสำคัญน้อยที่สุดตลอดทั้งภาพหากใช้บิตที่มีนัยสำคัญน้อยที่สุดเป็นอันดับที่สองก็จะใช้กับรูปภาพทั้งหมด สิ่งนี้สามารถทำได้โดยใช้การสุ่มแบบสุ่ม นี่เป็นการหลีกเลี่ยงการเปลี่ยนคุณภาพที่อาจรบกวนผู้ชมมากกว่าเสียงรบกวน
  • มีการใช้ทั้งสี่ช่องทางอย่างเท่าเทียมกันช่องทึบแสงไม่ได้รับการดูแลเป็นพิเศษดังนั้นพิกเซลโปร่งแสงบางส่วนจึงทึบแสงเล็กน้อยในขณะที่พิกเซลทึบแสงบางพิกเซลโปร่งใสเล็กน้อย

เป็นที่น่าสังเกตว่านี่เป็นเพียงสิ่งที่สปอร์ทำซึ่งเป็นวิธีการที่ใช้ความเรียบง่ายก่อนข้อกังวลอื่น ๆ

ทางเลือกในการใช้การจดชวเลขมากกว่าบล็อกข้อมูลเพิ่มเติมหมายความว่าข้อมูลจะอยู่รอดได้หากรูปภาพถูกเข้ารหัสซ้ำเช่นเว็บไซต์แม้ว่ามันจะไม่รอดจากการปรับขนาดหรือการบีบอัด Jpeg

ฉันคิดว่าทางเลือกที่โดดเด่นที่สุดคือเข้ารหัสรหัสในภาพเท่านั้นและปล่อยให้ข้อมูลจริงถูกเก็บไว้บนเซิร์ฟเวอร์ส่วนกลางที่สามารถแลกเปลี่ยนรหัสนี้สำหรับข้อมูลสิ่งมีชีวิตที่แน่นอน รหัสดังกล่าวจะสั้นพอที่จะเข้ารหัสในรูปแบบของการกำหนดขนาดและการทนต่อการบีบอัดของการบีบอัด

การปรับปรุงอย่างง่ายที่เป็นไปได้ของรูปแบบสปอร์ ได้แก่ :

  • ใช้เฉพาะหรือชอบใช้ค่าสีของพิกเซลโปร่งใสพวกเขาไม่ได้สร้างความแตกต่างที่มองเห็น
  • ใช้ช่องสีฟ้าให้มากขึ้นและช่องสีเขียวน้อยลงสีฟ้ามีผลกระทบต่อการรับรู้ภาพที่ต่ำกว่า
  • การรักษาความส่องสว่างของแต่ละพิกเซลให้อยู่ใกล้กับไม่เปลี่ยนแปลงและเข้ารหัสข้อมูลใน Chroma เสียงรบกวนเล็กน้อยในพารามิเตอร์นี้แทบไม่สามารถตรวจจับได้โดยมนุษย์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.