ट्विटर छवि एन्कोडिंग चुनौती [बंद]


597

यदि किसी चित्र की कीमत 1000 शब्दों की है, तो आप 140 वर्णों में से कितनी तस्वीर फिट कर सकते हैं?

नोट : यही तो है लोग! बाउंटी की समय सीमा यहां है, और कुछ कठिन विचार-विमर्श के बाद, मैंने फैसला किया है कि बोयम की प्रविष्टि सैम हूसेवर की मुश्किल से ही निकली है । एक बार जब मैंने उन्हें लिखने का मौका दिया तो मैं और अधिक विस्तृत नोट्स पोस्ट करूंगा। बेशक, हर किसी को समाधान प्रस्तुत करना जारी रखना चाहिए और लोगों को वोट देने के लिए समाधान में सुधार करना चाहिए। सभी को धन्यवाद जिन्होंने प्रस्तुत किया और प्रवेश किया; मैंने उन सभी का आनंद लिया। मुझे दौड़ने में बहुत मज़ा आया है, और मुझे उम्मीद है कि यह प्रवेशकों और दर्शकों दोनों के लिए मजेदार रहा है।

मैं इस दिलचस्प पोस्ट के बारे में एक ट्विटर टिप्पणी में छवियों को संपीड़ित करने की कोशिश कर रहा था , और उस धागे में बहुत से लोगों (और Reddit पर एक धागा ) के पास विभिन्न तरीकों के बारे में सुझाव थे जो आप कर सकते थे। इसलिए, मुझे लगता है कि यह एक अच्छी कोडिंग चुनौती होगी; लोगों को अपना पैसा जहां उनका मुंह है, वहां रहने दें और यह बताएं कि एन्कोडिंग के बारे में उनके विचारों को आपके द्वारा उपलब्ध सीमित स्थान पर अधिक विस्तार हो सकता है।

मैं आपको चुनौती देता हूं कि चित्रों को 140 वर्णों के ट्विटर संदेशों में एन्कोडिंग के लिए एक सामान्य उद्देश्य प्रणाली के साथ आएं, और उन्हें फिर से एक छवि में डिकोड करें। आप यूनिकोड वर्णों का उपयोग कर सकते हैं, इसलिए आपको प्रति वर्ण 8 बिट से अधिक मिलता है। यहां तक ​​कि यूनिकोड वर्णों के लिए अनुमति देना, हालांकि, आपको बहुत कम मात्रा में अंतरिक्ष में छवियों को संपीड़ित करने की आवश्यकता होगी; यह निश्चित रूप से एक हानिपूर्ण संपीड़न होगा, और इसलिए प्रत्येक परिणाम कितना अच्छा दिखता है, इसके बारे में व्यक्तिपरक निर्णय लेना होगा।

यहां यह परिणाम है कि मूल लेखक, क्वासिमोंडो को उनके एन्कोडिंग से प्राप्त हुआ (छवि एक क्रिएटिव कॉमन्स एट्रीब्यूशन- नॉन-कमर्शियल लाइसेंस के तहत लाइसेंस प्राप्त है ): मोना लीसा

क्या आप बेहतर कर सकते हैं?

नियम

  1. आपके प्रोग्राम में दो मोड होने चाहिए: एन्कोडिंग और डिकोडिंग
  2. जब एन्कोडिंग :
    1. आपके कार्यक्रम को अपनी पसंद के किसी भी उचित रेखापुंज ग्राफिक प्रारूप में एक ग्राफिक के रूप में लेना चाहिए । हम कहेंगे कि ImageMagick द्वारा समर्थित कोई भी रेखापुंज प्रारूप उचित है।
    2. आपके कार्यक्रम को एक संदेश का उत्पादन करना चाहिए जिसे 140 या उससे कम यूनिकोड कोड बिंदुओं में दर्शाया जा सकता है; रेंज में 140 कोड अंक U+0000- U+10FFFF, गैर पात्रों को छोड़कर ( U+FFFE, U+FFFF, U+एनFFFE , U+एनFFFF जहां n है 1- 10हेक्साडेसिमल, और सीमा U+FDD0- U+FDEF) और सरोगेट कोड अंक ( U+D800- U+DFFF)। यह आपकी पसंद के किसी भी उचित एन्कोडिंग में आउटपुट हो सकता है; GNUiconv द्वारा समर्थित किसी भी एन्कोडिंग को उचित माना जाएगा, और आपके प्लेटफ़ॉर्म देशी एन्कोडिंग या लोकेल एन्कोडिंग संभवतः एक अच्छा विकल्प होगा। देखें यूनिकोड नोट अधिक जानकारी के लिए नीचे दिए गए।
  3. जब डीकोडिंग :
    1. आपके प्रोग्राम को आपके एन्कोडिंग मोड के आउटपुट के रूप में लेना चाहिए ।
    2. आपके कार्यक्रम को अपनी पसंद के किसी भी उचित प्रारूप में एक छवि आउटपुट करना चाहिए, जैसा कि ऊपर परिभाषित किया गया है, हालांकि आउटपुट वेक्टर प्रारूप ठीक भी हैं।
    3. छवि आउटपुट इनपुट छवि का एक अनुमान होना चाहिए; आप इनपुट छवि के जितना करीब होंगे, उतना बेहतर होगा।
    4. डिकोडिंग प्रक्रिया में उपरोक्त निर्दिष्ट आउटपुट के अलावा एन्कोडिंग प्रक्रिया के किसी अन्य आउटपुट तक कोई पहुंच नहीं हो सकती है; अर्थात्, आप कहीं भी छवि अपलोड नहीं कर सकते और डाउनलोड करने के लिए डिकोडिंग प्रक्रिया के लिए URL को आउटपुट कर सकते हैं, या ऐसा कुछ भी मूर्खतापूर्ण।
  4. उपयोगकर्ता इंटरफ़ेस में स्थिरता के लिए, आपके कार्यक्रम को निम्नानुसार व्यवहार करना चाहिए:

    1. आपका कार्यक्रम एक स्क्रिप्ट होना चाहिए जिसे उचित दुभाषिया के साथ एक मंच पर निष्पादन योग्य पर सेट किया जा सकता है, या एक कार्यक्रम जिसे एक निष्पादन योग्य में संकलित किया जा सकता है।
    2. आपके प्रोग्राम को इसके पहले तर्क के रूप में encodeया decodeमोड सेट करने के लिए लेना चाहिए ।
    3. आपके प्रोग्राम को निम्न में से एक या अधिक तरीकों से इनपुट लेना चाहिए (यदि आप फ़ाइल नाम लेने वाले को लागू करते हैं, तो आप स्टड से भी पढ़ और लिख सकते हैं और यदि फ़ाइल के नाम गायब हैं तो)

      1. मानक से इनपुट लें और मानक आउट पर आउटपुट का उत्पादन करें।

        my-program encode <input.png >output.txt
        my-program decode <output.txt >output.png
        
      2. दूसरे तर्क में दर्ज फ़ाइल से इनपुट लें, और तीसरे नाम की फ़ाइल में आउटपुट का उत्पादन करें।

        my-program encode input.png output.txt
        my-program decode output.txt output.png
        
  5. अपने समाधान के लिए, कृपया पोस्ट करें:
    1. आपका कोड, पूर्ण, और / या किसी लिंक को कहीं और होस्ट किया गया है (यदि यह बहुत लंबा है, या संकलन करने के लिए कई फ़ाइलों की आवश्यकता है, या कुछ और)।
    2. यह कैसे काम करता है, इसकी एक व्याख्या, यदि यह कोड से तुरंत स्पष्ट नहीं है या यदि कोड लंबा है और लोगों को एक सारांश में रुचि होगी।
    3. एक उदाहरण छवि, मूल छवि के साथ, यह पाठ को संकुचित करता है और डिकोड की गई छवि।
    4. यदि आप किसी ऐसे विचार पर निर्माण कर रहे हैं जो किसी और के पास था, तो कृपया उन्हें विशेषता दें। किसी अन्य व्यक्ति के विचार को परिष्कृत करने की कोशिश करना ठीक है, लेकिन आपको उन्हें अवश्य देखना चाहिए

दिशा-निर्देश

ये मूल रूप से नियम हैं जिन्हें तोड़ा जा सकता है, सुझाव, या स्कोरिंग मानदंड:

  1. सौंदर्यशास्त्र महत्वपूर्ण हैं। मैं जज बनूंगा, और सुझाव दूंगा कि दूसरे लोग जज हों:
    1. आउटपुट छवि कितनी अच्छी दिखती है, और यह मूल की तरह कितना दिखता है।
    2. पाठ कितना अच्छा लग रहा है। पूरी तरह से यादृच्छिक gobbledigook ठीक है अगर आपके पास वास्तव में एक चतुर संपीड़न योजना है, लेकिन मैं उन उत्तरों को भी देखना चाहता हूं जो म्यूटली-भाषिक कविताओं में छवियों को मोड़ते हैं, या ऐसा कुछ चतुर। ध्यान दें कि मूल समाधान के लेखक ने केवल चीनी अक्षरों का उपयोग करने का फैसला किया, क्योंकि यह उस तरह से अच्छा लग रहा था।
    3. दिलचस्प कोड और चतुर एल्गोरिदम हमेशा अच्छे होते हैं। मुझे लघु, टू द पॉइंट, और क्लियर कोड पसंद है, लेकिन वास्तव में चतुर जटिल एल्गोरिदम ठीक हैं, जब तक कि वे अच्छे परिणाम नहीं देते हैं।
  2. गति भी महत्वपूर्ण है, हालांकि यह उतना महत्वपूर्ण नहीं है जितना अच्छा है कि आपके द्वारा की गई छवि को संकुचित करना कितना अच्छा है। मेरे पास एक ऐसा कार्यक्रम होगा जो एक छवि को दूसरे के दसवें भाग में बदल सकता है, जो कुछ दिनों के लिए आनुवंशिक एल्गोरिदम के अंत में होगा।
  3. मैं लंबे लोगों के लिए छोटे समाधान पसंद करूंगा, जब तक कि वे गुणवत्ता में काफी हद तक तुलनीय हों; संक्षिप्तता एक गुण है।
  4. आपके कार्यक्रम को ऐसी भाषा में लागू किया जाना चाहिए जिसमें मैक ओएस एक्स, लिनक्स या विंडोज पर स्वतंत्र रूप से उपलब्ध कार्यान्वयन हो। मैं कार्यक्रमों को चलाने में सक्षम होना चाहता हूं, लेकिन अगर आपके पास एक महान समाधान है जो केवल MATLAB या कुछ के तहत चलता है, तो यह ठीक है।
  5. आपका कार्यक्रम यथासंभव सामान्य होना चाहिए; यह संभव के रूप में कई अलग अलग छवियों के लिए काम करना चाहिए, हालांकि कुछ दूसरों की तुलना में बेहतर परिणाम उत्पन्न कर सकते हैं। विशेष रूप से:
    1. इस कार्यक्रम में निर्मित कुछ छवियों के होने से यह मेल खाता है और एक संदर्भ लिखता है, और फिर डिकोडिंग पर मिलान छवि का उत्पादन करता है, काफी लंगड़ा है और केवल कुछ छवियों को कवर करेगा।
    2. एक कार्यक्रम जो सरल, सपाट, ज्यामितीय आकृतियों की छवियों को ले सकता है और उन्हें कुछ वेक्टर आदिम में विघटित करता है, वह बहुत ही सुंदर है, लेकिन अगर यह एक निश्चित जटिलता से परे छवियों पर विफल रहता है तो यह संभवतः सामान्य है।
    3. एक ऐसा कार्यक्रम जो केवल एक विशेष निश्चित पहलू अनुपात की छवियां ले सकता है, लेकिन उनके साथ एक अच्छा काम भी ठीक होगा, लेकिन आदर्श नहीं।
    4. आप पा सकते हैं कि एक काले और सफेद छवि को एक रंग छवि की तुलना में एक छोटे स्थान में अधिक जानकारी मिल सकती है। दूसरी ओर, यह उस छवि के प्रकार को सीमित कर सकता है जो इसके लिए लागू है; चेहरे काले और सफेद रंग में ठीक निकलते हैं, लेकिन अमूर्त डिजाइन शायद इतनी अच्छी तरह से किराया नहीं करते हैं।
    5. यह पूरी तरह से ठीक है अगर आउटपुट छवि इनपुट से छोटी है, जबकि लगभग समान अनुपात है। यह ठीक है अगर आपको छवि को मूल से तुलना करना है; महत्वपूर्ण यह है कि यह कैसा दिखता है।
  6. आपके कार्यक्रम को ऐसे आउटपुट का उत्पादन करना चाहिए जो वास्तव में ट्विटर के माध्यम से जा सकता है और बिना बिके बाहर आ सकता है। यह केवल एक नियम के बजाय एक दिशानिर्देश है, क्योंकि मैं समर्थित वर्णों के सटीक सेट पर कोई दस्तावेज नहीं ढूंढ सका, लेकिन आपको शायद नियंत्रण पात्रों, कायरता अदृश्य संयोजन पात्रों, निजी उपयोग पात्रों और पसंद से बचना चाहिए।

