2011-07-07 20 views
7

मैं एक प्रोजेक्ट लिख रहा हूं जहां मुझे नेट पर समान छवियों का एक सेट स्थानांतरित करने की आवश्यकता है। चीजों को गति देने के लिए, मैंने सोचा कि अधिकांश मूवी कोडेक्स क्या करते हैं। keyframes होने और फिर बस परिवर्तन भेजें।छवियों के लिए diff/पैच

अब, क्या मुझे मिल गया एक सादृश्य में ऐसा टेक्स्ट फ़ाइल में मैं मूल रूप से सिर्फ उन्हें यदि अंतर और पैच भेजना चाहते हैं BufferedImage रों का एक सेट है। हालांकि मैंने पहले कभी छवियों के साथ काम नहीं किया है, इसलिए यदि मैं ऐसा करूँगा, तो यह बदसूरत होगा।

तो, इस तरह कुछ लागू करने का सबसे अच्छा तरीका क्या है, या इस तरह से कुछ के लिए पहले से ही एक अच्छा कार्यान्वयन है?

मुझे लगता है कि एक बाइट सरणी और बाइनरी diff में छवियों को संग्रहित करना वे बहुत प्रभावी नहीं होंगे।

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

+0

हो सकता है कि आप छवियों को एक बड़ी छवि (और किसी भी सामान्य प्रारूप में संपीड़ित करने), या ज़िप (या समान) संग्रह में पैक करके एक मौजूदा संपीड़न एल्गोरिदम आपके लिए काम कर सकें। – tjollans

+0

कोई विकल्प नहीं है अगर मुझे उन्हें स्ट्रीम करने की आवश्यकता है। – lawl0r

+0

हम किस प्रकार की स्ट्रीमिंग के बारे में बात कर रहे हैं? –

उत्तर

5

एक सरल दृष्टिकोण दो छवियों पर एक एक्सओआर ऑपरेशन के बराबर करना होगा। यह पिक्सल को प्रकट करेगा जो समान हैं (शून्य होगा) और पिक्सेल जो बदल गए हैं (गैर-शून्य)।

यदि आपको लगभग अचूक मतभेदों की परवाह नहीं है तो वैकल्पिक रूप से, 'घटाव' मिश्रण का उपयोग करें, फिर एक या दो बिट अंतर को त्यागने के लिए दाएं स्थानांतरित करें।

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

प्राप्त करने के अंत में, रिवर्स प्रक्रिया उतनी सरल है। डेल्टा और बाउंडिंग बॉक्स को देखते हुए, डेल्टा को डिकंप्रेस करें, फिर पिछली/मौजूदा छवि के प्रभावित क्षेत्र में इसे लागू करें (एक्सओआर, या बाएं-शिफ्ट फिर जोड़ें)।

अधिक परिष्कृत, लापरवाही दृष्टिकोण के लिए, एनिमेटेड जीआईएफ/पीएनजी एनिमेटेड हैं और फ़्रेम के बीच डेल्टा जानकारी की गणना/एन्कोड करने के लिए क्या एल्गोरिदम का उपयोग किया जाता है।देखें, उदाहरण के लिए, What's the best way to make an animated GIF using an algorithm?

असली दुनिया की इमेजरी से निपटने के दौरान और यदि आप हानिकारक मार्ग पर जाने के इच्छुक हैं तो एक और अधिक परिष्कृत दृष्टिकोण के लिए- तो आप पहले ही इस पर संकेत देते हैं। देखें कि कैसे वीडियो कोडेक्स फ्रेम को एन्कोड/ट्रांसमिट करते हैं, उदाहरण के लिए MPEG Video Encoding

यह कह रही है कि (एन्कोडिंग/डिकोडिंग प्रक्रिया का) जटिलता के बीच एक समंजन और कुछ बिंदु पर प्रेषित डेटा के आकार में कमी है क्योंकि आप तय करने के लिए दोनों छोर पर गणना में जोड़ा भूमि के ऊपर है कि क्या होगा बिना चला जाता है संचरण में बचत के लायक है।

+0

यह कुछ अच्छे विचार हैं, धन्यवाद – lawl0r

0

आप जिस काम को निवेश करना चाहते हैं उसके आधार पर मैं सुझाव दूंगा एक आसान समाधान, उन छवियों को बिटमैप्स के रूप में सहेजें और उन्हें 7z संपीड़ित करने दें। फिर संग्रह भेजें।

