Bagaimana saya bisa menyimpan metadata game dalam file .png?

208

Spore memungkinkan makhluk yang dibuat pemain untuk dibagikan dengan mengekspor .pngfile. Itu .pngadalah foto makhluk itu, tetapi jika itu diimpor ke dalam permainan, informasi makhluk itu (seperti tekstur, ukuran, dan bentuk) juga disertakan.

Bagaimana saya bisa mengimplementasikan fitur seperti itu?

ibrabeicker
sumber
5
Seharusnya memiliki skor yang jauh lebih tinggi, itu adalah pertanyaan yang sangat menarik.
Pierre Arlaud
3
Saluran alfa dapat sebagian disalahgunakan untuk ini ...
Tobias Kienzler
3
Penggunaan mungkin: stackoverflow.com/questions/9542359/…
unit logika
1
Saya pikir lebih baik menyimpan data ini di file lain. Dalam file ini, harus ada nama file tekstur yang terkait dengan entitas yang ingin Anda simpan datanya. Pertama demi kejelasan (format png adalah untuk grafik - "Portable Network Graphics"), kedua: pertimbangkan situasi di mana Anda ingin menyimpan lebih banyak gambar dengan suatu entitas, Anda bisa menambahkan referensi ke sana dari file kustom itu. Anda mungkin akan kesulitan menyimpan gambar yang berbeda (ukuran berbeda, kedalaman berbeda dll.) Dalam satu PNG.
luke1985
3
Saluran alfa telah banyak disebutkan, dan tentu saja PNG mendukung data meta, tapi saya hanya berpikir saya akan berbagi teknik yang saya gunakan - melangkah dari kiri ke kanan, atas ke bawah, dan melalui saluran dalam urutan tetap. , dan membulatkan nilai ke odds atau genap - tidak masalah apakah itu naik atau turun. Perubahan 1 di APAPUN dari saluran tidak membuat perbedaan nyata, dan dalam gambar 256x256 (pada 4 bit per piksel tentu saja), Anda dapat menyimpan data 32KB yang mengesankan. Jika Anda membutuhkan lebih banyak, Anda dapat membulatkan ke% 4 sebagai gantinya - terlalu banyak dan itu mulai terlihat seperti pikiran GIF lama
Octopoid

Jawaban:

56

Jika yang benar-benar Anda butuhkan adalah file PNG, kemungkinan mereka hanya menambahkan informasi ke dalam file tersebut. Ini sebenarnya adalah praktik Steganografi . Sering kali, ini digunakan untuk menyembunyikan muatan atau pesan rahasia dalam hal-hal yang tampaknya dihadapi publik. Namun, kemungkinan dalam hal ini metode ini adalah apa yang digunakan. Stegongraphy yang khas akan keluar dari jalan untuk menyembunyikan konten, tetapi tidak ada alasan mengapa seseorang tidak bisa hanya menambahkan data dari gambar di akhir file dan mengambilnya.

Beberapa alat menyandikan data ini untuk Anda, pencarian google memunculkan setidaknya ini dan ini .

PNG memiliki tanda tangan byte $89di awal, jadi ada kemungkinan bahwa informasi tersebut dimasukkan setelah struktur PNG itu sendiri dan hanya diuraikan oleh game SPORE.

Namun, penelitian lebih lanjut yang diberikan oleh jawaban lain dan pencarian di google mengungkapkan bahwa Spore sebenarnya hanya menggunakan versi Stegongraphy untuk menyembunyikan informasi dalam bit alpha. Dengan mengingat hal ini, kita dapat mengesampingkan kemungkinan data yang ditambahkan atau meta-data.

Perlu dicatat bahwa meta data masih merupakan pilihan yang sangat layak, jika data sedang diurai secara lokal. Jika informasi itu dapat dibagikan di seluruh web atau disandikan ulang, ekspor tidak dijamin untuk menyimpan semua informasi Anda. Saat data piksel digunakan, ia dapat bertahan dari konversi tanpa kehilangan tanpa masalah.

