2012-10-31 43 views
6

मैं आईओएस के बिना आईपीओ के बिना जेपीईजी छवियों को उपयोगकर्ता गैलरी (कैमरा रोल) को पढ़ने और लिखने का एक तरीका खोजने का प्रयास कर रहा हूं। यूआईएममेज यहां बाधा प्रतीत होता है। मुझे मिली उपयोगकर्ता गैलरी को सहेजने का एकमात्र तरीका UIImageWriteToSavedPhotosAlbum() है। क्या इसके चारों ओर एक रास्ता है?पुन: संपीड़न के बिना उपयोगकर्ता गैलरी से जेपीईजी को सहेजना/प्राप्त करना

के लिए अब मेरी दिनचर्या एक तस्वीर के लिए इस

-Ask UIImagePickerController तरह दिखता है। और जब यह didFinishPickingMediaWithInfo, कार्य करें:

NSData *imgdata = [NSData dataWithData:UIImageJPEGRepresentation([info objectForKey:@"UIImagePickerControllerOriginalImage"], 1)]; 
[imgdata writeToFile:filePath atomically:NO]; 

-Process जेपीईजी losslessly डिस्क पर।

-फिर में वापस सहेज:

JPEG quality degradation

यह स्पष्ट रूप से भी बदतर हर बार मैं यह कर हो जाता है:

UIImageWriteToSavedPhotosAlbum([UIImage imageWithContentsOfFile:[self getImagePath]], self, @selector(image:didFinishSavingWithError:contextInfo:), nil); 

यहाँ गुणवत्ता गिरावट 3 गुजरता के बाद कैसा दिखता है के एक छोटे से एनीमेशन है , लेकिन मैं 50/100/1000 चक्रों के लिए पूरी तरह से परीक्षण करने के लिए छवि पिकिंग भाग को स्वचालित नहीं कर सका।

उत्तर

10

UIImage छवि डेटा तो यह संपादित और प्रदर्शित किया जा सकता डीकोड, तो

UIImageWriteToSavedPhotosAlbum([UIImage imageWithContentsOfFile:[NSData dataWithContentsOfFile:[self getImagePath]]], self, @selector(image:didFinishSavingWithError:contextInfo:), nil); 

पहले चित्र को डीकोड होता है, और की तुलना में यह वापस UIImageWriteToSavedPhotosAlbum विधि से सांकेतिक शब्दों में बदलना।

इसके बजाय, आप इस तरह ALAssetsLibrary/writeImageDataToSavedPhotosAlbum:metadata:completionBlock:, कुछ का उपयोग करना चाहिए:

ALAssetsLibrary *assetLib = [[[ALAssetsLibrary alloc] init] autorelease]; 
[assetLib writeImageDataToSavedPhotosAlbum:[self getImagePath] metadata:nil completionBlock:nil]; 

तुम भी मेटाडाटा और कॉल करने के लिए पूरा होने के ब्लॉक पारित कर सकते हैं।

संपादित करें:

[info objectForKey:@"UIImagePickerControllerOriginalImage"] डीकोड UIImageUIImagePickerController से चयनित होते हैं:

छवि हो रही है। इसके बजाय आप

NSURL *assetURL = [info objectForKey:UIImagePickerControllerReferenceURL]; 

का उपयोग assetURL आप अब ALAssetsLibrary/assetForURL:resultBlock:failureBlock: पद्धति का उपयोग करके इसके लिए ALAsset प्राप्त कर सकते हैं का उपयोग करना चाहिए:

ALAssetsLibrary *assetLib = [[[ALAssetsLibrary alloc] init] autorelease]; 
[assetLib assetForURL:assetURL resultBlock:resultBlock failureBlock:failureBlock]; 

अब आप उस छवि के अनछुए NSData प्राप्त कर सकते हैं:

ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *asset){ 
    ALAssetRepresentation *assetRep = [asset defaultRepresentation]; 
    long long imageDataSize = [assetRepresentation size]; 
    uint8_t* imageDataBytes = malloc(imageDataSize); 
    [assetRepresentation getBytes:imageDataBytes fromOffset:0 length:imageDataSize error:nil]; 
    NSData *imageData = [NSData dataWithBytesNoCopy:imageDataBytes length:imageDataSize freeWhenDone:YES]; // you could for instance read data in smaller buffers and append them to your file instead of reading it all at once 
    // save it 
    [imgdata writeToFile:filePath atomically:NO]; 
}; 
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror){ 
    NSLog(@"Cannot get image - %@",[myerror localizedDescription]); 
    // 
}; 

मैंने कोड में कुछ गलतियां की हो सकती हैं, लेकिन चरण ऊपर सूचीबद्ध हैं। कुछ सही काम नहीं करने के मामले में, या यदि आप इसे थोड़ा और अधिक कुशल बनाना चाहते हैं, तो NSData को ALAsset से स्टैक ओवरफ्लो या अन्य साइटों पर पढ़ने के कई उदाहरण हैं।

+0

हाँ, धन्यवाद, मुझे पहले से ही एसेट्स लाइब्रेरी के साथ उस चाल के बारे में पता चला है। मुझे आशा है कि आपका उत्तर दूसरों के लिए सहायक होगा। – Kai