रूब्रिक स्कोरिंग

एक सामान्य मार्गदर्शिका के रूप में कि मैं अपने स्वीकृत समाधान का चयन करते समय कैसे रैंकिंग समाधान करूंगा, जो कहता है कि मैं शायद 25 बिंदु पैमाने पर समाधानों का मूल्यांकन करूंगा (यह बहुत मोटा है, और मैं सीधे कुछ भी स्कोर नहीं करूंगा, बस उपयोग करके यह मूल दिशानिर्देश के रूप में):

  • एन्कोडिंग योजना कितनी अच्छी तरह से इनपुट छवियों की एक विस्तृत श्रृंखला को पुन: पेश करती है, इसके लिए 15 अंक । यह एक व्यक्तिपरक, सौंदर्यपूर्ण निर्णय है
    • 0 का मतलब है कि यह बिल्कुल भी काम नहीं करता है, यह एक ही छवि को हर बार, या कुछ और देता है
    • 5 का मतलब है कि यह कुछ छवियों को एन्कोड कर सकता है, हालांकि डिकोडेड संस्करण बदसूरत दिखता है और यह अधिक जटिल छवियों पर बिल्कुल भी काम नहीं कर सकता है
    • 10 का मतलब है कि यह कई प्रकार की छवियों पर काम करता है, और सुखद दिखने वाली छवियों का उत्पादन करता है जो कभी-कभी अलग हो सकती हैं
    • 15 का मतलब है कि यह कुछ छवियों की सही प्रतिकृतियां पैदा करता है, और यहां तक ​​कि बड़ी और अधिक जटिल छवियों के लिए, कुछ ऐसा देता है जो पहचानने योग्य होता है। या, शायद यह उन छवियों को नहीं बनाता है जो काफी पहचानने योग्य हैं, लेकिन सुंदर छवियां पैदा करती हैं जो मूल रूप से स्पष्ट रूप से प्राप्त होती हैं।
  • यूनिकोड वर्ण सेट के चतुर उपयोग के लिए 3 अंक
    • अनुमत वर्णों के पूरे सेट का उपयोग करने के लिए 0 अंक
    • पात्रों के सीमित सेट का उपयोग करने के लिए 1 बिंदु जो ट्विटर पर या विभिन्न प्रकार की स्थितियों में स्थानांतरण के लिए सुरक्षित हैं
    • वर्णों के विषयगत सबसेट का उपयोग करने के लिए 2 अंक, जैसे कि केवल हान विचारधारा या केवल दाएं-से-बाएँ वर्ण
    • वास्तव में साफ-सुथरा कुछ करने के लिए 3 बिंदु, जैसे पठनीय पाठ उत्पन्न करना या प्रश्न में छवि की तरह दिखने वाले पात्रों का उपयोग करना
  • चालाक एल्गोरिदम दृष्टिकोण और कोड शैली के लिए 3 अंक
    • 0 अंक के लिए कोड की 1000 लाइनें केवल छवि को स्केल करने के लिए है, इसे 1 बिट प्रति पिक्सेल के रूप में मानें, और बेस 64 एनकोड करें
    • 1 ऐसी चीज के लिए जो एक मानक एन्कोडिंग तकनीक का उपयोग करती है और अच्छी तरह से लिखित और संक्षिप्त है
    • किसी चीज़ के लिए 2 अंक जो अपेक्षाकृत उपन्यास एन्कोडिंग तकनीक का परिचय देता है, या जो आश्चर्यजनक रूप से छोटा और साफ है
    • एक लाइनर के लिए 3 अंक जो वास्तव में अच्छे परिणाम पैदा करते हैं, या कुछ ऐसा जो ग्राफिक्स एन्कोडिंग में नई जमीन को तोड़ता है (यदि ऐसा लगता है कि नए ग्राउंड को तोड़ने के लिए कम अंक हैं, तो याद रखें कि इस परिणाम से सौंदर्यशास्त्र के लिए एक उच्च अंक होगा। भी)
  • गति के लिए 2 अंक । बाकी सभी समान, तेज होना बेहतर है, लेकिन उपरोक्त मानदंड गति से अधिक महत्वपूर्ण हैं
  • मुफ्त (ओपन सोर्स) सॉफ्टवेयर पर चलने के लिए 1 अंक , क्योंकि मैं मुफ्त सॉफ्टवेयर पसंद करता हूं (ध्यान दें कि C # अभी भी इस बिंदु के लिए योग्य होगा, क्योंकि यह मोनो पर चलता है, इसी तरह MATLAB कोड योग्य होगा यदि यह GNU ऑक्टेव पर चलता है)
  • सभी नियमों का वास्तव में पालन करने के लिए 1 अंक । इन नियमों ने थोड़ा बड़ा और जटिल हो गया है, इसलिए मैं शायद अन्यथा अच्छे उत्तरों को स्वीकार करूंगा जो एक छोटे से विवरण को गलत करते हैं, लेकिन मैं किसी भी समाधान के लिए एक अतिरिक्त बिंदु दूंगा जो वास्तव में सभी नियमों का पालन करता है

संदर्भ चित्र

कुछ लोगों ने कुछ संदर्भ चित्र मांगे हैं। यहाँ कुछ संदर्भ चित्र दिए गए हैं जिन्हें आप आज़मा सकते हैं; छोटे संस्करण यहां एम्बेड किए गए हैं, वे सभी छवि के बड़े संस्करणों से लिंक करते हैं यदि आपको उन की आवश्यकता है:

लीना मोना लीसा कॉर्नेल बॉक्स StackOverflow लोगो

इनाम

उपरोक्त मानदंड के आधार पर, मुझे सबसे अच्छा पसंद है कि समाधान के लिए मैं एक 500 प्रतिनिधि इनाम (प्लस 50 कि StackOverflow kicks) की पेशकश कर रहा हूं। निश्चित रूप से, मैं अन्य सभी को अपने पसंदीदा समाधानों के लिए यहां भी वोट देने के लिए प्रोत्साहित करता हूं।

समय सीमा पर ध्यान दें

यह प्रतियोगिता तब तक चलेगी, जब तक कि 30 मई, शनिवार को शाम 6 बजे के आसपास इनाम बाहर नहीं निकल जाता। यह शाम 5 से 7 बजे तक कहीं भी हो सकता है। मैं गारंटी देता हूं कि मैं दोपहर 2 बजे प्रस्तुत सभी प्रविष्टियों को देखूंगा, और मैं 4 बजे तक प्रस्तुत सभी प्रविष्टियों को देखने की पूरी कोशिश करूंगा; अगर उसके बाद समाधान प्रस्तुत किया जाता है, तो मुझे अपना निर्णय लेने से पहले उन्हें उचित रूप देने का मौका नहीं मिल सकता है। इसके अलावा, आप जो पहले जमा करते हैं, आपके पास मतदान करने का अधिक मौका होगा, जिससे मुझे सबसे अच्छा समाधान चुनने में मदद मिलेगी, इसलिए कोशिश करें और समय सीमा पर सही होने के बजाय पहले जमा करें।

यूनिकोड नोट्स

यूनिकोड वर्णों की अनुमति के बारे में भी कुछ भ्रम है। संभव यूनिकोड कोड बिंदुओं की सीमा U+0000है U+10FFFF। कुछ कोड बिंदु हैं जो डेटा के किसी भी खुले इंटरचेंज में यूनिकोड वर्ण के रूप में उपयोग करने के लिए कभी भी मान्य नहीं हैं; ये अछूत और सरोगेट कोड बिंदु हैं । Noncharacters में परिभाषित कर रहे हैं Unidode स्टैंडर्ड 5.1.0 खंड 16.7 मूल्यों के रूप में U+FFFE, U+FFFF, U+एनFFFE , U+एनFFFF जहां n है 1- 10हेक्साडेसिमल, और सीमा U+FDD0-U+FDEF। इन मूल्यों का उपयोग अनुप्रयोग-विशिष्ट आंतरिक उपयोग के लिए किया जाना है, और अनुरूपण अनुप्रयोग इन वर्णों को उनके द्वारा संसाधित पाठ से बाहर निकाल सकते हैं। सरोगेट कोड अंक, में परिभाषित यूनिकोड स्टैंडर्ड 5.1.0 खंड 3.8 के रूप में U+D800- U+DFFF, UTF-16 में बेसिक बहुभाषी विमान परे वर्ण एन्कोड करने के लिए उपयोग किया जाता है; इस प्रकार, UTF-16 एन्कोडिंग में सीधे इन कोड बिंदुओं का प्रतिनिधित्व करना असंभव है, और उन्हें किसी अन्य एन्कोडिंग में एन्कोड करना अमान्य है। इस प्रकार, इस प्रतियोगिता के प्रयोजन के लिए, मैं किसी भी प्रोग्राम है जो सीमा से 140 से अधिक नहीं यूनिकोड कोड अंक के अनुक्रम में छवियों को कूटबद्ध अनुमति देगा U+0000- U+10FFFF, ऊपर परिभाषित सभी noncharacters और सरोगेट जोड़े को छोड़कर।

मैं उन समाधानों को प्राथमिकता दूंगा जो केवल असाइन किए गए वर्णों का उपयोग करते हैं, और इससे भी बेहतर कि वे असाइन किए गए वर्णों के चतुर सबसेट का उपयोग करते हैं या उनके द्वारा उपयोग किए गए वर्ण सेट के साथ कुछ दिलचस्प करते हैं। असाइन किए गए वर्णों की सूची के लिए, यूनिकोड कैरेक्टर डेटाबेस देखें ; ध्यान दें कि कुछ वर्ण सीधे सूचीबद्ध हैं, जबकि कुछ केवल एक सीमा के प्रारंभ और अंत के रूप में सूचीबद्ध हैं। यह भी ध्यान दें कि सरोगेट कोड अंक डेटाबेस में सूचीबद्ध हैं, लेकिन ऊपर वर्णित के रूप में निषिद्ध है। यदि आप पाठ को अधिक रोचक बनाने के लिए वर्णों के कुछ गुणों का लाभ लेना चाहते हैं, तो विभिन्न प्रकार के वर्ण जानकारी के डेटाबेस उपलब्ध हैं, जैसे कि नामांकित ब्लॉक और विभिन्न वर्ण गुणों की सूची

चूंकि ट्विटर सटीक वर्ण सेट का समर्थन नहीं करता है जो वे समर्थन करते हैं, मैं उन समाधानों के बारे में उत्तरदायी रहूंगा जो वास्तव में ट्विटर के साथ काम नहीं करते हैं क्योंकि कुछ वर्ण अतिरिक्त या कुछ वर्णों को गिनते हैं। यह पसंद किया जाता है, लेकिन यह आवश्यक नहीं है कि सभी एन्कोडेड आउटपुट को ट्विटर या अन्य माइक्रोब्लॉगिंग सेवा जैसे कि आइडीआईए के माध्यम से अनचाहे स्थानांतरित किया जा सके । मैंने कुछ दस्तावेज़ों को बताते हुए देखा है कि ट्विटर इकाई-एनकोड <,>, और &, और इस तरह क्रमशः 4, 4, और 5 वर्णों के रूप में गिना जाता है, लेकिन मैंने खुद का परीक्षण नहीं किया है और उनके जावास्क्रिप्ट वर्ण काउंटर नहीं लगते हैं। उन्हें उस तरह से गिनने के लिए।

टिप्स और लिंक

  • नियमों में मान्य यूनिकोड वर्णों की परिभाषा थोड़ी जटिल है। वर्णों का एक भी ब्लॉक चुनना, जैसे कि CJK यूनिफाइड आइडियोग्राफ (U + 4E00 – U + 9FCF) आसान हो सकता है।
  • आप अपनी छवि हेरफेर के लिए मौजूदा इमेज लाइब्रेरी का उपयोग कर सकते हैं, जैसे कि इमेजमैजिक या पायथन इमेजिंग लाइब्रेरी
  • यदि आपको यूनिकोड वर्ण सेट और इसके विभिन्न एन्कोडिंग को समझने में कुछ मदद चाहिए, तो यह त्वरित गाइड या लिनक्स और यूनिक्स में UTF-8 पर इस विस्तृत FAQ को देखें
  • इससे पहले कि आप अपना समाधान प्राप्त करें, जितना अधिक समय मुझे (और अन्य लोगों को मतदान करना) देखना होगा। यदि आप इसे सुधारते हैं तो आप अपने समाधान को संपादित कर सकते हैं; जब मैं समाधानों के माध्यम से अपना अंतिम रूप लूंगा, तो मैं सबसे हाल के संस्करण पर अपने इनाम को आधार बनाऊंगा।
  • यदि आप पार्स और लिखने के लिए एक आसान छवि प्रारूप चाहते हैं (और केवल एक मौजूदा प्रारूप का उपयोग नहीं करना चाहते हैं), तो मैं पीपीएम प्रारूप का उपयोग करने का सुझाव दूंगा । यह एक पाठ आधारित प्रारूप है, जिसके साथ काम करना बहुत आसान है, और आप इसे और इससे परिवर्तित करने के लिए ImageMagick का उपयोग कर सकते हैं ।

टिप्पणियों में मेरे द्वारा लिखे गए नियमों पर सुझाव देने के लिए स्वतंत्र महसूस करें; मैं निश्चित रूप से उन्हें tweak करने के लिए तैयार हूँ अगर लोगों को लगता है कि उन्हें स्पष्टीकरण की आवश्यकता है या बहुत अधिक निर्दिष्ट हैं।
ब्रायन कैंपबेल

6
आपको शायद यह कहना चाहिए कि छवि को सर्वर पर अपलोड करना और यूआरएल को पोस्ट करना मान्य नहीं है।
शाय एर्लिचमेन

2
@ सहाय क्या मैंने पहले ही नहीं कहा था? "डिकोडिंग प्रक्रिया में उपरोक्त निर्दिष्ट आउटपुट के अलावा एन्कोडिंग प्रक्रिया के किसी अन्य आउटपुट तक कोई पहुंच नहीं हो सकती है; अर्थात, आप कहीं छवि अपलोड नहीं कर सकते हैं और डिकोडिंग प्रक्रिया के लिए URL को आउटपुट कर सकते हैं, या कुछ भी मूर्खतापूर्ण तरीके से डाउनलोड कर सकते हैं। । "
ब्रायन कैंपबेल

1
@ कोनराड रूडोल्फ I सहमत; व्यावहारिक दृष्टिकोण से मेरा मतलब "मूर्खतापूर्ण" नहीं था (स्पष्ट रूप से, यह पूरी प्रतियोगिता एक व्यावहारिक दृष्टिकोण से मूर्खतापूर्ण है), मेरा मतलब इस प्रतियोगिता के संदर्भ में "मूर्खतापूर्ण" था। URI का उपयोग करना वास्तव में सूचना सिद्धांत में एक संपीड़न एल्गोरिथ्म नहीं है, क्योंकि यह आपको किसी वैकल्पिक चैनल का उपयोग किए बिना किसी भी अधिक जानकारी को स्थानांतरित करने की अनुमति नहीं देता है। आप एनकोडर और डिकोडर को चित्रों का एक बड़ा डेटाबेस दे सकते हैं, और इसे संपीडन कह सकते हैं जो केवल सीमित चित्रों पर काम करता है, लेकिन मैंने निर्दिष्ट किया कि आपको एक मनमानी छवि को संभालने में सक्षम होना चाहिए।
ब्रायन कैंपबेल

2
यहाँ उन लिंक के कुछ जोड़े हैं जो मैंने चलाए हैं जो लोगों को बाहर निकालने में मदद कर सकते हैं: यूनिकोड वर्णों की मान्य श्रेणी की व्याख्या के लिए azillionmonkeys.com/qed/unicode.html । ध्यान दें कि UTF एनकोडिंग वे हैं जो संपूर्ण यूनिकोड श्रेणी को एन्कोड कर सकते हैं; यूसीएस -4 यूनिकोड का एक सुपरसेट है, और यूसीएस -2 और एएससीआईआई सबसेट हैं। और संपीड़न के मोर्चे पर, यहां मूल पोस्ट के समान तकनीक है, हालांकि वह खुद को 350 बाइट्स के बजाय 1k की अनुमति दे रहा है
ब्रायन कैंपबेल

जवाबों:


244

ठीक है, यहाँ मेरा है: nanocrunch.cpp और CMakeLists.txt फ़ाइल को CMake का उपयोग करके इसे बनाने के लिए यह अपनी अधिकांश इमेज हैंडलिंग के लिए Magick ++ ImageMagick API पर निर्भर करता है । इसके स्ट्रिंग एन्कोडिंग के लिए बिग्नम अंकगणित के लिए GMP लाइब्रेरी की भी आवश्यकता है ।

मैंने कुछ विलक्षण ट्विस्ट के साथ फ्रैक्टल इमेज कम्प्रेशन का अपना समाधान बंद कर दिया। मूल विचार छवि को लेना है, एक प्रति को 50% तक कम करना है और मूल छवि में गैर-अतिव्यापी ब्लॉकों के समान दिखने वाले विभिन्न झुकावों में टुकड़ों की तलाश करना है। यह इस खोज के लिए एक बहुत ही क्रूर बल दृष्टिकोण लेता है, लेकिन यह सिर्फ मेरे संशोधनों को पेश करना आसान बनाता है।

पहला संशोधन यह है कि सिर्फ नब्बे डिग्री के घुमाव और फ़्लिप को देखने के बजाय, मेरा कार्यक्रम 45 डिग्री के झुकाव को भी मानता है। यह प्रति ब्लॉक एक और बिट है, लेकिन यह छवि की गुणवत्ता में काफी मदद करता है।

दूसरी बात यह है कि प्रत्येक ब्लॉक के रंग घटक के लिए कंट्रास्ट / ब्राइटनेस एडजस्टमेंट को स्टोर करना बहुत महंगा है। इसके बजाय, मैं एक भारी मात्रा में रंग संग्रहीत करता हूं (पैलेट में केवल 4 * 4 * 4 = 64 रंग हैं) जो बस कुछ अनुपात में मिश्रित हो जाते हैं। गणितीय रूप से, यह एक चर चमक और प्रत्येक रंग के लिए निरंतर विपरीत समायोजन के बराबर है। दुर्भाग्य से, इसका मतलब यह भी है कि रंगों को फ्लिप करने के लिए कोई नकारात्मक विपरीत नहीं है।

एक बार जब यह प्रत्येक ब्लॉक के लिए स्थिति, अभिविन्यास और रंग की गणना करता है, तो यह इसे UTF-8 स्ट्रिंग में एन्कोड करता है। सबसे पहले, यह ब्लॉक तालिका और छवि आकार में डेटा का प्रतिनिधित्व करने के लिए एक बहुत बड़ी बोली उत्पन्न करता है। इसके लिए दृष्टिकोण सैम हूसेवर के समाधान के समान है - एक मूलांक के साथ बड़ी संख्या की तरह जो स्थिति से भिन्न होता है।

फिर यह इस बात को धर्मान्तरित करता है कि चरित्र के आकार का कोई भी आधार उपलब्ध है। डिफ़ॉल्ट रूप से, यह असाइन किए गए यूनिकोड चरित्र सेट, माइनस से कम, एम्परसेंड, नियंत्रण, संयोजन और सरोगेट और निजी पात्रों का पूर्ण उपयोग करता है। यह सुंदर नहीं है, लेकिन यह काम करता है। आप डिफॉल्ट टेबल पर भी टिप्पणी कर सकते हैं और प्रिंट करने योग्य 7-बिट ASCII (फिर से <,>, और & वर्णों को छोड़कर) या CJK यूनिफाइड Ideographs का चयन कर सकते हैं। जिस चरित्र के कोड उपलब्ध हैं, उसे अमान्य और मान्य वर्णों के वैकल्पिक रन के साथ एन्कोडेड रन-लंबाई संग्रहीत किया जाता है।

वैसे भी, यहां कुछ चित्र और समय हैं (जैसा कि मेरे पुराने 3.0GHz P4 पर मापा गया है), और ऊपर वर्णित पूर्ण असाइन किए गए यूनिकोड सेट में 140 वर्णों तक संपीड़ित किया गया है। कुल मिलाकर, मैं काफी खुश हूं कि वे सभी कैसे निकले। यदि मेरे पास इस पर काम करने के लिए अधिक समय है, तो मैं शायद विघटित छवियों की अवरुद्धता को कम करने की कोशिश करूंगा। फिर भी, मुझे लगता है कि चरम संपीड़न अनुपात के लिए परिणाम बहुत अच्छे हैं। विघटित चित्र बिट इंप्रेशनिस्ट हैं, लेकिन मुझे यह देखना आसान है कि बिट्स मूल के अनुरूप कैसे हैं।

स्टैक ओवरफ्लो लोगो (8.6s एनकोड करने के लिए, 7.9s को डिकोड करने के लिए, 485 बाइट्स):
http://i44.tinypic.com/2w7lok1.png

लीना (32.8 सेकेंड का एनकोड, 13.0s को डीकोड, 477 बाइट्स):
http://i42.tinypic.com/2rr49wg.png http://i40.tinypic.com/2rhxxyu.png

मोना लिसा (43.2 से सांकेतिक शब्दों में बदलना, 14.5s को डिकोड, 490 बाइट्स):
http://i41.tinypic.com/ekgwp3.png http://i43.tinypic.com/ngsxep.png

संपादित करें: CJK एकीकृत वर्ण

सैम ने सीजेके के साथ इसका उपयोग करने के बारे में टिप्पणियों में पूछा। यहां CJK यूनिफाइड कैरेक्टर सेट से 139 वर्णों तक संपीड़ित मोना लिसा का एक संस्करण है:

http://i43.tinypic.com/2yxgdfk.png 咏璘驞凄脒鵚据蛥鸂拗朐朖辿韩瀦魷歪痫栘璯緍脲蕜抱揎頻蓼債鑡嗞靊寞柮嚛嚵籥聚隤慛絖銓馿渫櫰矍昀鰛掾撄粂敽牙稉擎蔍螎葙峬覧絀蹔抆惫冧笻哜搀澐芯譶辍澮垝黟偞媄童竽梀韠镰猳閺狌而羶喙伆杇婣唆鐤諽鷍鴞駫搶毤埙誖萜愿旖鞰萗勹鈱哳垬濅鬒秀瞛洆认気狋異闥籴珵仾氙熜謋繴茴晋髭杍嚖熥勳縿餅珝爸擸萿

कार्यक्रम के शीर्ष पर ट्यूनिंग पैरामीटर जो मैंने इसके लिए उपयोग किए थे, वे थे: 19, 19, 4, 4, 3, 10, 11, 1000, 1000। मैंने पहले नंबर_डाइन किए गए और कोड की पहली परिभाषा भी लिखी थी, और इसे अन-आउट कर दिया था। CJK यूनिफाइड कैरेक्टर सेट को चुनने के लिए उनमें से अंतिम परिभाषा।


वाह! अच्छी नौकरी। मैं इस छोटे से चित्रों के लिए भग्न छवि संपीड़न पर संदेह कर रहा था, लेकिन यह वास्तव में बहुत अच्छे परिणाम देता है। संकलन करना और चलाना भी बहुत आसान था।
ब्रायन कैंपबेल

1
धन्यवाद दोस्तों! सैम, क्या आप सिर्फ 140 सीजेके पात्रों के साथ परिणाम का मतलब है? यदि हां, तो हां, आपको शीर्ष पर संख्याओं को ट्यून करने की आवश्यकता होगी। बिट्स में अंतिम आकार के चारों ओर log2 (steps_in_x है steps_in_y steps_in_red steps_in_green steps_in_blue) * blocks_in_x blocks_in_y + log2 (maximum_width maximum_height)।
बोजूम

संपादित करें: पहले log2 () में एक * 16 है जो मैंने छोड़ दिया। यह संभव झुकाव के लिए है।
बोयोजुम

20
क्या किसी ने अभी तक इसका उपयोग करके एक छवि ट्विटर पर बनाई है?
मई'09

288

छवि फ़ाइलें और अजगर स्रोत (संस्करण 1 और 2)

संस्करण 1 यहाँ मेरा पहला प्रयास है। मैं जाते ही अपडेट कर दूंगा।

मैं लगभग दोषरहित 300 अक्षरों के नीचे SO लोगो मिला है। मेरी तकनीक एसवीजी वेक्टर कला में रूपांतरण का उपयोग करती है इसलिए यह लाइन आर्ट पर सबसे अच्छा काम करती है। यह वास्तव में एक एसवीजी कंप्रेसर है, इसे अभी भी मूल कला की आवश्यकता होती है जो एक वेक्टराइजेशन चरण से गुजरती है।

अपने पहले प्रयास के लिए मैंने पीएनजी ट्रेस के लिए एक ऑनलाइन सेवा का उपयोग किया था, हालांकि कई स्वतंत्र और गैर-मुक्त उपकरण हैं जो इस भाग को संभाल सकते हैं जिसमें पोटेंश (ओपन-सोर्स) शामिल हैं।

यहाँ परिणाम हैं

मूल अतः लोगो http://www.warriorhut.org/graphics/svg_to_unicode/so-logo.png मूल डीकोड अतः लोगो http://www.warriorhut.org/graphics/svg_to_unicode/so-logo-decoded.png एन्कोडिंग के बाद और डिकोडिंग

वर्ण : ३००

समय : मापा नहीं गया, लेकिन व्यावहारिक रूप से तत्काल (वैश्वीकरण / रेखांकन चरणों सहित)

अगला चरण यूनिकोड चरित्र के अनुसार 4 प्रतीकों (SVG पाथ पॉइंट और कमांड) को एम्बेड करने के लिए होगा। फिलहाल मेरे अजगर के निर्माण में यूसीएस 4 का व्यापक चरित्र समर्थन नहीं है जो मेरे संकल्प प्रति चरित्र को सीमित करता है। मैंने एक बार यूनिकोड आरक्षित सीमा के निचले छोर तक अधिकतम सीमा को सीमित कर दिया है 0xD800 हालांकि मैंने एक बार अनुमत पात्रों की सूची बनाई है और उनसे बचने के लिए एक फ़िल्टर बनाया है जो कि मैं सैद्धांतिक रूप से वर्णों की आवश्यक संख्या को 70-100 के लिए कम से कम धक्का दे सकता हूं लोगो ऊपर।

वर्तमान में इस विधि की एक सीमा है उत्पादन का आकार तय नहीं है। यह वेक्टर नोड्स / सदिश के बाद अंकों की संख्या पर निर्भर करता है। इस सीमा को स्वचालित करने के लिए या तो छवि को पिक्सलेट करना होगा (जो कि वैक्टर के मुख्य लाभ को हटाता है) या सरलीकरण चरण के माध्यम से पथों को बार-बार चलाना जब तक कि वांछित नोड की गिनती नहीं हो जाती है (जो कि मैं वर्तमान में इंक्सस्केप में मैन्युअल रूप से कर रहा हूं)।

संस्करण 2

अद्यतन : v2 अब प्रतिस्पर्धा करने के लिए योग्य है। परिवर्तन:

  • कमांड-लाइन कंट्रोल इनपुट / आउटपुट और डीबगिंग
  • रेवेक्स के बजाय SVG को संभालने के लिए XML parser (lxml) का उपयोग करता है
  • यूनिकोड प्रतीक के अनुसार 2 पथ खंडों को पैक करता है
  • प्रलेखन और सफाई
  • समर्थन शैली = "भरें: रंग" और भरें = "रंग"
  • दस्तावेज़ की चौड़ाई / ऊँचाई एकल वर्ण में पैक की गई
  • पथ रंग एकल वर्ण में पैक किया गया
  • रंग संपीड़न को प्रति रंग 4 बिट रंग के डेटा को फेंकने से प्राप्त किया जाता है, फिर इसे हेक्स रूपांतरण के माध्यम से एक चरित्र में पैक किया जाता है।

वर्ण : 133

समय : कुछ सेकंड

वी 2 डीकोड http://www.warriorhut.org/graphics/svg_to_unicode/so-logo-decoded-v2.png एन्कोडिंग और डिकोडिंग के बाद (संस्करण 2)

जैसा कि आप देख सकते हैं कि इस बार कुछ कलाकृतियाँ हैं। यह विधि की सीमा नहीं है, लेकिन मेरे रूपांतरणों में कहीं एक गलती है। कलाकृतियाँ तब होती हैं जब अंक 0.0 - 127.0 की सीमा से बाहर जाते हैं और उन्हें विवश करने के मेरे प्रयासों को मिश्रित सफलता मिली है। समाधान बस छवि को नीचे रखने के लिए है, हालांकि मुझे आर्टबोर्ड या समूह मैट्रिक्स के बजाय वास्तविक बिंदुओं को स्केल करने में परेशानी हुई थी और अब मैं देखभाल करने के लिए बहुत थक गया हूं। संक्षेप में, यदि आपके अंक समर्थित सीमा में हैं तो यह आम तौर पर काम करता है।

मेरा मानना ​​है कि बीच में कींक एक हैंडल के दूसरी ओर जाने वाले हैंडल के कारण जुड़ा हुआ है। मूल रूप से अंक पहले स्थान पर बहुत करीब हैं। संपीड़ित करने से पहले स्रोत छवि पर एक सरलीकृत फ़िल्टर चलाना इसे ठीक करना चाहिए और कुछ अनावश्यक वर्णों की दाढ़ी बनाना चाहिए।

अद्यतन : यह विधि सरल वस्तुओं के लिए ठीक है इसलिए मुझे जटिल रास्तों को आसान बनाने और शोर को कम करने के लिए एक तरीका चाहिए था। मैंने इस कार्य के लिए इंकस्केप का उपयोग किया । मैं कुछ किस्मत Inkscape का उपयोग कर अनावश्यक रास्तों को संवारने के साथ मिला है, लेकिन इसे स्वचालित करने का प्रयास करने का समय नहीं था। मैं इंकस्केप 'सरल' समारोह का उपयोग करके पथ की संख्या को कम करने के लिए कुछ नमूना SVGs कर दिया है।

सरलीकृत कार्य ठीक है, लेकिन यह कई रास्तों से धीमा हो सकता है।

ऑटोट्रेस उदाहरण http://www.warriorhut.org/graphics/svg_to_unicode/autotrace_16_color_manual_reduction.png कॉर्नेल बॉक्स http://www.warriorhut.com/graphics/svv_to_unicode/cornell_box_simplified.png लेन http://www.warriorhut.com/graphics /svg_to_unicode/lena_std_washed_autotrace.png

थंबनेल का पता लगाया गया है http://www.warriorhut.org/graphics/svg_to_unicode/competition_thumbnails_autotrace.png

यहाँ कुछ अल्ट्रा लो-रेस शॉट्स हैं। ये 140 वर्ण सीमा के करीब होंगे हालांकि कुछ चतुर पथ संपीड़न की आवश्यकता हो सकती है।

तैयार किया गया http://www.warriorhut.org/graphics/svg_to_unicode/competition_thumbnails_groomed.png सरलीकृत और मायूस।

trianglulated http://www.warriorhut.org/graphics/svg_to_unicode/competition_thumbnails_triangulated.png सरलीकृत, निराश और त्रिकोणीय।

autotrace --output-format svg --output-file cornell_box.svg --despeckle-level 20 --color-count 64 cornell_box.png

ABOVE: ऑटोट्रेस का उपयोग करके सरलीकृत पथ ।

दुर्भाग्य से मेरे पार्सर ऑटोट्रेस आउटपुट को हैंडल नहीं करते हैं, इसलिए मुझे नहीं पता कि अंक कैसे उपयोग में हो सकते हैं या सरल बनाने के लिए कितनी दूर हैं, दुख की बात है कि समय सीमा से पहले इसे लिखने के लिए बहुत कम समय है। हालांकि यह अक्सस्केप आउटपुट से पार्स करना बहुत आसान है।


2
अति उत्कृष्ट! पहले मैं तेज किनारों और चिकनी दोनों क्षेत्रों के साथ एक हाइब्रिड वेक्टर समाधान बनाना चाहता था, लेकिन यह ट्रेसिंग लाइब्रेरी (जो मैं उपयोग नहीं करना चाहता था) का उपयोग किए बिना बहुत जटिल साबित हुआ। मैं आगे देख रहा हूँ कि आप अपने तरीके से कितनी दूर निकल सकते हैं!
sam hocevar

अच्छा! मैं उम्मीद कर रहा था कि हम वैश्वीकरण द्वारा निकट-दोषरहित दृष्टिकोणों पर कुछ प्रयास देखेंगे। इसका मतलब है कि इसमें सामान्यता कम है, लेकिन जिन छवियों को यह कवर करता है उनके लिए उच्च गुणवत्ता है। वैश्वीकरण के लिए एक ऑनलाइन सेवा का उपयोग करना ठीक है। आकार को और नीचे लाने पर शुभकामनाएँ!
ब्रायन कैंपबेल

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

70
वाह। ये चित्र वास्तव में स्टाइलिश दिखते हैं।
रिनैट अब्दुल्लीन

199

मेरा पूरा समाधान मिल सकता है http://caca.zoy.org/wiki/img2twit । इसकी निम्नलिखित विशेषताएं हैं:

  • उचित संपीड़न समय (उच्च गुणवत्ता के लिए लगभग 1 मिनट)
  • तेजी से अपघटन (एक सेकंड का एक अंश)
  • मूल छवि का आकार रखता है (केवल पहलू अनुपात नहीं)
  • विनिमेय पुनर्निर्माण गुणवत्ता (IMHO)
  • संदेश की लंबाई और चरित्र सेट (ASCII, CJK, प्रतीक) को रनटाइम पर चुना जा सकता है
  • संदेश की लंबाई और वर्ण सेट विघटित समय पर स्वचालित होते हैं
  • बहुत कुशल जानकारी पैकिंग

http://caca.zoy.org/raw-attachment/wiki/img2twit/so-logo.png http://caca.zoy.org/raw-attachment/wiki/img2twit/twitter4.png

蜥 秓 鋖 筷 聝 诿 缰 偺 腶 漷 庯 祩 皙 靊 谪 獜 岨 幻 寤 厎 趆 脘 搇 梄 踥 桻 理 戂 溥 欇 渹 裏 軱 骿 苸 髙 骟 市 簶 璨 粭 浧 鱉 捕 弫 潮 衍 蚙 瀹 岚玧 霫 鏓 蓕 戲 債 鼶 襋 躻 弯 袮 足 庭 侅 旍 凼 飙 驅 據 嘛 掔 倾 诗 籂 阉 嶹 婻 椿 糢 墤 渽 緛 赐 更 儅 棫 武 婩 縑 逡 荨 璙 杯 翉 珸 齸 陁 颗 鳣 憫擲 舥 攩 寉 鈶 兓 庭 璱 篂 鰀 乾 丕 耓 庁 錸 努 樀 肝 亖 弜 喆 蝞 躐 葌 熲 谎 蛪 曟 暙 刍 镶 媏 嘝 驌 慸 盂 氤 缰 殾 譑

यहाँ एन्कोडिंग प्रक्रिया का एक मोटा अवलोकन है:

  • उपलब्ध बिट्स की संख्या वांछित संदेश की लंबाई और प्रयोग करने योग्य charset से गणना की जाती है
  • स्रोत छवि को उपलब्ध बिट परमिट के रूप में कई वर्ग कोशिकाओं में विभाजित किया गया है
  • प्रारंभिक निर्देशांक और रंग मूल्यों के साथ, प्रत्येक सेल पर एक निश्चित संख्या में अंक (वर्तमान में 2) प्रभावित होते हैं
  • गुणवत्ता की शर्त पूरी होने तक निम्नलिखित को दोहराया जाता है:
    • एक बिंदु को एक यादृच्छिक चुना जाता है
    • इस बिंदु पर यादृच्छिक रूप से एक ऑपरेशन किया जाता है (इसे अपने सेल के अंदर ले जाता है, अपना रंग बदलता है)
    • यदि परिणामस्वरूप छवि (नीचे डिकोडिंग प्रक्रिया देखें) स्रोत छवि के करीब है, तो ऑपरेशन रखा गया है
  • छवि का आकार और अंकों की सूची UTF-8 में एन्कोडेड है

और यह डिकोडिंग प्रक्रिया है:

  • छवि का आकार और अंक UTF-8 स्ट्रीम से पढ़े जाते हैं
  • गंतव्य छवि में प्रत्येक पिक्सेल के लिए:
    • प्राकृतिक निगरबों की सूची की गणना की जाती है
    • पिक्सेल का अंतिम रंग उसके प्राकृतिक पड़ोसियों के रंगों के भारित औसत के रूप में सेट किया गया है

मेरा मानना ​​है कि कार्यक्रम का सबसे मूल हिस्सा बिटस्ट्रीम है। बिट-संरेखित मानों ( stream <<= shift; stream |= value) को पैक करने के बजाय , मैं उन मनमानी मूल्यों को पैक करता हूं जो पावर-ऑफ-टू रेंज ( stream *= range; stream += value) में नहीं हैं। इसके लिए bignum कम्प्यूटेशंस की आवश्यकता होती है और निश्चित रूप से यह काफी धीमा है, लेकिन यह मुझे 20902 मुख्य CJK वर्णों का उपयोग करते समय 1960 के बजाय 2009.18 बिट्स देता है (यह तीन और बिंदु हैं जो मैं डेटा में डाल सकता हूं)। और ASCII का उपयोग करते समय, यह मुझे 840 के बजाय 917.64 बिट्स देता है।

मैंने प्रारंभिक छवि गणना के लिए एक विधि के खिलाफ निर्णय लिया था जिसमें भारी हथियार (कोने का पता लगाने, सुविधा निष्कर्षण, रंग की मात्रा का ठहराव ...) की आवश्यकता होती थी क्योंकि मुझे यकीन नहीं था कि यह वास्तव में मदद करेगा। अब मुझे लगता है कि अभिसरण धीमा है (1 मिनट स्वीकार्य है लेकिन फिर भी यह धीमा है) और मैं उस पर सुधार करने का प्रयास कर सकता हूं।

मुख्य फिटिंग लूप प्रत्यक्ष बाइनरी सीच डीथिरिंग एल्गोरिथ्म से प्रेरित है (जहां पिक्सेल को बेतरतीब ढंग से स्वैप किया जाता है या बेहतर हफ़्फ़टोन प्राप्त होने तक फ़्लिप किया जाता है)। ऊर्जा संगणना एक सरल मूल-माध्य-वर्ग दूरी है, लेकिन मैं पहले मूल छवि पर 5x5 माध्य फ़िल्टर करता हूं। एक गाऊसी धब्बा शायद मानव आंखों के व्यवहार का बेहतर प्रतिनिधित्व करेगा, लेकिन मैं तेज किनारों को खोना नहीं चाहता था। मैंने सिम्युलेटेड एनेलिंग या अन्य कठिन ट्यून विधियों के खिलाफ भी निर्णय लिया क्योंकि मेरे पास प्रक्रिया को कैलिब्रेट करने के लिए महीने नहीं हैं। इस प्रकार "गुणवत्ता" ध्वज सिर्फ एनकोडर के समाप्त होने से पहले प्रत्येक बिंदु पर किए जाने वाले पुनरावृत्तियों की संख्या का प्रतिनिधित्व करता है।

http://caca.zoy.org/raw-attachment/wiki/img2twit/Mona_Lisa_scaled.jpg http://caca.zoy.org/raw-attachment/wiki/img2twit-twitter2.png

苉 憗 揣 嶕 繠 剳 腏 篮 濕 茝 霮 墧 蒆 棌 杚 蓳 縳 樟 赒 肴 飗 噹 砃 燋 任 朓 峂 釰 靂 陴 貜 犟 掝 喗 讄 荛 砙 矺 敨 鷾 瓔 亨 髎 芟 氲 簵 鸬 嫤 鉸 俇激 躙 憮 鄴 甮 槺 骳 佛 愚 猪 駪 惾 嫥 綖 珏 矯 坼 堭 颽 箽 赭 飉 訥 偁 箝 窂 蹻 熛 漧 衆 橼 愀 航 玴 毡 裋 頢 羔 恺 墎 嬔 鑹 楄 瑥 鶼 呍 蕖 抲 鸝 秓苾 绒 酯 嵞 脔 婺 污 囉 酼 俵 菛 琪 棺 则 辩 曚 鸸 職 銛 蒝 礭 鱚 蟺 稿 纡 醾 陴 鳣 尥 蟀 惘 鋁 髚 忩 祤 脤 养 趯 沅 况

भले ही सभी छवियां अच्छी तरह से संपीड़ित न हों, मैं परिणामों से आश्चर्यचकित हूं और मुझे वास्तव में आश्चर्य है कि क्या अन्य विधियां मौजूद हैं जो एक छवि को 250 बाइट्स में संपीड़ित कर सकती हैं।

मेरे पास एक यादृच्छिक प्रारंभिक राज्य से और एक "अच्छा" प्रारंभिक राज्य से एनकोडर राज्य के विकास की छोटी फिल्में हैं ।

संपादित करें : यहाँ है कि संपीड़न विधि JPEG के साथ तुलना कैसे करती है। बाईं ओर, 536-बाइट तस्वीर के ऊपर जामो। दाईं ओर, मोना लिसा यहाँ वर्णित विधि का उपयोग करते हुए 534 बाइट्स तक संकुचित हो गई (यहाँ बताई गई बाइट्स डेटा बाइट्स का उल्लेख करती है, इसलिए यूनिकोड वर्णों का उपयोग करके व्यर्थ किए गए बिट्स को अनदेखा करना):

http://caca.zoy.org/raw-attachment/wiki/img2twit/minimona.jpg http://caca.zoy.org/raw-attachment/wiki/img2twit/minimona2.png

संपादित करें : बस छवियों के नवीनतम संस्करणों के साथ CJK पाठ को बदल दिया।


मुझे वास्तव में कोड को चलाने में सक्षम होने की आवश्यकता नहीं है (मैं इसे दिशानिर्देशों में चलाने के बारे में बताता हूं, एक सुझाव के रूप में, नियम नहीं); मैं इसे चलाने में सक्षम होना चाहता हूं, लेकिन मैं आपके द्वारा बनाई गई छवियों, कोड और किसी भी दिलचस्प ट्रिक्स या एल्गोरिदम की गुणवत्ता पर यह निर्णय ले सकता हूं। अगर मैं इसे चलाना चाहता हूं और इसके लिए ऐसे पैकेजों की आवश्यकता है जो मेरे पास नहीं हैं या मैं अपने मुख्य सिस्टम पर इंस्टॉल नहीं करना चाहता, तो मैं सिर्फ Amazon EC2 इंस्टेंस को बूट कर सकता हूं और इसे इंस्टॉल कर सकता हूं। जब तक आप पुस्तकालयों के साथ काम कर रहे होते हैं जो एक प्रमुख डिस्ट्रोस के लिए पैक किए जाते हैं, मुझे इसे चलाने में सक्षम होना चाहिए। सीजीएएल का उपयोग करने के लिए स्वतंत्र महसूस करें।
ब्रायन कैंपबेल

2
ठीक है, यहाँ मेरा समाधान (स्रोत कोड): caca.zoy.org/browser/libpipi/trunk/examples/img2twit.cpp मेरी व्याख्या का प्रयास और कुछ उदाहरण caca.zoy.org/wiki/img2twit पर हैं
sam hocevar

2
मुझे वास्तव में आपका समाधान पसंद है। आपको ब्लू चैनल को दिए गए मानों की संख्या को कम करने का प्रयास करना चाहिए क्योंकि मानव आंख नीले रंग को अच्छी तरह से हल नहीं कर सकती है: nfggames.com/games/ntsc/visual.shtm ; यह आपको कुछ रंग जानकारी खो जाने की कीमत पर अधिक विस्तार करने की अनुमति देगा। या शायद इसे हरे रंग में असाइन करें?
rpetrich

5
अच्छी बात। मैंने इस विचार के कुछ बदलावों की कोशिश की (RANGE_X परिभाषा से पहले टिप्पणी देखें) लेकिन बहुत अच्छी तरह से नहीं। जैसा कि आप देख सकते हैं, 6 के बजाय 5 नीले मूल्यों का उपयोग करते हुए त्रुटि को थोड़ा कम कर दिया 7 के हरे मूल्यों का उपयोग करने से कम हो गया। मैंने आलस से बाहर निकलने की कोशिश नहीं की। मेरे पास एक और समस्या यह है कि मेरे पास एक बहुत अच्छा त्रुटि फ़ंक्शन नहीं है। मैं वर्तमान में ∆ (∆r² + ²g∆ + ²b /) / 3 का उपयोग करता हूं, जो ठीक काम करता है। मैंने YUV के Y घटक पर आधारित tried (0.299∆r² + 0.587²g 0. + 0.114²b,) की कोशिश की, (कोई भौतिक औचित्य नहीं), लेकिन यह नीली त्रुटियों के साथ बहुत सहनशील था। मैं इस मुद्दे के बारे में कागजात खोजने की कोशिश करूंगा।
सैम होसेवर २६'०१

2
@ रैपेट्रीक: मैंने प्रोग्राम को संशोधित किया है ताकि इसे r / g / b रेंज को गतिशील रूप से बढ़ाया जा सके जब तक कि पर्याप्त बिट उपलब्ध हैं। यह सुनिश्चित करता है कि हम पूरे बिटस्ट्रीम में 13 से अधिक बिट्स कभी भी बर्बाद न करें (लेकिन व्यवहार में यह आमतौर पर 1 या 2 है)। और चित्र थोड़े बेहतर दिखते हैं।
सम होसेवार २

45

निम्नलिखित एक औपचारिक सबमिशन नहीं है, क्योंकि मेरे सॉफ़्टवेयर को संकेतित कार्य के लिए किसी भी तरह से अनुरूप नहीं किया गया है। DLI को एक अनुकूलन सामान्य उद्देश्य हानिपूर्ण छवि कोडेक के रूप में वर्णित किया जा सकता है। यह छवि संपीड़न के लिए PSNR और MS-SSIM रिकॉर्ड धारक है, और मुझे लगा कि यह देखना दिलचस्प होगा कि यह इस विशेष कार्य के लिए कैसा प्रदर्शन करता है। मैंने प्रदान की गई मोना लिसा छवि के संदर्भ का उपयोग किया और इसे 100x150 तक बढ़ा दिया, फिर इसे 344 बाइट्स में संपीड़ित करने के लिए DLI का उपयोग किया।

मोना लिसा डीएलआई http://i40.tinypic.com/2md5q4m.png

JPEG और IMG2TWIT संपीड़ित नमूनों के साथ तुलना करने के लिए, मैंने DLI का उपयोग छवि को 534 बाइट्स के साथ संपीड़ित करने के लिए किया। JPEG 536 बाइट्स है और IMG2TWIT 534 बाइट्स है। आसान तुलना के लिए छवियों को लगभग समान आकार तक बढ़ाया गया है। JPEG बाईं छवि है, IMG2TWIT केंद्र है, और DLI सही छवि है।

तुलना http://i42.tinypic.com/302yjdg.png

DLI छवि चेहरे की कुछ विशेषताओं को संरक्षित करने का प्रबंधन करती है, विशेष रूप से प्रसिद्ध मुस्कान :)।