+0

हाँ, दुर्भाग्यवश यह वह नहीं है जिसे मैं ढूंढ रहा हूं, मुझे वास्तव में उन्हें "diff" करने की आवश्यकता है क्योंकि इसे तेज़ होने की आवश्यकता है। – lawl0r

3

आप getRGB(int x, int y) का उपयोग कर BufferedImage के सभी पिक्सल पर फिर से सक्रिय कर सकते हैं।

for (int x = 0; x < img.getWidth(); ++x) 
{ 
    for (int y = 0; y < img.getHeight(); ++y) 
    { 
     int oldARGB = oldImg.getRGB(x, y); 
     int newARGB = img.getRGB(x, y); 
     if (oldARGB != newARGB) 
     { 
      // handle the diffrence 
     } 
    } 

} 
+0

'भिन्नता को संभालें' मुझे लगता है कि यह वास्तव में दिलचस्प हिस्सा है। आपको मतभेदों को कुशल तरीके से प्रसारित करने में सक्षम होना चाहिए। –

+0

धन्यवाद, लेकिन मेरा सवाल यह था कि एक अच्छा एल्गोरिदम कैसा दिख सकता है। मेरा मतलब है कि मैं कुछ गुणवत्ता हानि के साथ रह सकता हूं। इसलिए यदि अल्फा मान एक से बदल गया है तो मुझे पिक्सेल को अपडेट करने की आवश्यकता नहीं है। ऐसा करने के लिए सबसे अच्छी बात क्या है, जैसे कि 5x5px भाग या जो भी और हाँ के साथ काम करना, अंतर को संभालना मुझे वास्तव में परवाह है। – lawl0r

+1

आप एक नया बुफर्ड इमेज (डेल्टा) बना सकते हैं, शुरुआत में सभी पिक्सल 100% पारदर्शी (या कुछ अन्य निश्चित मान), और उस छवि में सभी बदले गए पिक्सेल की प्रतिलिपि बना सकते हैं। इसे एक पीएनजी के रूप में भेजें, और प्राप्त करने वाले अंत में सभी पिक्सल के माध्यम से लूप, गैर-पारदर्शी पिक्सेल को कॉपी करना। – tjollans

-1

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

गति बढ़ाने के लिए, मैं करने के बारे में सोचा ...

यह एक आवश्यकता नहीं है सिर्फ एक 'यह अगर शांत नहीं होगा ...'। आज की नेटवर्क की गति के साथ, एक सौ मिनट से भी कम समय में कुछ सौ मेग्स स्थानांतरित किया जा सकता है।

+0

? हाँ सही ... – lawl0r

+0

मेरे पास 2 एमबीपीएस अपस्ट्रीम है। यदि खराब इंटरनेट को कोड की इस जटिलता की आवश्यकता होती है, तो शायद आसान समाधान एक बेहतर इंटरनेट पैकेज प्राप्त हो सकता है? क्षमा करें अगर यह उत्तर वह नहीं है जिसे आप सुनना चाहते थे, तो मैं सिर्फ एक अलग दृष्टिकोण प्रदान करना चाहता था। –

1

मैं एक विचार आया है, वास्तव में यह बहुत ही सरल है। पिक्सेल की तुलना एक

यदि पिक्सेल बराबर है, तो आरजीबीए (0, 0, 0, 0) के रूप में सहेजें। फिर पीएनजी के रूप में diff स्टोर करें।

यह डेमो परिणाम है। अंतर बहुत छोटा है।

स्टैक ओवरफ्लो you need at least 10 reputation to post images कहता है। तो मैं यहां केवल छवि पता पोस्ट कर सकता हूं।

http://oi61.tinypic.com/2vs5ifl.jpg

0

आप गुणवत्ता में कुछ कमी कोई आपत्ति नहीं है और आप के लिए शारीरिक कार्यों का एक बहुत बिना बैंडविड्थ के संदर्भ में एक बहुत कुशल समाधान चाहते हैं, तो आप भी केवल आपके छवियों को एक वास्तविक फिल्म कोडेक के साथ सांकेतिक शब्दों में बदलना कर सकता है । विशेष रूप से आपके पास गणना को ऑफ़लोड करने के लिए एक GPU है कि दृष्टिकोण कम्प्यूटेशनल प्रयास के संदर्भ में भी बहुत प्रभावी हो सकता है।

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