8

मैंने यह प्रश्न दर्जनों बार पूछा लेकिन कभी जवाब नहीं दिया।आईफोन पर एक छोटी मेमोरी पदचिह्न के साथ यूआईएममेज का आकार बदलना

आप UIImage का आकार कैसे बदलते हैं (विशेष रूप से UIImagePickerController कैमरा से लौटाया गया)। जब मैं वहां से बाहर की किसी भी विधि का प्रयास करता हूं तो मुझे 20 और 40 एमबी के बीच मेमोरी स्पाइक मिलता है। यह दूर जाता है लेकिन मुझे पता है कि कुछ हार्डवेयर पर यह पूरी तरह से अस्वीकार्य है। drawInRect :, CGContextDrawImage(), imageWithCGImage: पैमाने: अभिविन्यास:

मैं समझता हूँ कि स्मृति में रहने वाले असम्पीडित छवियों डिस्क पर की तुलना में अधिक स्थान ले, लेकिन

मैं तरीकों कि निम्नलिखित कार्यों का उपयोग की कोशिश की है ऐसा लगता है कि सबसे आम UIImage आकार बदलने के संचालन में छवि डेटा की प्रतियां शामिल हैं।

यहां तक ​​कि ऐप्पल कैमरे के साथ ली गई तस्वीर का तुरंत आकार बदलने की सिफारिश करता है। हालांकि (बी/सी मुझे विश्वास है कि वे जानते हैं कि यह विषय बेहद जटिल है) वे इसे प्रबंधित करने के तरीके पर मार्गदर्शन के कोई शब्द नहीं देते हैं। छवि डेटा वापस आने के पल में विशेष रूप से इसे कैसे करें।

क्या स्मृति के संरक्षण के दौरान किसी के पास एक बड़े UIImage का आकार बदलने के लिए एक आसान तरीका है? मुझे पता है कि यह एक लंबा आदेश है।

+1

कोई और विचार? मैं इसे ऐप्पल को भेज सकता हूं। – sambecker

उत्तर

0

मेरे पास 100% शानदार उत्तर नहीं है लेकिन आपके पास कुछ विकल्प हैं। आईफोन आपको संपादन/फसल आदि मोड में प्रवेश करने देगा। मुझे लगता है कि ऐप्पल आप का उपयोग करना चाहता है। हमारे लिए जो काफी स्वीकार्य नहीं था। हम छवि डेटा लेते हैं, पिक्सेल डेटा प्राप्त करते हैं, मूल छवि को छोड़ देते हैं। फिर शीर्ष आधा का आकार बदलें, फिर दूसरा खुद। मैं कुछ कोड पोस्ट करूंगा लेकिन काम पर नहीं हूं। मैं छुट्टी के कुछ दिनों बाद कर सकता हूं ...

+1

पिक्सेल डेटा को "प्राप्त" करने के आधार पर, उसमें एक अनावश्यक प्रतिलिपि हो सकती है (एक बार 'UIImage' के अंदर और फिर अपने बफर में) – rpetrich

1

एक विधि जो छोटी मेमोरी का उपयोग करती है वह CGBitmapContextCreate के साथ बिटमैप संदर्भ बनाना और UIImage खींचें। इसका उपयोग करने वाली एकमात्र अतिरिक्त मेमोरी है जो आपके पास malloc एड है और कुछ छोटे CGContext ओवरहेड हैं।

आप कल्पना प्राप्त करना चाहते हैं, आप के बजाय mmapPROT_WRITE ध्वज सेट के साथ और वर्चुअल ऐड्रेस स्पेस

+0

मैंने उस विधि को आजमाया लेकिन स्मृति को संरक्षित करने में प्रबंधित नहीं किया जा सका। क्या कोई विशिष्ट रखरखाव/रिलीज पैटर्न है जो यूआईएममेज के साथ शुरू होता है और समाप्त होता है जिसे आप साझा कर सकते हैं? – sambecker

+1

मेरे पास कोई कोड नमूने नहीं हैं क्योंकि मैं अपने जेलबैक अनुप्रयोगों में बस इतना आसान निजी एपीआई का उपयोग करता हूं। उपर्युक्त कोड आपको एक छवि को आपके चयन के बफर में बदल देगा। उसमें से 'UIImage' बनाने के लिए, निम्न API को श्रृंखलाबद्ध करें:' CGDataProviderCreateWithData', 'CGImageCreate' और' - [UIImage initWithCGImage:] '। उचित मेमोरी प्रबंधन पैटर्न का पालन करना और अपने 'CGDataProvider' के लिए उचित कस्टम रिलीज़ कॉलबैक निर्दिष्ट करना सुनिश्चित करें। – rpetrich

1

द्वारा केवल सीमित किया जा सकता है आप स्मृति श्रेणी के तरीकों के साथ UIImage आकार बदलने के द्वारा प्रयोग किया पदचिह्न बेंचमार्किंग की कोशिश की है निम्नलिखित ब्लॉग post में वर्णित है।

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

उम्मीद है कि यह किसी भी तरह से मदद करता है।

0

आपके पास शायद मेरे ऐप्स में हैंडल की तुलना में बड़ी छवियां हैं, लेकिन आप यह नहीं कहें कि हम किस आकार के बारे में बात कर रहे हैं। मैं केवल क्वार्ट्ज या लाइन के अनुसार तस्वीर लाइन कर अपने स्वयं के आकार का फ़िल्टर सुझा सकता हूं।

1

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

https://github.com/coryalder/UIImage_Resize

https://github.com/AliSoftware/UIImage-Resize

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

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