एक छवि फ़ाइल के लिए स्मृति आवश्यकताओं को समझना


9

मैं 240x400 रिज़ॉल्यूशन डिस्प्ले पर प्रदर्शित होने वाली छवि संसाधन फ़ाइलों के लिए मेमोरी आवश्यकताओं को समझना चाहता हूं।

डिस्प्ले में निम्नलिखित स्पेक्स हैं:

चश्मा

यह 18 बिट्स रंग की गहराई तक समर्थन करता है और ILI9327 डिस्प्ले ड्राइवर का उपयोग करता है।

यह मानते हुए कि मुझे 50 अलग-अलग आइकन प्रदर्शित करने हैं, प्रत्येक का आकार 10 मिमी X 10 मिमी है, भंडारण स्थान की आवश्यकता क्या है?

यहाँ मेरी गणना कर रहे हैं:

पिक्सेल प्रति मिमी = 400 / 61.2 = 6.536

एक छवि में पिक्सेल की संख्या = 65.36 x 65.36 = 4272 पिक्सेल

प्रत्येक पिक्सेल को 18 बिट्स एक्स 3 (आर, जी और बी के लिए) = 54 बिट्स की आवश्यकता होगी

कुल बिट्स की आवश्यकता = 4272 x 54 = 230688 बिट्स = 28.16 किलोबाइट

50 छवियों के लिए, मुझे 1.375 मेगाबाइट भंडारण की आवश्यकता होगी।

क्या मेरा हिसाब सही है?


2
आप ऊपरी-स्तरीय भंडारण आवश्यकताओं की गणना कर रहे हैं। आमतौर पर छवियां संपीड़ित होती हैं, और अक्सर यह पढ़ने में तेज होता है और गैर-संपीड़ित फ़ाइल से अतिरिक्त बाइट्स पढ़ने की तुलना में (एसडी कार्ड से) मक्खी पर डिकम्प्रेस होता है। यह अक्सर इसलिए होता है क्योंकि डिवाइस I / O एक अड़चन है।
किंग्सले

जवाबों:


17

पिक्सेल प्रति मिमी = 400 / 61.2 = 6.536

हाँ।

एक छवि में पिक्सेल की संख्या = 65.36 x 65.36 = 4272 पिक्सेल

ठीक है, आप प्रति आइकन पिक्सेल का मतलब है। लेकिन फिर भी, आप भिन्नात्मक पिक्सल का उत्पादन नहीं कर सकते हैं, इसलिए आपकी संख्या या तो 65 x 65 या 66 x 66 होनी चाहिए। और इससे आगे सरलीकरण होता है। अपने आइकन 64 x 64 क्यों नहीं बनाएं? यह आपकी मेमोरी के लिए पता गणना को सरल करेगा, और केवल लगभग 2% का "सिकुड़न" उत्पन्न करेगा। और मुझ पर भरोसा करो, इस आकार पर किसी का ध्यान नहीं जाएगा। तब आपके आइकन आकार में 4096 पिक्सेल होंगे।

प्रत्येक पिक्सेल को 18 बिट्स एक्स 3 (आर, जी और बी के लिए) = 54 बिट्स की आवश्यकता होगी

नहीं। जैसा कि jms ने उत्तर दिया है, यह कुल पिक्सेल प्रति 18 बिट्स या प्रति रंग 6 बिट्स है। फिर, हालांकि, आपको बिट स्तर के बारे में बहुत चिंता करने पर विचार नहीं करना चाहिए। अपने रंग मूल्यों को आंशिक बाइट्स (6 बिट प्रति बाइट) के रूप में अलग-अलग बाइट्स प्रति रंग के साथ स्टोर करें। यह 33% अधिक मेमोरी लेगा, लेकिन मेमोरी से स्क्रीन पर ट्रांसफर करते समय आपके प्रोसेसिंग लोड को काफी कम कर देगा।

कुल बिट्स की आवश्यकता = 4272 x 54 = 230688 बिट्स = 28.16 किलोबाइट

कुल बिट्स 4096 x 24, या 98304 बिट्स, या 12288 बाइट्स हैं।

50 छवियों के लिए, मुझे 1.375 मेगाबाइट भंडारण की आवश्यकता होगी।

12288 गुना 50 614400 बाइट देता है।


1
लेकिन निश्चित रूप से अगर हम लगातार भंडारण के बारे में बात कर रहे हैं तो आप अपने आइकन को पीएनजी या जेपीईजी के रूप में संपीड़ित करेंगे? या अगर हम फ्रेम बफ़र की बात कर रहे हैं तो यह बस (display_width * display_height * bpp) / 8बाइट्स है?
अरथ

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

11

आइकन 64 × 64 पिक्सेल बनाकर अपने लिए जीवन को सरल बनाएं। यदि आप चाहते हैं कि वे बड़े दिखें तो उनके चारों ओर एक बॉर्डर बनाएं।

16-बिट रंग प्रारूप के साथ, इसमें केवल 50 के सेट के लिए 8 केबी प्रति आइकन या 400 केबी की आवश्यकता होती है।

संपीड़न का एक सरल रूप हर पिक्सेल के रंग को सीधे संग्रहीत करने के बजाय रंग तालिका का उपयोग करना है। एक आइकन के लिए 16 रंग अक्सर पर्याप्त से अधिक होते हैं, खासकर यदि आप थोड़ा रचनात्मक डाइटिंग लागू करते हैं। यह प्रति आइकन 2 केबी तक भंडारण को कम करता है, साथ ही रंग तालिका के लिए 32 बाइट्स। कुल संग्रहण 101 kB से अधिक है यदि प्रत्येक आइकन की अपनी रंग तालिका है।


बस अपनी जिज्ञासा को पूरा करने के लिए, मैंने निम्नलिखित "सबसे खराब स्थिति" वाली छवि ( यहाँ से ) को पकड़ा :