Vaughan Hilts
sumber
3
Sejauh yang saya tahu, spora disimpan metadata di dalam saluran alpha PNG.
Tara
28
Mengapa menggunakan saluran alfa atau steganografi ketika PNG mendukung potongan metadata yang sewenang-wenang?
Russell Borogove
8
"PNG memiliki tanda tangan byte" 89 "di awal, jadi sangat mungkin bahwa informasi itu dimasukkan sebelum atau setelah struktur PNG itu sendiri dan hanya diuraikan oleh game SPORE." Jika itu masalahnya, maka itu tidak akan t menjadi file PNG lagi. Yaitu pemirsa gambar umum tidak akan dapat menampilkannya.
svick
3
@RussellBorogove satu alasan yang cukup bagus: jika PNG didekodekan / disandikan oleh sesuatu selain Spore, potongan metadata yang sewenang-wenang lebih cenderung diabaikan atau hilang daripada data gambar aktual. Pengkodean data dalam gambar meningkatkan kemungkinan bahwa jika Anda bisa melihatnya, Anda bisa memuatnya .
Tim S.
@ svick Sebenarnya, saya telah memainkan file yang keduanya merupakan PNG dan RAR yang valid. Header RAR dimulai setelah PNG, dan ekstraktor RAR baik-baik saja. Ini juga bisa berfungsi dengan baik.
cortices
153

The format PNG memiliki dukungan untuk lebih-atau-kurang sewenang-wenang metadata. Standar PNG mendefinisikan file PNG, pada dasarnya serangkaian potongan, beberapa di antaranya diperlukan (dan berisi data gambar). Namun, yang lain bersifat opsional. Misalnya, ada bongkahan untuk menyimpan informasi gamma atau data histogram.

Secara khusus, ada tEXtpotongan yang dapat digunakan untuk menyimpan pasangan teks kunci / nilai sewenang-wenang. Ini dapat digunakan untuk mengirim segala jenis data sewenang-wenang yang Anda inginkan, asalkan Anda dapat mewakili data tersebut sebagai teks (yang kemungkinan besar cukup).

Anda akan memerlukan pustaka PNG yang memungkinkan Anda mengakses dan memanipulasi potongan tambahan ini (seperti pustaka referensi ), atau Anda harus menulis sendiri. Maka itu hanya masalah memilih cara menyandikan data yang Anda inginkan sebagai pasangan kunci / nilai. Saya menyarankan yang berikut ini:

  • pilih nama-nama kunci yang diawali dengan nama proyek Anda atau nama kode sebagai cara untuk menciptakan sistem "namespace" kasar dan menghindari potensi konflik dengan penggunaan data aplikasi lainnya oleh aplikasi.
  • jangan mencoba menyimpan tekstur aktual dengan cara ini, simpan referensi ke tekstur yang mengarah ke dalam basis data aset gim Anda sendiri
  • data seperti makhluk atau ukuran objek, berat, dan lain-lain - skalar sederhana, pada dasarnya - dapat disimpan secara sepele

Untuk kepentingan membuat jawaban yang lebih lengkap, saya juga akan menunjukkan bahwa ada pendekatan lain (sebelumnya didokumentasikan oleh jawaban @Vaughn dan @ Alexis): menyandikan data tambahan yang Anda inginkan langsung dalam piksel gambar Anda, mendistribusikan data Anda ke seluruh bit orde rendah dari saluran warna. Pendekatan ini tidak memerlukan penggunaan metadata tambahan, yang berarti Anda dapat menerapkannya sepenuhnya tanpa bergantung padanya atau khawatir tentang program eksternal yang salah menangani metadata itu. Itu juga punya faktor "keren" yang sangat tinggi, dan karena Anda hanya menggunakan bit orde rendah gambar akan tetap terlihat benar bagi mata manusia. Namun, itu berarti ukuran gambar Anda adalah faktor pengendali utama untuk jumlah data yang dapat Anda simpan; jika Anda membutuhkan lebih banyak penyimpanan, Anda harus mengalokasikan lebih banyak piksel ke gambar.

Seperti yang telah ditunjukkan orang lain, proses ini dikenal sebagai steganografi .

