मैं एक प्रोग्राम पर काम कर रहा हूं जो एक स्ट्रिंग लेता है, स्ट्रिंग के प्रत्येक चरित्र को रंग में बदल देता है, फिर रंगों को बाएं से दाएं, एक छवि में ऊपर-नीचे खींचता है। मूल संदेश को वापस पाने के लिए छवि को उसी प्रोग्राम का उपयोग करके डीकोड किया जा सकता है। उदाहरण के लिए, यहाँ clojure.core
है एक छवि के रूप में एन्कोड:एक तस्वीर के रूप में एक स्ट्रिंग एन्कोडिंग संपीड़न
मैं सिर्फ एक खिलौना के रूप में यह लिखा है, लेकिन मैं छवियों का एक दिलचस्प संपत्ति देखा कि यह पैदा करता है: वे छोटे से मूल संदेशों थे कर रहे हैं पाठ के रूप में clojure.core
के लिए, यह टेक्स्ट के रूप में 25 9 केबी है, लेकिन एक छवि (ऊपर) के रूप में केवल 88.9 केबी (दोनों मान "डिस्क पर आकार" हैं)। यह सुनिश्चित करने के लिए कि डेटा खो नहीं जा रहा था, मैंने छवि को डीकोड किया, और मूल संदेश वापस प्राप्त किया।
यह कैसे संभव है? मुझे लगता है कि छवि (png
प्रारूप) में शीर्षलेख और अन्य अतिरिक्त जानकारी होगी जो आकार को बढ़ाएगी।
संपूर्ण clojure.core
में 265486 वर्ण (नोटपैड ++ के अनुसार) शामिल हैं, जिसका अर्थ है कि प्रत्येक वर्ण मूल रूप से बाइट ले रहा है।
BufferedImage
कक्षा (जावा) के साथ काम करने से, ऐसा लगता है कि रंग 4-बाइट पूर्णांक के रूप में संग्रहीत हैं, इसलिए प्रत्येक पिक्सेल को ~ 4x स्मृति की आवश्यकता नहीं है?
यह ऐसे एन्कोड किया:
स्ट्रिंग के प्रथम वर्ण
यह हो रही है यह ASCII मूल्य है, एक बड़ी संख्या में यह गुणा करके एक रंग में अनुवाद किया है बंद पॉप जाता है (क्योंकि यह संभावित रंगों की सीमा को बेहतर तरीके से कवर करता है), फिर उस संख्या को 3 अंकों में परिवर्तित किया जाता है, आधार 256 संख्या (
[123 100 200]
)।प्रत्येक अंक को लाल, हरे और नीले चैनल के रूप में माना जाता है, जो
BufferedImage
कीsetRGB
विधि को दिया जाता है।position
सूचक उन्नत है, अगला चरित्र पॉप हो गया है, और प्रक्रिया पूरी तरह से एन्कोड होने तक दोहराई जाती है।
एल्गोरिदम अभी थोड़ा छोटा है। @ थंबनेल ने कोड समीक्षा पर एक बेहतर तरीका सुझाया, लेकिन मैंने अभी तक इसे लागू नहीं किया है। चूंकि परिणाम समान हैं, इसलिए इस प्रश्न के लिए कोई फर्क नहीं पड़ता है।
हालांकि उत्तर कुछ हद तक स्पष्ट था, फिर भी मुझे आपके निष्कर्षों के बारे में पढ़ने का आनंद मिला। इस तरह की चीजें भरना हमेशा मजेदार होता है। –