Oyun meta verilerini bir .png dosyasında nasıl saklayabilirim?


208

Spore, oyuncu tarafından yaratılan yaratıkların bir .pngdosyayı dışa aktararak paylaşmasını sağlar . Bu .png, yaratığın bir fotoğrafı, ancak oyuna aktarılırsa, yaratığın bilgisi de (dokular, boyut ve şekil gibi) onunla birlikte gelir.

Böyle bir özelliği nasıl uygulayabilirim?


5
Çok daha yüksek bir puan almalı, bu çok ilginç bir soru.
Pierre Arlaud

3
Alfa kanalı bunun için kısmen suistimal edilebilir ...
Tobias Kienzler


1
Bence bu verileri başka bir dosyada saklamak daha iyi. Bu dosyada, verilerin depolanmasını istediğiniz varlık ile ilgili doku dosyasının adı bulunmalıdır. Öncelikle açıklık uğruna (png formatı grafik içindir - "Taşınabilir Ağ Grafiği"), ikincisi: Bir varlık ile daha fazla görüntü saklamak istediğiniz bir durumu düşünün, sadece o özel dosyadan referanslar ekleyebilirsiniz. Muhtemelen farklı bir görüntüyü (farklı boyutta, farklı derinlik vb.) Bir PNG'de saklamakta sorun yaşayacaksınız.
luke1985

3
Alfa kanalından çok fazla bahsedildi ve elbette PNG'ler yine de meta verileri destekliyor, ancak sadece kullandığım bir tekniği paylaşacağımı düşündüm - soldan sağa, yukarıdan aşağıya ve kanallar boyunca sabit bir sırayla ilerliyordum ve değerleri oranlara ya da eşimlere yuvarlamak - yukarı ya da aşağı olması önemli değil. Kanalların HERHANGİ 1'inde bir değişiklik göze çarpan bir fark yaratmaz ve 256x256 görüntüde (elbette piksel başına 4 bit), etkileyici bir 32 KB veri saklayabilirsiniz. Daha fazlasına ihtiyacınız olursa, bunun yerine% 4'e yuvarlayabilirsiniz - çok fazla ve eski bir GIF aklı gibi görünmeye başlar ..
Octopoid

Yanıtlar:


56

Gerçekte ihtiyaç duyduğunuz tek şey PNG dosyasıysa, olasılıklar bilgileri basitçe dosyaya eklemiş olmalarıdır. Bu aslında bir Steganography uygulamasıdır . Çoğu zaman, bu halka açık görünen şeylerde yükleri veya gizli mesajları gizlemek için kullanılır. Ancak, bu durumda bu yöntemin kullanılmış olması muhtemeldir. Tipik Stegongrafi içeriği gizleme yolundan çıkar, ancak dosyanın sonundaki görüntüyü verileri basitçe ekleyememek ve almak için bir neden yoktur.

Birkaç araç bu verileri sizin için kodlar, google araması en azından bunu ve bunu getirir .

Bir PNG $89başlangıçta bayt imzasına sahiptir , bu nedenle PNG yapısının kendisinden sonra bilginin eklenmesi ve SPORE oyunu tarafından basitçe ayrıştırılması mümkündür.

Bununla birlikte, diğer cevaplar ve google'da yapılan bir araştırma ile verilen daha fazla araştırma, Spore'un alfa bitlerindeki bilgiyi gizlemek için aslında yalnızca bir Stegongraphy sürümünü kullandığını ortaya koyuyor. Bunu akılda tutarak, eklenen veri veya meta-veri olasılığını ekarte edebiliriz.

Veriler yerel olarak ayrıştırılıyorsa , meta verilerin hala çok uygun bir seçenek olduğu unutulmamalıdır . Bu bilgiler web’de paylaşılabilir veya yeniden kodlanmışsa, tüm bilgilerin saklanabileceği dışa aktarma garantisi verilmez. Piksel verileri kullanıldığında, bir sorun olmadan kayıpsız dönüşümlere dayanabilir.


3
Bildiğim kadarıyla, PNG'nin alfa kanalının içinde depolanmış meta verileri.
Tara,

28
PNG keyfi meta veri parçalarını desteklerken neden alfa kanalı veya steganografi kullanıyorsunuz?
Russell Borogove