Josh
sumber
3
Orang bisa mengirim data melalui Base64 dan menyimpannya sebagai nilai tunggal
CodesInChaos
11
@ da4c30ff Praktis seperti metadata, steganografi memiliki faktor keren mata-fantasi tertentu yang sulit ditolak oleh kerumunan kita. Jika saya melakukan ini sendiri, saya akan menggunakan metode yang diusulkan Josh Petrie untuk skalabilitas, tetapi saya akan sangat tergoda untuk menggunakan steganografi untuk menyembunyikan checksum dalam gambar itu sendiri untuk memverifikasi bahwa gambar dan teks saling memiliki - bukan karena ini berguna atau aman, tetapi hanya karena itu keren. ;)
DMGregory
Apa sebenarnya arti "teks" di sini? Hanya ASCII (karakter <= 127)? Setiap byte kecuali 0? Ada byte sama sekali? Atau sesuatu yang lain? (Ini akan memengaruhi pengodean yang perlu Anda gunakan untuk menulis data biner. Misalnya apakah Anda membutuhkan base64 atau tidak.)
svick
1
Saya memperbarui jawabannya dengan tautan ke standar untuk bungkusan teks; tetapi pada dasarnya, teks ditafsirkan sesuai ISO 8859-1 (8-bit, byte tunggal, karakter Latin-1).
Josh
51

Pengembang Monako sebenarnya membuat artikel yang bagus tentang bagaimana mereka dan Spore menyelesaikan ini.

Ringkasan dasar dari apa yang mereka lakukan cukup sederhana:

  • Ubah data Anda menjadi biner
  • Ubah gambar target Anda menjadi bitmap mentah
  • Berjalan di sepanjang piksel gambar dalam beberapa pola yang dapat diprediksi (mereka hanya melakukan kiri-ke-kanan dari sudut kiri atas).
  • Tulis satu bit ke bit urutan terendah dari setiap saluran warna setiap piksel
  • Ekspor bitmap yang dimodifikasi ke png lagi

Cukup lakukan ini secara terbalik untuk mengambil data Anda.

Ide dasar di balik proses ini adalah bahwa ada banyak piksel dalam gambar, dan bit urutan terendah dari setiap saluran warna tidak membuat perbedaan besar . Selain itu, sekitar setengah dari bit yang Anda tulis hanya akan menjadi apa yang ada pada gambar tersebut. Apa yang Anda dapatkan pada dasarnya adalah gambar yang tepat, tetapi dengan artefak aneh. Dia membutuhkan waktu untuk mencatat bahwa artefak ini hanya benar-benar terlihat jika Anda benar-benar mengubah kontras / saturasi dan memperbesar. Dia memang memiliki gambar sumber dengan banyak noise awal.

Dari artikel:

Perhatikan pada gambar terakhir bagaimana ada garis horizontal yang nyaris tidak terlihat dalam kebisingan. Itu adalah akhir dari level data. Artinya, saya benar-benar dapat memasukkan semua data level ke dalam gambar 265x120 piksel, hanya menggunakan bit yang paling tidak signifikan.

TAMBAHAN YANG BENAR-BENAR ADALAH:

Sesuatu yang bisa saya lakukan, dan saya percaya bahwa orang-orang Spore juga melakukannya, sebenarnya menggunakan SEMUA bit warna dalam piksel yang 100% transparan. Karena piksel-piksel itu transparan, tidak peduli warna apa yang Anda atur.

Saya tidak dapat melakukan ini, karena saya menggunakan seluruh gambar, yang berarti saya tidak memiliki piksel transparan untuk dikerjakan.

Mengapa memilih teknik ini daripada hanya menyimpannya di metadata?

  • Ini lebih menyenangkan! :)
  • Layanan dapat memecah metadata (mungkin sebagai fitur privasi / keamanan), tetapi tidak boleh mengacaukan piksel png Anda kecuali mereka memiliki persyaratan hosting gambar yang agresif (melihat Anda, facebook). Tetapi jika mereka benar-benar-ekspor ulang gambar Anda tidak ada yang andal dapat lakukan.

Kredit ekstra: untuk mengurangi kebisingan yang terlihat, Anda dapat menggunakan PRNG dengan seed tetap untuk memilih piksel yang akan dimodifikasi. Anda juga bisa hanya memodifikasi beberapa saluran warna dengan cara yang sama.