6
उफ़। ऊपर डेनिस ली को श्रेय दिया जाना चाहिए, जिन्होंने इसे मूल रूप से प्रस्तुत किया था। मैंने अभी-अभी Googling द्वारा प्राप्त संदर्भ के लिए छवियों को इनलाइन और लिंक एम्बेड करने के लिए इसे संपादित किया है। और मुझे कहना होगा, वाह, मैं संपीड़न से प्रभावित हूं। मुझे डीएलआई संपीड़न की जांच करनी होगी।
ब्रायन कैंपबेल

1
वैसे, DLI लेखक "लंबे प्रसंस्करण समय" का उल्लेख करता है। जैसा कि मैं उसके सॉफ्टवेयर को चलाने में असमर्थ हूं, क्या आप हमें रफ कम्प्रेशन टाइम नंबर दे सकते हैं?
सम होसेवार

1
एक AMD Athlon64 2.4Ghz का उपयोग करते हुए, 100x150 मोना लिसा छवि का संपीड़न 38 सेकंड और डिकंपोजिशन 6 इंच तक ले जाता है। अधिकतम 251 बाइट्स की तुलना में कठिन है, उत्पादन की गुणवत्ता काफी कम है। संदर्भ मोना लिसा छवि का उपयोग करते हुए, मैंने इसे 60x91 तक बढ़ाया, फिर डीएलआई का उपयोग इसे 243 बाइट्स के लिए संपीड़ित करने के लिए किया (निकटतम 251 के करीब)। यह आउटपुट i43.tinypic.com/2196m4g.png है। विस्तार 534 बाइट डीएलआई के पास नहीं है, हालांकि बिटरेट केवल ~ 50% तक कम हो गया है। हालांकि, छवि की संरचना को काफी अच्छी तरह से बनाए रखा गया है।