8
“PNG başlangıçta" 89 "bayt imzasına sahiptir, bu yüzden bilgilerin PNG yapısının kendisinden önce veya sonra eklenmesi ve SPORE oyunu tarafından basitçe ayrıştırılması çok muhtemeldir. Artık bir PNG dosyası olmayın. Diğer bir deyişle, genel resim görüntüleyiciler onu görüntüleyemez.
svick

3
@RussellBorogove oldukça iyi bir neden: PNG Spore dışında bir şey tarafından kodu çözülürse / kodlanırsa, rastgele meta veri parçalarının gerçek görüntü verilerinden yok sayılması veya kaybolması daha olasıdır. Görüntüdeki verilerin kodlanması, eğer görebiliyorsanız yükleyebilme olasılığınızı arttırır .
Tim S.

@svick Aslında, hem geçerli bir PNG hem de RAR olan bir dosyayla oynadım. RAR başlığı PNG'den sonra başladı ve RAR özütleri iyi idi. Başka şekilde de işe yarayabilir.
kortlar

153

PNG formatı daha çok ya da daha az keyfi meta veri desteği vardır. PNG standardında bir PNG dosyası, gerekli (ve resim verileri içeren) bazıları topakları, esas olarak, bir dizi tanımlar. Ancak diğerleri isteğe bağlıdır. Örneğin, gama bilgilerini veya histogram verilerini depolamak için bir yığın var.

Özellikle, isteğe bağlı anahtar / değer metin çiftlerini depolamak için kullanılabilecek bir tEXtyığın var. Bu, istediğiniz veriyi metin olarak gösterebilmeniz koşuluyla (oldukça muhtemel), istediğiniz herhangi bir keyfi veriyi göndermek için kullanılabilir.

Bu ek parçalara ( referans kitaplığı gibi ) erişmenize ve bunları kullanmanıza izin veren bir PNG kitaplığına ihtiyacınız olacak veya kendiniz yazmanız gerekecektir. Öyleyse, istediğiniz verilerin anahtar / değer çiftleri olarak nasıl kodlanacağının seçilmesi meselesidir. Aşağıdakileri öneririm:

  • kaba bir "ad alanı" sistemi oluşturmanın bir yolu olarak projenizin adı veya kod adı ile önceden belirlenmiş anahtar adları seçin ve diğer uygulamaların verileri kullanmasıyla olası çakışmalardan kaçının
  • depolamak kalkmayın gerçek oyununuzun kendi varlık veritabanı içinde işaret bu dokular dokular bu şekilde, mağaza referansları
  • Yaratık veya nesne büyüklüğü, ağırlık, vb. - basit skalarlar gibi temel bilgiler - temel olarak saklanabilir