Alexis Beingessner
sumber
6
Ada algoritma steganografi yang lebih kuat terhadap penskalaan / penyesuaian warna daripada metode Monaco. (Meskipun mereka umumnya menyimpan data pada kepadatan yang jauh lebih rendah) Salah satu contoh adalah watermarking yang digunakan dalam screenshot World of Warcraft: ownedcore.com/forums/world-of-warcraft/…
DMGregory
@DMGregory Nice find! Algoritma tepat yang Anda pilih tentu saja harus diputuskan oleh usecase spesifik Anda (ruang, daya tahan, kerahasiaan, dll).
Alexis Beingessner
1
Sekeren ini kedengarannya, itu ide yang buruk. Gambar PNG menggunakan kompresi gambar lossless ; mengutak-atik bit gambar yang rendah kemungkinan akan membuat file lebih besar pada saat yang sama (sedikit) mengurangi kualitas gambar. Benar-benar semua informasi dapat dikodekan sebagai "teks", jadi menggunakan potongan metadata adalah cara yang jelas-benar untuk melakukan ini; seseorang mengutak-atik bit gambar tanpa benar-benar membutuhkan steganografi hanya bermunculan roda.
dfeuer
1
@dfeuer - Rupanya baik Spore dan Monako menggunakan kerangka kerja game yang memiliki pipa pemuatan aset yang menghapus .PNG menjadi bitmap kosong, jadi bidak metadata tidak berhasil menembusnya.
Russell Borogove
1
@ PDFeuer saya melakukan beberapa tes naif. Pendekatan metadata tampaknya menambahkan sekitar 80% dari ukuran yang ditambahkan oleh pendekatan stenografis saat menulis 100 kB bit acak ke gambar 1920x1080px. Diuji pada gambar kosong dan tangkapan layar desktop. Bukan perbedaan yang sangat besar, tetapi meatadata tentu lebih baik (dan lebih konsisten) jika Anda benar-benar khawatir lebih dari 40kB. Perhatikan bahwa metadata masih sangat tidak efisien. Saya memperoleh 181kB untuk menulis 100kB data! Bisa jadi ruang untuk mengoptimalkan bagaimana string dikodekan atau apalah.
Alexis Beingessner
7

Saya mengunduh dan memeriksa beberapa makhluk Spore dari Sporepedia. Dari yang saya pelajari itu:

  • Gambar tidak mengandung informasi selain data gambar standar.
  • Data stenografi telah disimpan tanpa mempertimbangkan gambar, orang dapat membayangkan bahwa bagian transparan digunakan secara eksklusif, tetapi tidak.
  • Penggunaan penyimpanan tergantung pada jumlah informasi yang perlu disimpan, beberapa gambar hanya menggunakan bit paling tidak signifikan untuk penyimpanan data, beberapa menggunakan dua bit paling tidak signifikan, beberapa mungkin menggunakan lebih banyak.
  • Format Spore menghindari penggunaan sedikit pada hanya bagian dari gambar, perubahan bit paling signifikan di seluruh gambar, jika bit paling signifikan kedua digunakan, itu digunakan pada seluruh gambar. Ini mungkin dilakukan menggunakan padding acak. Ini menghindari pergeseran kualitas yang mungkin lebih mengganggu bagi pemirsa daripada kebisingan itu sendiri.
  • Keempat saluran digunakan secara sama, saluran opacity tidak diberi perlakuan khusus, sehingga beberapa piksel transparan sedikit buram sementara beberapa piksel buram sedikit transparan.

Perlu dicatat bahwa ini adalah apa yang Spore lakukan, ini adalah metode yang mengutamakan kesederhanaan di sebagian besar masalah lainnya.

Pilihan menggunakan stenografi daripada blok data tambahan berarti bahwa data akan bertahan jika gambar disandikan ulang, misalnya oleh situs web, meskipun itu tidak akan selamat dari penskalaan atau kompresi Jpeg.

Saya berpikir bahwa alternatif yang paling menonjol sebenarnya adalah hanya menyandikan id dalam gambar, dan membiarkan data aktual disimpan di server pusat di mana id ini dapat ditukar dengan data makhluk yang tepat. Id semacam itu akan cukup pendek sehingga bisa dikodekan dalam format stenografi penskalaan dan toleran.

Kemungkinan peningkatan sederhana pada format Spore meliputi:

  • Gunakan saja atau lebih suka menggunakan nilai warna piksel transparan, mereka tidak membuat perbedaan visual.
  • Gunakan saluran biru lebih banyak dan saluran hijau lebih sedikit, warna biru memiliki dampak persepsi yang lebih rendah pada gambar.
  • Menjaga agar setiap piksel tetap tidak berubah dan menyandikan data dalam kroma, sedikit noise dalam parameter ini hampir tidak terdeteksi oleh manusia.
aaaaaaaaaaaa
sumber