1
250 बाइट संपीड़ित नमूनों की तुलना करना आसान बनाने का निर्णय लिया गया। 243 बाइट डीएलआई को स्केल किया गया और IMG2TWIT नमूने के पास रखा गया। बाईं ओर IMG2TWIT, दाईं ओर DLI। यहाँ छवि i40.tinypic.com/30ndks6.png

1
DLI JPEG की तरह एक गुणवत्ता पैरामीटर का उपयोग करता है, इसलिए यदि कोई लक्ष्य आउटपुट आकार वांछित है, तो परीक्षण-और-त्रुटि की आवश्यकता है।

21

मेरे समाधान का सामान्य अवलोकन होगा:

  1. मैं कच्चे डेटा की अधिकतम मात्रा की गणना के साथ शुरू करता हूं जिसे आप 140 utf8 वर्णों में फिट कर सकते हैं।
    • (मैं utf8 मान रहा हूं, जो कि मूल वेबसाइट ने दावा किया था कि ट्विटर ने इसे संदेशों में संग्रहीत किया है। यह ऊपर दिए गए समस्या कथन से भिन्न है, जो utf16 के लिए पूछता है।)
    • इस utf8 faq का उपयोग करते हुए , मैं गणना करता हूं कि आप एक एकल utf8 वर्ण में जो बिट्स को अधिकतम कर सकते हैं वह 31 बिट्स है। ऐसा करने के लिए, मैं U-04000000 - U-7FFFFFFF श्रेणी में मौजूद सभी वर्णों का उपयोग करूंगा। (1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx, 31 x के हैं, इसलिए मैं 31 बिट्स तक एनकोड कर सकता था)।
    • 31 बिट्स बार 140 अक्षर 4340 बिट्स के बराबर होता है। 524.5 प्राप्त करने के लिए 8 से विभाजित करें, और 542 बाइट्स के नीचे गोल करें ।
    • (यदि हम खुद को utf16 तक सीमित रखते हैं, तो हम प्रति चरित्र केवल 2 बाइट्स स्टोर कर सकते हैं, जो 280 बाइट्स के बराबर होगा)।
  2. मानक jpg कम्प्रेशन का उपयोग करके इमेज को कम करें।
    • छवि को लगभग 50x50px होने का आकार दें, फिर विभिन्न संपीड़न स्तरों पर इसे संपीड़ित करने का प्रयास करें जब तक कि आपके पास एक छवि न हो, जो कि 542 बाइट्स के करीब हो, बिना जाए।
    • यह 536 बाइट्स के नीचे संकुचित मोना लिसा का एक उदाहरण है।
  3. Utf-8 वर्णों में संपीड़ित छवि के कच्चे बिट्स को एनकोड करें।
    • प्रत्येक बाइट को निम्न बाइट्स में बदलें: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx, इमेज से बिट्स के साथ।
    • यह हिस्सा संभवतः वह हिस्सा होगा जहां अधिकांश कोड को लिखना होगा, क्योंकि ऐसा कुछ भी नहीं है जो वर्तमान में मौजूद है जो ऐसा करता है।

