2017-01-22 7 views
7

मैं एक प्रोग्राम पर काम कर रहा हूं जो एक स्ट्रिंग लेता है, स्ट्रिंग के प्रत्येक चरित्र को रंग में बदल देता है, फिर रंगों को बाएं से दाएं, एक छवि में ऊपर-नीचे खींचता है। मूल संदेश को वापस पाने के लिए छवि को उसी प्रोग्राम का उपयोग करके डीकोड किया जा सकता है। उदाहरण के लिए, यहाँ clojure.core है एक छवि के रूप में एन्कोड:एक तस्वीर के रूप में एक स्ट्रिंग एन्कोडिंग संपीड़न

Clojure.core encoded as an image

मैं सिर्फ एक खिलौना के रूप में यह लिखा है, लेकिन मैं छवियों का एक दिलचस्प संपत्ति देखा कि यह पैदा करता है: वे छोटे से मूल संदेशों थे कर रहे हैं पाठ के रूप में clojure.core के लिए, यह टेक्स्ट के रूप में 25 9 केबी है, लेकिन एक छवि (ऊपर) के रूप में केवल 88.9 केबी (दोनों मान "डिस्क पर आकार" हैं)। यह सुनिश्चित करने के लिए कि डेटा खो नहीं जा रहा था, मैंने छवि को डीकोड किया, और मूल संदेश वापस प्राप्त किया।

यह कैसे संभव है? मुझे लगता है कि छवि (png प्रारूप) में शीर्षलेख और अन्य अतिरिक्त जानकारी होगी जो आकार को बढ़ाएगी।

संपूर्ण clojure.core में 265486 वर्ण (नोटपैड ++ के अनुसार) शामिल हैं, जिसका अर्थ है कि प्रत्येक वर्ण मूल रूप से बाइट ले रहा है।

BufferedImage कक्षा (जावा) के साथ काम करने से, ऐसा लगता है कि रंग 4-बाइट पूर्णांक के रूप में संग्रहीत हैं, इसलिए प्रत्येक पिक्सेल को ~ 4x स्मृति की आवश्यकता नहीं है?

यह ऐसे एन्कोड किया:

  1. स्ट्रिंग के प्रथम वर्ण

  2. यह हो रही है यह ASCII मूल्य है, एक बड़ी संख्या में यह गुणा करके एक रंग में अनुवाद किया है बंद पॉप जाता है (क्योंकि यह संभावित रंगों की सीमा को बेहतर तरीके से कवर करता है), फिर उस संख्या को 3 अंकों में परिवर्तित किया जाता है, आधार 256 संख्या ([123 100 200])।

  3. प्रत्येक अंक को लाल, हरे और नीले चैनल के रूप में माना जाता है, जो BufferedImage की setRGB विधि को दिया जाता है।

  4. position सूचक उन्नत है, अगला चरित्र पॉप हो गया है, और प्रक्रिया पूरी तरह से एन्कोड होने तक दोहराई जाती है।

एल्गोरिदम अभी थोड़ा छोटा है। @ थंबनेल ने कोड समीक्षा पर एक बेहतर तरीका सुझाया, लेकिन मैंने अभी तक इसे लागू नहीं किया है। चूंकि परिणाम समान हैं, इसलिए इस प्रश्न के लिए कोई फर्क नहीं पड़ता है।

+2

हालांकि उत्तर कुछ हद तक स्पष्ट था, फिर भी मुझे आपके निष्कर्षों के बारे में पढ़ने का आनंद मिला। इस तरह की चीजें भरना हमेशा मजेदार होता है। –

उत्तर

7

पोर्टेबल नेटवर्क ग्राफिक्स (पीएनजी) एक रास्टर ग्राफिक्स फ़ाइल प्रारूप है जो लापरवाही डेटा संपीड़न (https://en.wikipedia.org/wiki/Portable_Network_Graphics से) का समर्थन करता है, iow। .png फ़ाइल के रूप में संग्रहीत होने पर छवि डेटा संपीड़ित किया जाता है।

+0

दोह। वैसे यह पीछे की ओर स्पष्ट है। धन्यवाद। – Carcigenicate

+0

शायद यह उल्लेखनीय है कि पीएनजी ज़्लिब/डिफ्लेट संपीड़न का उपयोग करता है (और आपको टेक्स्ट फ़ाइल पर सीधे डिफ्लेट का उपयोग करके बेहतर परिणाम मिलेंगे)। – haraldK

+0

@haraldK जो मेरी अपेक्षा भी होगी। डिफ्लेट करने के अलावा, पीएनजी एक प्री-पास करता है जो "असली" छवियों के संपीड़न में मदद करता है (जहां एक पिक्सेल, सांख्यिकीय रूप से, अपने पड़ोसी पिक्सेल की तरह दिखता है)। आप संभवतः रंगों को चुनकर इसका लाभ उठा सकते हैं जो एक दूसरे के करीब हैं (इस प्रकार बेहतर पीएनजी संपीड़न हो रहा है)।असंबद्ध रूप से, संभवतः एक से अधिक वर्ण प्रति पिक्सेल एन्कोडिंग करके छोटे आयाम छवियों को बनाने के लिए संभव है (सच्चा रंग + अल्फा पीएनजी छवियां 64 बिट्स प्रति पिक्सेल का उपयोग करती हैं) - यह संभवतया संपीड़ित नहीं होने की संभावना है। – thebjorn

संबंधित मुद्दे