Daha eksiksiz bir cevap vermek için ayrıca, daha önce başka bir yaklaşımın olduğuna dikkat çekeceğim (daha önce @Vaughn ve @ Alexis'in cevaplarıyla belgelenmiştir): İstediğiniz ek veriyi doğrudan görüntü piksellerinize dağıtıp verilerinizi dağıtarak renk kanallarının düşük sıra bitleri. Bu yaklaşım, fazladan meta veri kullanılmasını gerektirmez; bu, tamamen buna güvenmeden veya bu meta verileri yanlış kullanan harici programlar hakkında endişelenmeden uygulayabileceğiniz anlamına gelir. Aynı zamanda çok yüksek bir "harika" faktörü var ve sadece düşük dereceli bit kullandığınız için görüntü insan gözüne hala düzgün gözüküyor. Bununla birlikte, görüntü boyutunuzun saklayabileceğiniz veri miktarı için birincil kontrol faktörü olduğu anlamına gelir; daha fazla depolama alanına ihtiyacınız varsa, görüntüye daha fazla piksel ayırmanız gerekir.

Diğerlerinin de belirttiği gibi, bu süreç steganografi olarak bilinir .


3
Bir basitçe verileri Base64 aracılığıyla gönderebilir ve tek bir değer olarak saklayabilir
CodesInChaos

11
@ da4c30ff Metadata kadar pratik olduğu gibi, steganografide kalabalığımızın direnmesi zor olan bazı casus-fantazi harika bir etken vardır. Bunu kendim yapıyor olsaydım, Josh Petrie'nin ölçeklenebilirlik için önerilen yöntemini kullanırdım, ancak görüntünün ve metnin birbirine ait olduğunu doğrulamak için görüntünün kendisinde bir sağlama toplamı gizlemek için steganografiyi kullanmaya özen gösterdim - çünkü bu kullanışlı ya da güvenli, ancak sadece havalı olduğu için. ;)
DMGregory

“Metin” burada tam olarak ne anlama geliyor? Sadece ASCII (karakter <= 127)? 0 dışında herhangi bir bayt var mı? Hiç bayt var mı? Veya başka bir şey? (Bu, ikili veri yazmak için kullanmanız gereken kodlamayı etkileyecektir. Örneğin,
base64'e

1
Yanıtı metin öbeğinin standardına bir bağlantıyla güncelledim; ancak temelde, metin ISO 8859-1'e göre yorumlanır (8 bit, tek bayt, Latin-1 karakter).
Josh

51

Monaco'nun geliştiricisi aslında hem Spore'un hem de Spore'un bunu nasıl başardıklarına dair mükemmel bir yazı yaptı .

Yaptıklarının temel özeti oldukça basittir:

  • Verilerinizi ikiliye dönüştürün
  • Hedef resminizi ham bir bitmap'e dönüştürün
  • Görüntünün pikselleri boyunca tahmin edilebilir bir düzende yürüyün (sol üst köşeden soldan sağa doğru giderler).
  • Her bir pikselin her bir renk kanalının en düşük sipariş bitine bir bit yaz
  • Değiştirilen bitmap'i tekrar png'ye aktar

Verilerinizi almak için bunu tersten yapın.

Sürecin arkasındaki temel fikir , görüntüde çok fazla piksel olduğu ve her renk kanalının en düşük sıra bitlerinin büyük bir fark yaratmadığıdır. Ek olarak, yazdığınız bitlerin yaklaşık yarısı resimdeki bitin aynısı olacaktır. Geri aldığınız şey aslında doğru görüntü, ama tuhaf eserler. Bu yapıtların yalnızca gerçekten kontrast / doygunluğu krankladığınızda ve yakınlaştırdığınızda gerçekten farkedilir olduğunu not etmek zaman alır.

Makaleden:

Son resimde, gürültüde zar zor ayırt edilebilir bir yatay çizgi olduğuna dikkat edin. Bu seviye verilerinin sonu. Bunun anlamı, tüm seviye verilerini 265x120 piksel görüntüye sığdırabilmem, sadece en az anlamlı bit kullanarak.

TRICKY BİR EK

Yapabileceğim bir şey ve Spore milletinin de yaptığını düşünüyorum, aslında% 100 saydamlıktaki piksellerde TÜM renk bitlerini kullanmak olduğuna inanıyorum. Bu pikseller saydam olduğundan, onları hangi renge ayarladığınız önemli değildir.

Ancak bunu yapamam, çünkü görüntünün tamamını kullanıyorum, yani çalışacak şeffaf piksellerim yok.

Neden bu tekniği metadata saklamak yerine tercih ettin?

  • Bu eğlenceli! :)
  • Servisler meta verileri (muhtemelen bir gizlilik / güvenlik özelliği olarak) karışabilir, ancak agresif görüntü barındırma gereksinimleri olmadıkça (size, facebook'a bakmadan) png'ınızın piksellerini düzenlememelidir. Ancak resminizi tamamen yeniden veriyorlarsa , yapabileceğiniz hiçbir şey yoktur.

Ekstra kredi: Gürültü fark edilebilirliğini azaltmak için, değiştirilecek pikselleri seçmek için sabit tohumlu bir PRNG kullanabilirsiniz. Ayrıca bazı renk kanallarını yalnızca benzer şekilde değiştirebilirsiniz.


6
Monako yöntemine göre görüntü ölçeklendirme / renk ayarına karşı daha sağlam olan steganografik algoritmalar vardır. (Genellikle verileri oldukça düşük bir yoğunlukta depolasalar da
DMGregory

@DMGregory Güzel bul! Seçtiğiniz kesin algoritmaya elbette kendi özel temanız (alan, dayanıklılık, gizlilik vb.) Karar verilmelidir.
Alexis Beingessner

1
Bu kulağa ne kadar havalı gelse de, kötü bir fikir. PNG görüntüleri kayıpsız görüntü sıkıştırma kullanır; Görüntünün düşük bitleriyle uğraşmak, dosyayı görüntü kalitesini düşürürken (biraz) aynı anda daha büyük yapar . Kesinlikle herhangi bir bilgi "metin" olarak kodlanabilir, bu nedenle bir meta veri öbeği kullanmak, bunu yapmanın açıkça doğru yoludur; steganografiye ihtiyaç duymadan görüntü parçalarını kuran birileri sadece bir tek yere atıyor.
dfeuer

1
@dfeuer - Görünüşe göre hem Spore hem de Monaco .PNG'yi çıplak bir bitmap'e indiren bir varlık yükleme boru hattına sahip oyun çerçevelerini kullanıyorlardı, bu yüzden meta veri parçaları bunu yapmıyordu.
Russell Borogove

1
@ dfeuer Bazı saf testler yaptım. Meta veri yaklaşımı, 1920x1080 piksel görüntüsüne 100kB rasgele bit yazarken stenografik yaklaşım tarafından eklenen boyutun yaklaşık% 80'ini ekliyor gibi görünüyor. Boş bir resim ve masaüstü ekran görüntüsünde test edilmiştir. Tam olarak feci bir fark değil, ancak 40kB üzerinde gerçekten endişeliyseniz meatadata kesinlikle daha iyi (ve daha tutarlı). Meta verilerin hala oldukça yetersiz olduğunu unutmayın. 100kB veri yazmak için 181kB kazandım! Dizenin nasıl kodlandığını optimize etmek için yer olabilir.
Alexis Beingessner,

7

Sporepedia'dan birkaç Spore yaratığını indirdim ve inceledim. Bunlardan öğrendim:

  • Görüntüler standart resim verilerine ek olarak bilgi içermez.
  • Stenografik veriler, görüntü dikkate alınmadan kaydedilmiş olup, saydam parçaların özel olarak kullanıldığını ancak bunların kullanılmadığını düşünebiliriz.
  • Depolama kullanımı, depolanması gereken bilgi miktarına, görüntülerin bazıları veri depolama için yalnızca en az anlamlı bit, bazıları ise en az iki önemli bit kullandı, bazıları daha fazlasını kullanabilir.
  • Spore formatı görüntünün sadece bir kısmında bir bit kullanmaktan kaçınır, en az önemli olan bit bütün görüntü boyunca değişir, eğer en az ikinci önemli bit kullanılırsa, o bütün görüntünün üzerinde kullanılır. Bu muhtemelen rastgele dolgu kullanılarak yapılır. Bu, izleyicide gürültünün kendisinden daha rahatsız edici olabilecek kalitede bir kaymayı önler.
  • Dört kanalın tümüne eşit olarak kullanılır, opaklık kanalına özel bir işlem uygulanmaz, bu nedenle bazı saydam pikseller biraz opakken bazı opak pikseller biraz saydamdır.

Bunun Spore'un yaptığı gibi bir şey olduğunu belirtmekte fayda var, diğer kaygıların önüne basitlik getiren bir yöntem.

Ek bir veri bloğu yerine stenografi kullanma seçimi, örneğin bir web sitesi tarafından görüntü yeniden kodlandığında verilerin ölçeklendirilmesinde veya Jpeg sıkıştırmasında hayatta kalmamasına rağmen verilerin hayatta kalacağı anlamına gelir.

En belirgin alternatifin aslında yalnızca görüntüdeki bir kimliği kodlamak olduğunu ve gerçek verinin, bu kimliğin gerçek yaratık verileriyle değiştirilebileceği merkezi bir sunucuda saklanmasını sağlamak olduğunu düşünüyorum. Böyle bir id, ölçeklendirme ve sıkıştırmaya toleranslı stenografi formatında kodlanabilecek kadar kısa olacaktır.

Spore formatındaki olası basit iyileştirmeler şunları içerir:

  • Yalnızca kullanın veya saydam piksellerin renk değerlerini kullanmayı tercih edin, görsel bir fark yaratmazlar.
  • Mavi kanalı daha çok kullanın ve yeşil kanalı daha az kullanın, mavi rengin görüntü üzerinde algılanan etkisi daha düşüktür.
  • Her pikselin parlaklığını değiştirilmeye yakın tutmak ve verileri kromatografide kodlamak, bu parametrede az miktarda bir gürültü insanlar için neredeyse tespit edilemez.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.