मुझे पता है कि आप कोड के लिए पूछ रहे थे, लेकिन मैं वास्तव में इसे वास्तव में कोड करने के लिए समय बिताना नहीं चाहता। मुझे लगा कि एक कुशल डिजाइन किसी और को इसे कोड करने के लिए प्रेरित कर सकती है।

मुझे लगता है कि मेरे प्रस्तावित समाधान का प्रमुख लाभ यह है कि यह यथासंभव मौजूदा तकनीक का पुन: उपयोग कर रहा है। यह एक अच्छा संपीड़न एल्गोरिदम लिखने की कोशिश करने के लिए मजेदार हो सकता है, लेकिन वहाँ एक बेहतर एल्गोरिथ्म होने की गारंटी है, सबसे अधिक संभावना उन लोगों द्वारा लिखी गई है जिनके पास उच्च गणित में डिग्री है।

एक अन्य महत्वपूर्ण नोट हालांकि यह है कि अगर यह तय किया जाता है कि utf16 पसंदीदा एन्कोडिंग है, तो यह समाधान अलग हो जाता है। 280 बाइट्स तक संकुचित होने पर jpegs वास्तव में काम नहीं करते हैं। हालांकि, शायद इस विशिष्ट समस्या बयान के लिए jpg की तुलना में बेहतर संपीड़न एल्गोरिदम है।


