IPhone विकास में PNG या JPG का उपयोग कब करें?


98

मेरे पास एक ऐप है जो स्लाइड शो में छवियों का एक गुच्छा प्रदर्शित करेगा। वे चित्र बंडल का हिस्सा होंगे, इस प्रकार ऐप के साथ वितरित किया जाएगा।

सभी चित्र फोटोग्राफ या फोटोग्राफिक आदि हैं।

मैंने पढ़ा है कि छवि प्रारूप के रूप में पीएनजी का उपयोग करना पसंद किया जाता है, लेकिन यह देखते हुए कि जेपीजी संस्करण बहुत छोटा होगा, मैं इसका उपयोग करूंगा।

क्या कोई दिशानिर्देश हैं जो प्रारूप का उपयोग करें और किस मामले में है?


मैं जोड़ना चाहता था कि मूल चित्र JPG प्रारूप में पहले से ही हैं अगर इससे कोई अंतर पड़ता है।
मैवरिक

जवाबों:


140

पीएनजी के पिक्सेल एकदम सही (गैर-हानिरहित) हैं, और प्रदर्शित करने के लिए बहुत कम अतिरिक्त सीपीयू ऊर्जा की आवश्यकता होती है। हालाँकि, बड़े PNG को अधिक संपीड़ित छवि प्रारूपों की तुलना में संग्रहण से पढ़ने में अधिक समय लग सकता है, और इस प्रकार प्रदर्शित करने के लिए धीमा हो सकता है।

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

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


1
मुझे अभी तक JPEG बनाम PNG बनाम iPNG डिकोड प्रदर्शन पर कोई डेटा नहीं देखना है। कभी-कभी I / O की आवश्यकता कम होने के कारण अधिक संकुचित प्रारूप बेहतर होता है; मुझे यकीन नहीं है कि iPhone की फ्लैश ड्राइव कितनी तेज़ है। और मैं निश्चित रूप से नहीं कहूंगा कि PNG अपघटन के लिए "बहुत कम" ऊर्जा की आवश्यकता होती है; Other.artwork फ़ाइल कच्चे बिटमैप डेटा प्रतीत होती है, संभवतः क्योंकि PNG विघटन का सीपीयू / मेमोरी ओवरहेड आमतौर पर उपयोग किए गए यूआई घटकों के लिए बहुत अधिक है।
टीसी

2
मेरे वर्तमान प्रोजेक्ट पर, पारदर्शिता की आवश्यकता के कारण हमारे पास बहुत बड़ी पीएनजी फाइलें हैं। डिस्क IO एक jpeg को डिकोड करने में लगने वाले समय को बहुत कम कर देता है। ध्यान रखें कि PNG भी एक अलग एल्गोरिथ्म का उपयोग करके संपीड़ित होते हैं।
जॉन

2
मुझे लगता है कि छवि प्रदर्शन को अधिकतम करने की कोशिश कर रहे लोगों के लिए मैं एक पूरक टिप जोड़ूंगा। यदि आपके पास अच्छी तरह से JPGs हैं, तो आप कच्चे JPG डेटा को NSData ऑब्जेक्ट्स में पहले से लोड कर सकते हैं (शायद किसी सरणी या शब्दकोश में), और UPGmage: imageFromData का उपयोग करके JPGs का निर्माण करें जब आप प्रदर्शित करना चाहते हैं। JPG डेटा बिटमैप छवि डेटा की तुलना में 10-100x छोटा हो सकता है, लेकिन यह आपको (अपेक्षाकृत धीमा) IO भाग को जल्दी से प्राप्त करने की अनुमति देता है। स्पष्ट रूप से सावधान रहें कि आप इस तरह से कितना डेटा कैश / प्रीलोड करते हैं।
निगेल फ्लैक

2
मुझे कंप्रेशन के समय का कुछ डेटा मिला है: cocoanetics.com/2012/09/… ( ऐसा लगता है, कि png का उपयोग jpg की तुलना में तेज़ नहीं है;)
Maciej Kozieł

20

Apple PNG छवियों का अनुकूलन करता है जो आपके iPhone ऐप बंडल में शामिल हैं। वास्तव में, iPhone एक विशेष एन्कोडिंग का उपयोग करता है जिसमें हार्डवेयर के लिए रंग बाइट्स को अनुकूलित किया जाता है। जब आप अपनी परियोजना का निर्माण करते हैं तो XCode आपके लिए इस विशेष एन्कोडिंग को संभालता है। तो, आप उनके आकार पर विचार के अलावा एक iPhone पर PNG का उपयोग करने के लिए अतिरिक्त लाभ देखते हैं। इस कारण से यह निश्चित रूप से पीएनजी के उपयोग के लिए अनुशंसित है जो कि इंटरफ़ेस के भाग के रूप में दिखाई देती है (तालिका दृश्य, लेबल आदि में)।

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

फ़ाइल का आकार निश्चित रूप से एक कारक है लेकिन छवि प्रारूप का चयन करते समय खेलने के साथ-साथ अन्य विचार भी हैं।


5
मेरे बेंचमार्क Xcode ऑप्टिमाइज़ेशन में वास्तव में फाइलें धीमी हो जाती हैं, इसकी संभावना है क्योंकि डिस्क I / O, न कि सीपीयू अड़चन है।
कोर्नेल

1
"Apple आपके iPhone ऐप बंडल में शामिल PNG छवियों का अनुकूलन करता है" - क्या इसका मतलब यह है कि PNG जो गतिशील रूप से डाउनलोड किए जाते हैं वे अनुकूलित नहीं हैं?
रॉबर्ट

