2012-09-09 5 views
5

Hier ist der Code-Schnipsel habe ich versucht:Wie verschiebe ich ein Bild aus der Asset-Bibliothek in einen anwendungsspezifischen privaten Speicherort?

[library writeImageToSavedPhotosAlbum:self.checkInImage.CGImage metadata:self.metadata 
      completionBlock    :^(NSURL * assetURL, NSError * error) { 
     NSLog (@"Asset url = %@", assetURL); 
     NSError *err; 
     NSString *docDir = [NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
     NSString *jpgFilePath = [NSString stringWithFormat:@"%@/test.jpg", docDir]; 
     NSFileManager *fileManager = [NSFileManager defaultManager]; 
       [fileManager moveItemAtURL:assetURL toURL:[NSURL URLWithString:jpgFilePath] error:&err]; 
       NSLog(@"error is %@", err); 
    }]; 

Ich erhalte den Fehler als Fehler Domain = NSCocoaErrorDomain-Code = 262 = Userinfo 0xb49a680 { "Der Vorgang konnte nicht abgeschlossen werden (Cocoa Fehler 262.)." NSURL = Ressourcen-Bibliothek: //asset/asset.JPG? Id = 6FAC823A-33CB-489B-A125-714FBA5F0EE8 & ext = JPG}

Irgendwelche Ideen?

Antwort

1

Dies ist, wie ich das Problem gelöst:

1) habe ich die Datei ohne Metadaten in einer Stelle gespeichert, und seine URLPath gespeichert.

2) Dann verwendet das folgende Stück Code, um die gleiche Datei mit Metadaten zu speichern. Hier fileURL ist die URLPath aus Schritt 1.

CFURLRef url = CFURLCreateFilePathURL(NULL, (CFURLRef)fileURL, NULL); 
// Creating Image source from image url 
CGImageSourceRef imageSource = CGImageSourceCreateWithURL(url, NULL); 

// This will be the data CGImageDestinationRef will write into 
CFMutableDataRef data = CFDataCreateMutable(kCFAllocatorDefault, 0); 
CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData(data, CFSTR("public.jpeg"), 1, NULL); 

BOOL success = (imageSource != NULL); 

require(success, cleanup); 

success = (imageDestination != NULL); 
require(success, cleanup); 

// Add the image contained in the image source to the destination, overidding the old metadata with our modified metadata 
NSDictionary *metadata = someObj.metadata; 
CGImageDestinationAddImageFromSource(imageDestination, imageSource, 0, (CFDictionaryRef)metadata); 

// Tell the destination to write the image data and metadata into our data object. 
success = CGImageDestinationFinalize(imageDestination); 

require(success, cleanup); 

// Write the data into the url 
[(NSMutableData *) data writeToURL:fileURL atomically:YES]; 

Bereinigung:

if (data) { 
    CFRelease(data); 
    data = NULL; 
} 

if (imageSource) { 
    CFRelease(imageSource); 
    imageSource = NULL; 
} 

if (imageDestination) { 
    CFRelease(imageDestination); 
    imageDestination = NULL; 
} 

return success; 

Hoffnung, das hilft. Aber ich möchte H2C03 für sehr hilfreiche Vorschläge auffrischen, die zu dieser Lösung beigetragen haben. Bitte hilf mir, wie es geht. Vielen Dank.

5

Docs (and Google). Dieser Fehlercode entspricht der NSFileReadUnsupportedSchemeError Konstante - i. e. Sie können nicht einfach eine URL assets-library:// verwenden, um eine Datei mit NSFileManager zu verschieben. (Dasselbe gilt für ipod-library:// URLs.) Sie müssen das AssetsLibrary-Framework verwenden, um die Daten der Datei abzurufen und dann in eine Datei unter Verwendung - [NSData writeToFile:atomically:] zu schreiben.

ALAssetsLibrary *lib = [ALAssetsLibrary new]; 
[lib assetForUrl:theURL // the asset URL you have obtained, NSURL object 
    resultBlock:^(ALAsset *asset) { 
     // get data 
     ALAssetRepresentation *repr = [asset defaultRepresentation]; 
     CGImageRef cgImg = [repr fullResolutionImage]; 
     NSString *fname = [repr fileName]; 
     UIImage *img = [UIImage imageWithCGImage:cgImg]; 
     NSData *data = UIImagePNGRepresentation(img); 
     [data writeToFile:[@"BaseDirectory/" stringByAppendingPathComponent:fname] 
      atomically:YES]; 
     [lib release]; 
    } 
    failureBlock:^(NSError *error) { 
     // recover from error, then 
     [lib release]; 
    }]; 
+0

Danke, ich werde das versuchen. Idealerweise möchte ich die Datei verschieben, dh die Datei kopieren und die Datei in den Assets löschen. Ist es möglich? – mobjug

+0

@mobjug gar nicht. Sie können nicht direkt auf den Speicherort des Dateisystems zugreifen, noch können Sie etwas in der iPod-Bibliothek ändern (nun, ich arbeite an etwas, mit dem es möglich wäre, aber dieses Projekt von mir ist nicht annähernd fertig ...) –

+0

Auch wenn meine App diese Datei erstellt hat? – mobjug