मैं अभी काम पर हूं, लेकिन जब मैं घर पहुंचता हूं तो मैं निश्चित रूप से इस समाधान को लागू करता हूं।
पाउलो सांतोस

2
मेरे प्रयोग से, ऐसा प्रतीत होता है कि यूटीएफ -16 वास्तव में है कि ट्विटर पात्रों को कैसे गिनता है; BMP वर्ण 1 के रूप में गिने जाते हैं, और उच्चतर वर्ण वर्ण 2 के रूप में गिने जाते हैं। यह प्रलेखित नहीं है, लेकिन यह है कि जब आप इनपुट बॉक्स में टाइप करते हैं तो उनका जावास्क्रिप्ट वर्ण काउंटर मायने रखता है। मूल सूत्र में टिप्पणियों में भी इसका उल्लेख है। मैंने यह देखने के लिए API के माध्यम से सबमिट करने का प्रयास नहीं किया है कि क्या काउंटर टूट गया है; अगर यह है, तो मैं वास्तविक बाधाओं के लिए समस्या का अद्यतन करूँगा। हालाँकि, आप मनमाने ढंग से यूटीएफ -8 का उपयोग करने में सक्षम होने की संभावना नहीं रखते हैं, क्योंकि उन लंबे अनुक्रमों में से जो आप सांकेतिक शब्दों में बदलना कर सकते हैं, वे वैध यूनीकोड ​​नहीं हैं।
ब्रायन कैंपबेल

4
उनके एपीआई के साथ परीक्षण के बाद, यह पता चला है कि वे यूनिकोड वर्णों (कोड अंक) द्वारा गणना करते हैं, न कि यूटीएफ -16 कोड इकाइयों (यह जावास्क्रिप्ट वर्ण काउंटर है जो यूटीएफ -16 के माध्यम से गिना जाता है, क्योंकि जाहिर है कि जावास्क्रिप्ट लंबाई विधि क्या करती है) । तो आप वहां कुछ और जानकारी प्राप्त कर सकते हैं; वैध यूनिकोड वर्ण U + 0000 से U + 10FFFF (प्रति वर्ण 20 बिट्स से थोड़ा अधिक; 2 ^ 20 + 2 ^ 16 संभव मान प्रति वर्ण) श्रेणी में हैं। यूटीएफ -8 यूनिकोड में अधिक मूल्यों की एन्कोडिंग की अनुमति देता है, इसलिए यदि आप अपने आप को यूनिकोड तक सीमित रखते हैं, तो आप लगभग 350 बाइट्स अंतरिक्ष में प्राप्त कर सकते हैं, 542 नहीं।
ब्रायन कैंपबेल