1
नहीं, PNGs गतिशील रूप से डाउनलोड नहीं किए गए हैं। अनुकूलन मूल रूप से आरजीबीए से बीजीआरए तक बाइट ऑर्डर को स्वैप कर रहा है, जो कि आईफोन ग्राफिक्स चिप आंतरिक रूप से उपयोग करता है। यहाँ अधिक जानकारी: graphicsoptimization.com/blog/?p=259
निक लॉकवुड

11

PNG के बारे में सोचने के लिए एक महत्वपूर्ण बात है। यदि एक PNG आपके Xcode बिल्ड में शामिल है, तो इसे iOS के लिए अनुकूलित किया जाएगा। इसे पीएनजी क्रश कहा जाता है। यदि आपका पीएनजी रन टाइम में डाउनलोड हो जाता है तो इसे क्रश नहीं किया जाएगा। कुचल पीएनजी 100% JPGs के समान है। निम्न गुणवत्ता वाले JPG उच्च गुणवत्ता वाले JPG की तुलना में बेहतर होते हैं। तो सबसे तेजी से धीमी करने के लिए एक प्रदर्शन के दृष्टिकोण से यह कम गुणवत्ता वाले JPG, उच्च गुणवत्ता वाले JPG, PNG क्रश, PNG जाएगा।

यदि आपको पीएनजी डाउनलोड करने की आवश्यकता है तो आपको डाउनलोड से पहले सर्वर पर पीएनजी को कुचलने पर विचार करना चाहिए।

http://www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/


9

Cocoanetics एक अच्छा आईओएस प्रदर्शन बेंचमार्क प्रकाशित ब्लॉग विभिन्न गुणवत्ता स्तर, और PNG का पर JPGs की, साथ और पेराई के बिना।

अपने निष्कर्ष से:

अगर आपको बिल्कुल एक अल्फा चैनल की जरूरत है या PNGs के साथ जाना है तो अपने वेब सर्वर पर pngcrush टूल इंस्टॉल करना उचित है और यह आपके सभी PNG को प्रोसेस करता है। लगभग सभी अन्य मामलों में उच्च गुणवत्ता वाले जेपीईजी छोटे फाइल साइज (यानी तेज संचरण) को तेजी से संपीडन और रेंडरिंग के साथ जोड़ते हैं।

यह पता चला है कि पीएनजी छोटे चित्रों के लिए बहुत अच्छे हैं जिन्हें आप यूआई तत्वों के लिए उपयोग करेंगे, लेकिन वे कैटलॉग या पत्रिकाओं जैसे किसी भी पूर्ण स्क्रीन अनुप्रयोगों के लिए उपयोग करने के लिए उचित नहीं हैं। वहां आप अपने स्रोत सामग्री के आधार पर 60 और 80% के बीच एक संपीड़न गुणवत्ता चुनना चाहेंगे।

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

यह दुर्भाग्यपूर्ण है कि हमारे पास यह जानने का कोई तरीका नहीं है कि किसी छवि को अभी भी डिकम्प्रेसिंग की आवश्यकता है या नहीं। साथ ही एक छवि ने हमें इस आशय की जानकारी दिए बिना असम्पीडित संस्करण को निकाला हो सकता है। यह Apple की बग रिपोर्टिंग साइट पर एक अच्छा रडार हो सकता है। लेकिन सौभाग्य से छवि को ऊपर दिखाए गए अनुसार कोई समय नहीं लगता है यदि छवि पहले से ही विघटित है। तो आप ऐसा कर सकते हैं कि न केवल "समय में" बल्कि "सिर्फ मामले में"।


वास्तव में, और JPEGMini और ImageOptim jpegs को वास्तव में छोटा बनाता है!
इलेक्ट्रॉनिक्स

7

बस मैंने सोचा कि मैं विघटन प्रदर्शन डेटा का एक सा हिस्सा हूँ ...

मैं 360 डिग्री दर्शक के कुछ प्रोटोटाइप कर रहा हूं - एक हिंडोला जहां उपयोगकर्ता विभिन्न कोणों से ली गई तस्वीरों की एक श्रृंखला के माध्यम से स्पिन कर सकता है, ताकि किसी वस्तु को आसानी से घुमा सके।

मैंने फ़ाइल डेटा को NSData की एक सरणी में लोड किया है ताकि मैं समीकरण से फ़ाइल i / o ले सकूँ, लेकिन मक्खी पर NSImage का निर्माण कर सकूँ। अधिकतम फ्रेम दर (~ 25 एफपीएस) पर परीक्षण और इंस्ट्रूमेंट्स में देख रहा हूं कि ऐप स्पष्ट रूप से सीपीयू-बाउंड है और सीपीयू लोड में लगभग 10% की बढ़ोतरी ~ 275 केबी पीएनजी बनाम ~ 75 केबी jpg है।

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

बेशक हर स्थिति अलग है, परीक्षण के लिए कोई विकल्प नहीं है ...


2
GPU PNGs को नहीं हटा सकता है। यह जिस डिफ्लेट प्रारूप का उपयोग करता है, वह उस प्रकार के लिए उपयुक्त नहीं है, जिस तरह का जीपीआर सक्षम करता है। मुझे लगता है कि जेपीजी डीकोडिंग आंशिक रूप से GPU- त्वरित हो सकती है, क्योंकि इसमें कलरस्पेस रूपांतरण शामिल है।
कोर्नेल

5

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


1

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


3
यह JPG बनाम PNG के किसी भी प्रदर्शन विचार को संबोधित नहीं करता है।
daveMac

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