रंगों की शक्ति

यह ImageMagick कमांड लाइन है

convert image.jpg -crop 267x267+66+0 -resize 64x64 -colors 16 final.png

इसे इस में बदल दिया:

यहां छवि विवरण दर्ज करें

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

यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें


2
कीवर्ड: अनुक्रमित रंग । यदि प्रति बिटमैप 16 रंग पर्याप्त नहीं हैं, तो आप आइकन को कई अलग-अलग पैलेट में से प्रत्येक में विभाजित कर सकते हैं। लागू करने तड़पना भी मदद मिल सकती है।
at१

9

रंग गहराई के बारे में अधिक

डेव ट्वीड के जवाब पर विस्तार से, आप जो उन्होंने दिखाया उससे भी बेहतर कर सकते हैं।

यहाँ एक ही बड़े आकार का मूल प्रयोग किया गया है:

64 x 64 पिक्सेल के लिए चौकोर और सिकुड़ा हुआ, लेकिन पूर्ण (8 बिट प्रति लाल, grn, blu) रंग पैदावार का उपयोग:

प्रति चैनल 8 बिट्स से 6 बिट्स तक रंग जानकारी राउंड करना:

यही कारण है कि आपका प्रदर्शन क्या कर सकता है, क्योंकि आप कहते हैं कि यह 18 बिट रंग की गहराई का समर्थन करता है।

लाल रंग के लिए 5 बिट्स, हरे रंग के लिए 6, और नीले रंग के लिए 5, कुल 16 बिट्स / पिक्सेल पैदावार के लिए रंग जानकारी को गोल करना:

यह वास्तव में माउस के लिए काफी अच्छा होना चाहिए।

बिना किसी कंप्रेशन के भी, इस फॉर्मेट के आइकन केवल 64 x 64 x 2 = 8192 बाइट लेते हैं। 50 ऐसी छवियों के लिए 409,600 बाइट की आवश्यकता होगी।


2
मेरी छवि 4 बिट्स प्रति पिक्सेल (16 रंग) - 2k बाइट्स प्रति आइकन, साथ ही 32-बाइट लुकअप टेबल के नीचे संकुचित है। मैं दिखाना चाहता था कि रंगों के एक सीमित सेट के साथ क्या दिख रहा है।
डेव ट्वीड

चूंकि हम अलग-अलग रंग की गहराई की तुलना कर रहे हैं, एक 8-बिट कॉलॉर्मैप के साथ एक को जोड़ने की देखभाल? यह 4-बिट और 16-बिट वेरिएंट के बीच का आधा हिस्सा (लघुगणकीय) हमारे यहां पहले से ही है।
इलकाचू

@Dave: यह आपके उत्तर से स्पष्ट नहीं था, लेकिन यह कलात्मक कलाकृतियों की व्याख्या करता है।
ओलिन लेट्रोप

8

प्रत्येक पिक्सेल को 18 बिट्स एक्स 3 (आर, जी और बी के लिए) = 54 बिट्स की आवश्यकता होगी

आपका अनुमान गलत है। "18 बिट्स" का मूल्य प्रति पिक्सेल है , रंग के अनुसार नहीं। लाल, हरे और नीले चैनल प्रत्येक की अधिकतम बिट 6 बिट्स (64 अलग-अलग मान), कुल 18 बिट्स हैं।
यह डिस्प्ले कंट्रोलर 16-बिट मोड (जहां पिक्सेल डेटा में केवल 5 बिट्स के लिए लाल, 6 के लिए हरा और नीले के लिए 5) का समर्थन करता है, जो प्रत्येक पिक्सेल को सिर्फ दो बाइट्स में पैक करना आसान बनाता है। इससे बिटमैप को कुशलतापूर्वक स्टोर करना आसान हो जाता है और प्रति सेकंड डिस्प्ले पर आप जितने पिक्सल लिख सकते हैं, उतनी बढ़ जाती है।

यहां छवि विवरण दर्ज करें

एक छवि में पिक्सेल की संख्या = 65.36 x 65.36 = 4272 पिक्सेल

आप व्यावहारिक रूप से आंशिक पिक्सेल स्टोर नहीं कर सकते हैं , इसलिए आपके वास्तविक बिटमैप (चित्र / स्प्राइट / वर्ण / जो भी हो) संभवतः 65 2 = 4225 पिक्सेल होंगे।

आसान मार्ग (16-बिट R5G6B5 पिक्सेल प्रारूप) पर जाने पर, 4225 * 16 बिट्स 67600 बिट्स प्रति बिटमैप या 8450 बाइट प्रति बिटमैप की राशि होगी। 50 छवियों को 423 केबी (बिना किसी संपीड़न के) की आवश्यकता होगी।

यदि आप वास्तव में पूर्ण रंग गहराई चाहते हैं, तो आपको प्रति पिक्सेल 2 बाइट से अधिक की आवश्यकता है। उस स्तर पर आप बस प्रत्येक रंग के लिए एक बाइट समर्पित कर सकते हैं (जैसा कि व्हाट्सएप पूर्व का पता चलता है), जो आगे भंडारण आवश्यकता को 3/2 (50 65x65 बिटमैप के लिए 634 केबी) बढ़ा देगा।

आप किसी भी बिट्स को बर्बाद किए बिना, 18-बिट पिक्सल को मेमोरी में एक-दूसरे के बगल में (बाइट सीमाओं के साथ अलंकृत बिट्स) पैक कर सकते हैं। आपको 50 65x65 18-बिट बिटमैप के लिए केवल 476 kB की आवश्यकता होगी, लेकिन यह प्रोग्राम को धीमा करने और प्रोसेस करने के लिए धीमा होगा।

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