3
यह 536-बाइट मोना लिसा आश्चर्यजनक रूप से अच्छा लग रहा है, चरम संपीड़न को देखते हुए!
क्रिस

3
हम वर्तमान में 129,775 अलग-अलग (असाइन किए गए, गैर-नियंत्रण, गैर-निजी) यूनिकोड वर्णों को एन्कोड कर सकते हैं। यदि हम खुद को उस सबसेट में सीमित रखते हैं, तो यह कुल 2377 बिट्स या 297 बाइट्स है। यहाँ कोड: porg.es/blog/what-can-we-fit-in-140-characters
porges

20

ठीक है, मुझे खेल के लिए देर हो रही है, लेकिन फिर भी मैंने अपना प्रोजेक्ट बनाया।

यह एक खिलौना आनुवंशिक एल्गोरिथ्म है जो प्रारंभिक छवि को फिर से बनाने के लिए पारदर्शी रंगीन हलकों का उपयोग करता है।

विशेषताएं:

  • शुद्ध लुआ। कहीं भी चलता है जहाँ एक Lua दुभाषिया चलता है।
  • netpbm P3 प्रारूप का उपयोग करता है
  • यूनिट परीक्षणों के व्यापक सूट के साथ आता है
  • मूल छवि का आकार सुरक्षित रखता है

गलत feautres:

  • धीमा
  • इस अंतरिक्ष की कमी के कारण यह प्रारंभिक छवि की केवल मूल रंग योजना और कुछ विशेषताओं की एक सामान्य रूपरेखा को संरक्षित करता है।

यहाँ एक उदाहरण है जो लीना का प्रतिनिधित्व करता है: that that that that that that that that that that that that that that that岂 掂 戇 耔 攋 斘 眐 奡 萛 狂 昸 箆 亲 嬎 廙 栃 兡 塅 受 橯 恰 应 戞 优 猫 僘 瑩 吱 賾 卣 朸 杈 腠 綍 蝘 猕 屐 稱 悡 ​​詬 來 噩 压 罍 尕 熚 帤 厥 虤 嫐虲 兙 罨 縨 炘 排 叁 抠 堃 從 弅 慌 螎 熰 標 宑 簫 柢 橙 拃 丨 蜊 缩 昔 儻 舭 勵 癳 冂 囤 璟 彔 榕 兠 摈 侑 蒖 孂 埮 槃 姠 璐 哠 眛 嫡 琠 枀 訜 苄 暬厇 廩 焛 瀻 严 啘 刱 垫 仔

मूल लीना एन्कोडेड लीना

कोड bitbucket.org पर एक मरकरी रिपॉजिटरी में है। की जाँच करें http://bitbucket.org/tkadlubo/circles.lua


2
बहुत बढ़िया! स्वच्छ, कलात्मक दिखने वाली छवियां बनाता है। मुझे खुशी है कि लोग अभी भी इस पर काम कर रहे हैं; यह सभी अलग-अलग दृष्टिकोणों को देखने के लिए मज़ेदार है।
ब्रायन कैंपबेल

1
मैं इसे मूल पर एक पारदर्शी ओवरले की तरह इस्तेमाल करना चाहता हूं, जो बोकेह इफेक्ट जैसा कुछ दे रहा है।
निक रैडफोर्ड

19

निम्नलिखित समस्या के लिए मेरा दृष्टिकोण है और मुझे यह स्वीकार करना चाहिए कि यह काम करने के लिए काफी दिलचस्प परियोजना थी, यह निश्चित रूप से मेरे सामान्य दायरे से बाहर है और मुझे कुछ नया सीखने के लिए दिया है।

खान के पीछे मूल विचार इस प्रकार है:

  1. इमेज ग्रे-स्केल को डाउन-सैंपल दें, जिसमें कुल 16 अलग-अलग शेड्स थे
  2. छवि पर RLE प्रीफ़ॉर्म करें
  3. परिणाम को UTF-16 वर्णों में पैक करें
  4. वर्णों के किसी भी दोहराव को हटाने के लिए पैक किए गए परिणामों पर RLE को रोकें

यह पता चला है कि यह काम करता है, लेकिन केवल कुछ हद तक जैसा कि आप नीचे दिए गए नमूना चित्रों से देख सकते हैं। आउटपुट के संदर्भ में, एक नमूना ट्वीट क्या है, विशेष रूप से नमूनों में दिखाए गए लीना छवि के लिए।

乤 乤 万 乐 唂 伂 倂 倁 企 儂 2 企 倁 3 企 倁 2 企 伂 8 企 伂 3 企 伂 5 企 倂 倃 伂 倁 3 企 儁 企 2 伂 倃 5 企 倁 3 企 倃 4 企 倂 企 倁 企伂 2 企 伂 5 企 倁 企 伂 쥹 皗 鞹 鐾 륶 䦽 阹 럆 䧜 椿 籫 릹 靭 욶 옷뎷 歩 㰷 歉 䴗 鑹 㞳 鞷 㬼 獴 鏙 돗 鍴 祳 㭾 뤶 殞 焻 乹 Ꮛ 靆 䍼

जैसा कि आप देख सकते हैं, मैंने कोशिश की और चरित्र को थोड़ा सेट करने के लिए विवश किया; हालाँकि, मैं छवि रंग डेटा संग्रहीत करते समय ऐसा करने वाले मुद्दों में भाग गया। साथ ही, यह एन्कोडिंग योजना अतिरिक्त बिट जानकारी के लिए उपयोग किए जा सकने वाले डेटा के बिट्स को बर्बाद करने के लिए भी जाती है।

रन समय के संदर्भ में, छोटी छवियों के लिए कोड बेहद तेज है, प्रदान की गई नमूना छवियों के लिए लगभग 55ms, लेकिन समय बड़ी छवियों के साथ बढ़ता है। 512x512 लीना संदर्भ छवि के लिए रनिंग टाइम 1182ms था। मुझे ध्यान देना चाहिए कि ऑड्स बहुत अच्छे हैं कि कोड ही प्रदर्शन के लिए बहुत अनुकूलित नहीं है (उदाहरण के लिए सब कुछ बिटमैप के रूप में काम किया जाता है ) इसलिए समय कुछ रीफैक्टरिंग के बाद थोड़ा नीचे जा सकता है।

कृपया बेझिझक मुझे कोई सुझाव दें जो मैं बेहतर कर सकता था या कोड के साथ क्या गलत हो सकता है। रन टाइम और सैंपल आउटपुट की पूरी सूची निम्न स्थान पर पाई जा सकती है: http://code-zen.info/twitterimage/

अद्यतन एक

मैंने RLE कोड को अपडेट किया है जब ट्वीट स्ट्रिंग को कंप्रेस करके एक बेसिक लुक वापस किया जाता है और यदि ऐसा है तो आउटपुट के लिए उपयोग करें। यह केवल संख्या मूल्य जोड़े के लिए काम करता है, लेकिन यह डेटा के कुछ पात्रों को बचाता है। रनिंग टाइम कम या ज्यादा होने के साथ-साथ इमेज क्वालिटी भी होती है, लेकिन ट्वीट थोड़ा छोटा होता है। परीक्षण पूरा करते ही मैं वेबसाइट पर चार्ट को अपडेट करूंगा। निम्न प्रकार से एक उदाहरण ट्वीट स्ट्रिंग में से एक है, फिर से लीना के छोटे संस्करण के लिए:

乤 乤 万 乐 唂 伂 倂 倁 企 儂 2 企 倁 3 企 倁 ウ 伂 8 企 伂 エ 伂 5 企 倂 倃 伂 倁 グ 儁 企 2 伂 倃 ガ 倁 ジ 倃 4 企 倂 企 倁 企 伂 ツ 伂 ス 倁企 伂 쥹 皗 鞹 鐾 륶 䦽 阹 럆 䧜 椿 籫 릹 靭 욶 옷뎷 歩 㰷 歉 䴗 鑹 㞳 鞷 㬼 獴 鏙 돗 鍴 祳 㭾 뤶 殞 焻 乹 Ꮛ 靆 䍼

अपडेट दो

एक और छोटा सा अपडेट, लेकिन मैंने कलर शेड्स को चार के विपरीत पैक करने के लिए कोड को संशोधित किया, यह कुछ और स्थान का उपयोग करता है, लेकिन जब तक मुझे कुछ याद नहीं आ रहा है, इसका मतलब यह होना चाहिए कि "विषम" वर्ण अब दिखाई नहीं देते हैं जहां रंग डेटा है इसके अलावा, मैंने कम्प्रेशन को थोड़ा और अपडेट किया ताकि यह अब पूरे स्ट्रिंग पर काम कर सके क्योंकि सिर्फ कलर काउंट ब्लॉक के विपरीत। मैं अभी भी रन बार का परीक्षण कर रहा हूं, लेकिन वे नाममात्र में सुधार करते हुए दिखाई देते हैं; हालाँकि, छवि गुणवत्ता अभी भी समान है। लीना के ट्वीट का नवीनतम संस्करण क्या है:

2 乤 万 乐 唂 伂 倂 倁 企 儂 2 企 倁 3 企 倁 ウ 伂 8 企 伂 エ 伂 5 企 倂 倃 伂 倁 グ 儁 企 2 伂 倃 ガ 倁 ジ 倃 4 企 倂 企 倁 企 伂 ツ 伂 ス 倁企 伂 坹 坼 坶 坻 刾 啩 容 力 吹 婩 媷 劝 圿 咶 坼 妛 啭 奩 嗆 婣 冷 咛 啫 凃 奉 佶 坍 均 喳 女 媗 决 兴宗 喓 夽 兴 唹 屹 冷 圶 埫 奫 唓 坤 喝 奎 似商 嗉 乃

StackOverflow Logo http://code-zen.info/twitterimage/images/stackoverflow-logo.bmp कॉर्नेल बॉक्स http://code-zen.info/twitterimage/images/cornell-box.bmp Lb http: // code-zen .info / twitterimage / images / lena.bmp मोना लिसा http://code-zen.info/twitterimage/images/mona-lisa.bmp


1
महान, प्रविष्टि के लिए धन्यवाद! ग्रेस्केल वास्तव में इनमें से अधिकांश के लिए काफी अच्छी तरह से काम करता है, हालांकि लीना को बाहर करना थोड़ा कठिन है। मुझे आपके स्रोत की तलाश थी लेकिन 404 मिला; क्या आप सुनिश्चित कर सकते हैं कि यह वहाँ है?
ब्रायन कैंपबेल

अब इसे दोबारा जांचें, मैं साइट को अपडेट कर रहा था ताकि आपने मुझे अपडेट के बीच पकड़ा हो।
rjzii

हां, मैं इसे अभी डाउनलोड कर सकता हूं। अब निश्चित रूप से मुझे यह पता लगाने की आवश्यकता है कि क्या मैं मोनो को इसे संकलित कर सकता हूं।
ब्रायन कैंपबेल

हां! मोनो के तहत काम करता है, मैं "-r System.Drawing TwitterImage.cs Program.cs gmcs" के साथ संकलित और "मोनो TwitterImage.exe एनकोड lena.png lena.txt" के साथ चलाने
ब्रायन कैंपबेल

