2012-02-13 12 views
7

मैं ALAsset उपयोग कर रहा हूँ ऐसे ही छवियों को पुनः प्राप्त करने:आईओएस पर एलासेट छवि को डिस्क पर तेजी से कैसे सहेजना है?

[[asset defaultRepresentation] fullResolutionImage]] 

यह वापसी CGImageRef जो मैं जितनी जल्दी संभव के रूप में डिस्क पर सहेजना चाहते ...

समाधान 1:

UIImage *currentImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]]; 
NSData *currentImageData = UIImagePNGRepresentation(currentImage); 
[currentImageData writeToFile:filePath atomically:YES]; 

समाधान 2:

CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:filePath]; 
CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypePNG, 1, NULL); 
CGImageDestinationAddImage(destination, [[asset defaultRepresentation] fullResolutionImage], nil); 
CGImageDestinationFinalize(destination); 

समस्या यह है कि दोनों विधियां हैं एक डिवाइस पर बहुत धीमी प्रदर्शन। मुझे यह करने के लिए प्रति छवि लगभग 2 सेकंड लगते हैं। और यह बिल्कुल लंबा है।

प्रश्न: मैं इस छवि बचत प्रक्रिया को कैसे बढ़ा सकता हूं? या शायद इसके लिए एक बेहतर समाधान है?

अद्यतन: दोनों समाधानों में सर्वोत्तम प्रदर्शन सुधार छवियों को पीएनजी के बजाय जेपीईजी प्रारूप में सहेजना है। तो समाधान 1 के लिए UIImagePNGRepresentation को UIImageJPEGRepresentation के साथ बदल दिया गया है। समाधान 2 के लिए kUTTypeJPEG के साथ बदल दिया है।

यह भी ध्यान देने योग्य है कि दूसरा समाधान तरीका है कि पहले मेमोरी कुशल है।

उत्तर

2

ऐसा इसलिए है क्योंकि पीएनजी संपीड़न धीमी प्रक्रिया है, और विशेष रूप से पूर्ण आकार की फोटोग्राफी के लिए आईफोन के प्रोसेसर पर कुछ समय लगता है।

+0

मैं इसे समझता हूं। लेकिन क्या ऐसा करने के लिए कोई और अधिक कुशल तरीका है? मुझे पीएनजी की जरूरत नहीं है। असल में कोई प्रारूप ठीक है। मुझे सिर्फ मूल छवि को एलासेट से अपने कस्टम फ़ोल्डर में कॉपी करने की आवश्यकता है ...? धन्यवाद –

+0

क्या आपने UIImageJPEGRepresentation की कोशिश की है? –

+0

मैंने अभी जेपीईजी प्रतिनिधित्व के साथ प्रयास किया - यह पीएनजी प्रतिनिधित्व से लगभग एक आधा तेज है (अभी भी लगभग 1 सेकंड)। यह काफी बेहतर है। लेकिन अभी भी मुझे उम्मीद नहीं है। क्या कुछ और है? प्रश्न में पोस्ट किए गए दोनों समाधानों के बीच अंतर के बारे में क्या। क्या किसी और पर कोई फायदे हैं? –

1

कोई इस तरह के एक प्रक्रिया में तेजी लाने के लिए रास्ता नहीं है, लेकिन एक संभव समाधान इस तरह से आप mainthread ब्लॉक नहीं धागे का उपयोग करने, हो सकता है और आप उपयोगकर्ता एक बेहतर अनुभव प्रदान करेगा:

dispatch_queue_t dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(dispatchQueue, ^(void) { 
    // Your code here 
}); 
+0

यही वह है जो मैंने पहले ही किया है ... –

9

आप इसके बजाय कच्चे डेटा की प्रतिलिपि बना सकते हैं।
इसमें फ़ाइल को फिर से एन्कोड करने, फ़ाइल को बड़ा नहीं बनाने, अतिरिक्त संपीड़न के माध्यम से गुणवत्ता खोने और फ़ाइल में किसी भी मेटा डेटा को संरक्षित करने के फायदे हैं। भी सबसे तेज़ संभव तरीका होना चाहिए।
मान लें कि आपके पास theAsset और filepath इसे सहेजने के लिए है।
त्रुटि प्रबंधन को भी जोड़ना चाहिए।

long long sizeOfRawDataInBytes = [[theAsset defaultRepresentation] size]; 
NSMutableData* rawData = [NSMutableData dataWithLength:(NSUInteger) sizeOfRawDataInBytes]; 
void* bufferPointer = [rawData mutableBytes]; 
NSError* error=nil; 
[[theAsset defaultRepresentation] getBytes:bufferPointer 
           fromOffset:0 
            length:sizeOfRawDataInBytes 
            error:&error]; 
if (error) 
{ 
    NSLog(@"Getting bytes failed with error: %@",error); 
} 
else 
{ 
    [rawData writeToFile:filepath 
       atomically:YES]; 
} 
+0

इस समस्या के साथ समस्या यह है कि छवि की ओरिएंटेशन जानकारी खो जाती है – rydgaze

+0

क्या आप सुनिश्चित हैं कि एक्सिफ़ा मेटा डेटा में नहीं है? – GusOst

+0

वह जानकारी वास्तव में exif मेटा डेटा में है। – GusOst

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