2014-05-18 8 views
9

Quartz 2D programming guide विभिन्न अल्फा भंडारण मोड की उपलब्धता को परिभाषित करता है?हम किस CGImageAlphaInfo का उपयोग करना चाहिए?</p> <p><img src="https://i.stack.imgur.com/Ap7C9.png" alt="enter image description here"></p> <p>कौन सा जिन्हें हम आरजीबी संदर्भों के लिए उपयोग करना चाहिए, और <strong>क्यों</strong>:

गैर-अपारदर्शी संदर्भों के लिए, kCGImageAlphaPremultipliedFirst या kCGImageAlphaPremultipliedLast?

अपारदर्शी संदर्भों के लिए, kCGImageAlphaNoneSkipFirst या kCGImageAlphaNoneSkipLast?

क्या मूल्य की पसंद प्रदर्शन को प्रभावित करती है?

आमतौर पर, मैं अपारदर्शी संदर्भों के लिए गैर-अपारदर्शी और kCGImageAlphaNoneSkipFirst के लिए kCGImageAlphaPremultipliedFirst देखता हूं। कुछ लोग कहते हैं कि ये बेहतर प्रदर्शन करते हैं लेकिन मैंने इस बारे में कोई कठोर सबूत या दस्तावेज नहीं देखा है।

एक त्वरित GitHub खोज से पता चलता है कि डेवलपर्स kCGImageAlphaPremultipliedFirstkCGImageAlphaNoneSkipFirst से अधिक kCGImageAlphaPremultipliedLast पर और kCGImageAlphaNoneSkipLast पक्ष में हैं। अफसोस की बात है, यह अजीब सबूत से थोड़ा अधिक है।

+0

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

+0

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

+0

@ एबीबीकर्ट यह मेरी आंत महसूस कर रहा है लेकिन मुझे इस पर कुछ पुष्टि या सर्वसम्मति रखना अच्छा लगेगा। मैं शर्त लगाता हूं कि अधिकांश डेवलपर्स सिर्फ 'CGBitmapContextCreate' कोड कॉपी करते हैं, यदि वे सही बिटमैप जानकारी का उपयोग कर रहे हैं तो बहुत अधिक स्पर्श किए बिना। – hpique

उत्तर

6

डब्ल्यूडब्ल्यूडीसी 2014 में एक ऐप्पल इंजीनियर द्वारा पुष्टि की गई कि हमें kCGImageAlphaPremultipliedFirst या kCGImageAlphaNoneSkipFirst का उपयोग करना चाहिए, और यह प्रदर्शन को प्रभावित करता है।

+4

यदि आप इसे भविष्य से पढ़ रहे हैं, तो इसे एक साथ ले जाएं नमक का अनाज। यह बदल सकता है! – hpique

3

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

विभिन्न प्रारूप छवि के फ़ाइल आकार और रंग की गुणवत्ता को प्रभावित करते हैं (यदि आपको पता नहीं था) और छवि गुणवत्ता, 8 बिट प्रारूप काले और सफेद (ग्रे स्केल) हैं, इन सभी की चर्चा है यहां मिला: http://en.wikipedia.org/wiki/Color_depth

+1

एक और बात - यदि आप कोर छवि फ़िल्टर का उपयोग करते हैं - तो आप पाएंगे कि बहुत सारे फ़िल्टर विशेष रूप से सीआईसीओलरमैट्रिक्स आरजीबीए (ट्रू कलर)) प्रारूप, यह नहीं कि आप अन्य प्रारूपों का उपयोग करने में सक्षम नहीं होंगे लेकिन आपको उन्हें पहले रूपांतरित करना होगा .... – Paulo

+0

हाय पाउलो। एआरजीबी आमतौर पर आईओएस संपत्तियों में उपयोग किया जाता है, हालांकि मैं बिल्कुल क्यों नहीं करता हूं। मुझे लगता है कि आप एक टिप्पणी होना चाहिए, क्योंकि यह मेरे प्रश्नों का उत्तर देने के प्रयास से रंग प्रारूपों की व्याख्या का अधिक है। – hpique

+0

वास्तव में, कोर छवि फ़िल्टर के बारे में आपकी टिप्पणी आपके वास्तविक उत्तर की तुलना में प्रश्न के लिए अधिक प्रासंगिक है। – hpique

0

सर्वोत्तम प्रदर्शन के लिए, प्रति पंक्ति और डेटा बाइट्स 16 बाइट्स के गुणकों के साथ गठबंधन किया जाना चाहिए।

प्रति घटक बिट्स: प्रत्येक रंग घटक के लिए उपयोग की जाने वाली बिट्स की संख्या। के लिए 16 बिट RGBA, 16/4 घटकों = 4.

पिक्सेल प्रति बिट्स: घटक प्रति कम से कम बिट पर * घटकों प्रति पंक्ति

बाइट की संख्या: ((घटक बिट्स प्रति * घटकों की संख्या + 7)/8) *

चौड़ाई CGBitmapContext.h से:

एक पिक्सेल के प्रत्येक घटक के लिए बिट्स की संख्या द्वारा निर्दिष्ट किया जाता 'bitsPerComponent'। प्रति पिक्सेल बाइट्स की संख्या '(बिट्सपर कॉम्पोनेंट * घटकों की संख्या + 7)/8' के बराबर है। बिटमैप की प्रत्येक पंक्ति में bytesPerRow' bytes, which must be at least चौड़ाई * बाइट प्रति पिक्सेल 'बाइट्स शामिल हैं; इसके अलावा, बाइट्स प्रति पिक्सल की संख्या के बाइट्स 'बाइट्सप्रोरो' को एक पूर्णांक एकाधिक होना चाहिए।

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

यह Quartz 2D Programming Guide के साथ-साथ CGImage के लिए प्रलेखन में भी शामिल है। question भी प्रासंगिक हो सकता है।

जो कुछ भी कहा गया है, यह इंस्ट्रूमेंट्स में विभिन्न चीजों और प्रोफाइल को आजमाने के लिए सबसे अच्छा है।

+0

प्रति पंक्ति बाइट्स (बाइट प्रति पिक्सेल) * चौड़ाई, नहीं (प्रति घटक बिट्स) * (घटक की संख्या) * चौड़ाई: पिक्सेल एकाधिक इकाइयों को पार नहीं कर सकता है। यदि आप 16-बिट आरजीबी का उपयोग करते हैं, तो एक पिक्सेल 16 बिट्स है, भले ही यह एक बिट को अप्रयुक्त छोड़ देता है। साथ ही, मुझे लगता है कि क्वार्ट्ज केवल 16 बिट्स (5 बीपीसी के साथ) आरजीबीए का समर्थन करता है, आरजीबीए नहीं। – zneak

+0

से CGBitmapContext.h: "बाइट्स प्रति पिक्सेल की संख्या (बिट्सपर कॉम्पोनेंट * घटकों की संख्या + 7)/8 'के बराबर है।"प्रति पंक्ति पिक्सेल की संख्या (चौड़ाई) से गुणा करें। 'केसीजी इमेजअल्फालास्ट' बिना किसी पूर्व के आरजीबीए का एक उदाहरण है। 'केसीजी इमेजएल्फा प्राइमल्टीप्लाइडलास्ट' प्रीगुलिपली के साथ आरजीबीए होगा। – quellish

0

मैं kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big का उपयोग कर रहा हूं और यह बहुत अच्छा काम करता है।

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

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