ठंडा! मैंने यह सुनिश्चित करने के लिए दोहरी जांच की कि मैं जिन पुस्तकालयों का उपयोग कर रहा था, वे मोनो के लिए सूचीबद्ध थे, लेकिन मैंने वास्तव में मोनो के साथ काम नहीं किया है, इसलिए मुझे यकीन नहीं था कि यह होगा या नहीं।
rjzii

15

यह आनुवंशिक एल्गोरिथ्म जो रोजर अलसिंग ने लिखा था, लंबे संपीड़न समय की कीमत पर एक अच्छा संपीड़न अनुपात है। वर्टिकल के परिणामस्वरूप वेक्टर को एक हानिपूर्ण या दोषरहित एल्गोरिथ्म का उपयोग करके और अधिक संकुचित किया जा सकता है।

http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona-lisa/

लागू करने के लिए एक दिलचस्प कार्यक्रम होगा, लेकिन मैं इसे मिस करूंगा।


12

मूल चुनौती में आकार की सीमा को परिभाषित किया गया है जो कि ट्विटर अभी भी आपको भेजने की अनुमति देता है यदि आप अपने टेक्स्ट को उनके टेक्स्टबॉक्स में पेस्ट करते हैं और "अपडेट" दबाते हैं। जैसा कि कुछ लोगों ने सही ढंग से देखा कि यह आपके मोबाइल से एक एसएमएस पाठ संदेश के रूप में जो आप भेज सकते हैं, उससे अलग है।

जो खोजपूर्ण रूप से उल्लिखित नहीं है (लेकिन मेरा व्यक्तिगत नियम क्या था) यह है कि आप अपने ब्राउज़र में ट्वीट किए गए संदेश का चयन करने में सक्षम होना चाहिए, इसे क्लिपबोर्ड पर कॉपी करें और इसे अपने डिकोडर के टेक्स्ट इनपुट क्षेत्र में पेस्ट करें ताकि यह इसे प्रदर्शित कर सके। निश्चित रूप से आप संदेश को टेक्स्ट फ़ाइल के रूप में सहेजने के लिए स्वतंत्र हैं और इसे वापस पढ़ें या ऐसा टूल लिखें जो Twitter API तक पहुंचता है और किसी भी संदेश को फ़िल्टर करता है जो छवि कोड (विशेष मार्कर; wink wink ) की तरह दिखता है । लेकिन नियम यह है कि संदेश को ट्विटर से गुजरना पड़ता है, इससे पहले कि आपको इसे डिकोड करने की अनुमति दी जाए।

350 बाइट्स के साथ सौभाग्य - मुझे संदेह है कि आप उनका उपयोग करने में सक्षम होंगे।


1
हां, मैंने एक स्कोरिंग रुब्रिक जोड़ा है जो इंगित करता है कि चरित्र सेट पर तंग प्रतिबंध पसंद किए जाते हैं, लेकिन आवश्यक नहीं। मैं एक नियम रखना चाहता हूं जिसके लिए संदेश ट्विटर के माध्यम से अनसुना कर दिए जाते हैं, लेकिन इससे बहुत सारे मुकदमे और त्रुटि होती हैं, जिससे पता चलता है कि क्या काम करता है, और मैं रचनात्मक उपयोग की अनुमति देने के लिए कुछ रास्ते छोड़ना चाहता था। कोड स्थान। तो, मेरी चुनौती में एकमात्र आवश्यकता 140 वैध यूनिकोड वर्णों की है। वैसे, द्वारा रोकने के लिए धन्यवाद! मैं वास्तव में आपके समाधान को पसंद करता हूं, और यह देखना चाहता हूं कि क्या किबिट्जर्स में से कोई भी वास्तव में इस पर सुधार कर सकता है।
ब्रायन कैंपबेल

12

एक मोनोक्रोम या ग्रेस्केल छवि को पोस्ट करने से उस छवि का आकार बेहतर होना चाहिए जो उस स्थान पर एन्कोड किया जा सकता है क्योंकि आप रंग की परवाह नहीं करते हैं।

संभवतः तीन छवियों को अपलोड करने की चुनौती को बढ़ाता है, जो तब पुन: संयोजित होती है जब आप प्रत्येक पूर्ण छवि में एक मोनोक्रोम संस्करण को बनाए रखते हुए एक पूर्ण रंग छवि देते हैं।

ऊपर कुछ संपीड़न जोड़ें और यह व्यवहार्य दिखना शुरू कर सकता है ...

नाइस !!! अब आप लोगों ने मेरी रुचि को बढ़ा दिया है। बाकी दिनों के लिए कोई काम नहीं किया जाएगा ...


9
s / नुकीला / नुकीला / छ
ग्यारह ग्यारह

1
मुझे तीन छवियों का विचार पसंद है, ट्विटर पर इस तरह के विचार को लागू करना संभव होना चाहिए और परिणाम बहुत अच्छा होगा।
Makis

9

इस चुनौती के एन्कोडिंग / डिकोडिंग भाग के बारे में। base16b.org उच्चतर यूनिकोड विमानों में बाइनरी डेटा को सुरक्षित और कुशलता से एन्कोडिंग करने के लिए एक मानक विधि निर्दिष्ट करने का मेरा प्रयास है।

कुछ सुविधाएं :

  • केवल यूनिकोड के निजी उपयोगकर्ता क्षेत्रों का उपयोग करता है
  • प्रति वर्ण 17 बिट तक एनकोड करता है; बेस64 की तुलना में लगभग तीन गुना अधिक कुशल है
  • एक संदर्भ जावास्क्रिप्ट एन्कोड / डिकोड का कार्यान्वयन प्रदान किया जाता है
  • कुछ नमूना एन्कोडिंग शामिल हैं, जिनमें ट्विटर और वर्डप्रेस शामिल हैं

क्षमा करें, यह उत्तर मूल प्रतियोगिता के लिए बहुत देर से आता है। मैंने इस पद के लिए स्वतंत्र रूप से परियोजना शुरू की थी, जिसे मैंने आधे रास्ते में खोजा था।


8

संदर्भ छवियों का एक गुच्छा संग्रहीत करने का विचार दिलचस्प है। क्या नमूना चित्रों के 25Mb को स्टोर करना इतना गलत होगा, और एनकोडर ने उन बिट्स का उपयोग करके एक छवि बनाने और बनाने की कोशिश की है? इस तरह के माइनसक्यूल पाइप के साथ, अंत में मशीनरी आवश्यकता से गुजरने वाले डेटा की मात्रा से बहुत अधिक होने वाली है, इसलिए 25Mb कोड और 1Mb कोड और 24Mb छवि डेटा के बीच क्या अंतर है?

(ध्यान दें कि मूल दिशानिर्देशों ने पुस्तकालय में पहले से ही छवियों के इनपुट को प्रतिबंधित करने से इनकार कर दिया है - मैं यह सुझाव नहीं दे रहा हूं)।


1
यह तब तक ठीक रहेगा, जब तक आपके पास समापन बिंदु पर डेटा की निश्चित, परिमित मात्रा है। बेशक, आपको यह दिखाना होगा कि यह उन चित्रों के साथ काम करता है जो प्रशिक्षण सेट में नहीं हैं, किसी भी सांख्यिकीय प्राकृतिक भाषा प्रक्रिया समस्या की तरह। मैं कुछ ऐसा देखना पसंद करूँगा जो इमेज एन्कोडिंग के लिए एक सांख्यिकीय दृष्टिकोण लेता है।
ब्रायन कैंपबेल

16
मैं, एक के लिए, स्रोत के रूप में केवल Boba Fett प्रशंसक कला का उपयोग करके मोना लिसा को फिर से देखना पसंद करूंगा।
नोसरेडना

मैं सहमत हूँ - फोटोमैक्विक दृष्टिकोण नियमों के भीतर होता है और यह देखने के लिए बेहद दिलचस्प होगा कि कोई व्यक्ति किसी को छुरा ले जाए।
अपराह्न

8

मूर्ख विचार, लेकिन sha1(my_image)किसी भी छवि के "पूर्ण" प्रतिनिधित्व (टकरावों की अनदेखी) के परिणामस्वरूप होगा। स्पष्ट समस्या यह है कि डिकोडिंग प्रक्रिया में ब्रूट-फोर्सिंग की अपर्याप्त मात्रा की आवश्यकता होती है।

1-बिट मोनोक्रोम थोड़ा आसान होगा .. प्रत्येक पिक्सेल 1 या 0 हो जाता है, इसलिए आपके पास 100 * 100 पिक्सेल छवि के लिए 1000 बिट डेटा होगा। चूंकि SHA1 हैश 41 वर्ण है, हम तीन को एक संदेश में फिट कर सकते हैं, केवल 3333 बिट्स के 2 सेट और 3334 के एक सेट को बल देना होगा (हालांकि वह भी अभी भी अशुभ है)

यह बिल्कुल व्यावहारिक नहीं है। यहां तक ​​कि निर्धारित लंबाई 1-बिट 100 * 100px छवि के साथ .., यह मानते हुए कि मैं तीन अंकों में विभाजित होने पर, मिसकॉलिंग नहीं कर रहा हूं, 49995000 संयोजन या 16661667।

def fact(maxu):
        ttl=1
        for i in range(1,maxu+1):
                ttl=ttl*i
        return ttl

def combi(setsize, length):
    return fact(length) / (fact(setsize)*fact(length-setsize))

print (combi(2, 3333)*2) + combi(2, 3334)
# 16661667L
print combi(2, 10000)
# 49995000L

10
Sha1 (my_image) के साथ मुद्दा यह है कि यदि आपने अपना समय ब्रूट को मजबूर करने में बिताया है, तो वास्तविक छवि मिलने से पहले आपको संभवतः कई टकराव होंगे; और निश्चित रूप से जानवर मजबूर करने के लिए sha1 बहुत कम्प्यूटेशनल रूप से infeasible है।
ब्रायन कैंपबेल

5
SHA1 संपीड़न से भी बेहतर: मेरा "फ़्लिकर" संपीड़न एल्गोरिदम! चरण 1: फ़्लिकर के लिए छवि अपलोड करें। चरण 2: ट्विटर पर इसके लिए एक लिंक पोस्ट करें। Tadda! केवल 15 बाइट्स का उपयोग करता है!
niXar

2
niXar: नहींं, नियम 3.4: "डिकोडिंग प्रक्रिया में उपरोक्त निर्दिष्ट आउटपुट के अलावा एन्कोडिंग प्रक्रिया के किसी अन्य आउटपुट तक कोई पहुंच नहीं हो सकती है; अर्थात, आप कहीं छवि अपलोड नहीं कर सकते हैं और डिकोडिंग प्रक्रिया के लिए URL आउटपुट कर सकते हैं। डाउनलोड, या ऐसा कुछ भी मूर्खतापूर्ण। "
dbr

6
मुझे पता है, मैं व्यंग्यात्मक था।
नीकर


0

विचार: क्या आप एक पैलेट के रूप में एक फ़ॉन्ट का उपयोग कर सकते हैं? वेक्टर सेट की एक श्रृंखला के साथ उन्हें वर्णन करने की कोशिश कर रहे वैक्टर की एक श्रृंखला में एक छवि को तोड़ने की कोशिश करें (प्रत्येक चरित्र अनिवार्य रूप से वैक्टर का एक सेट है)। यह एक शब्दकोश के रूप में फ़ॉन्ट का उपयोग कर रहा है। मैं उदाहरण के लिए एक ऊर्ध्वाधर रेखा के लिए अल का उपयोग कर सकता है और - एक क्षैतिज रेखा के लिए? एक विचार है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.