Save metadata for custom image with Swift (iOS) and Photos framework

大兔子大兔子 提交于 2020-01-13 09:06:48

问题


I am trying to add metadata to my synthetically generated and save it to camera roll by using the Photos framework. I got the saving and editing working but I just can seem to figure out how to add metadata. I have tried many approaches like adding the metadata by creating a CoreGraphics image (see code below). All these approaches do not give me an error but I just cannot see the metadata when I open the image on my Mac.

Can anyone point me in the right direction here?

PHPhotoLibrary.sharedPhotoLibrary().performChanges({
let assets : PHFetchResult = PHAsset.fetchAssetsWithLocalIdentifiers([self.localIdentifier], options: nil);
let asset : PHAsset = assets[0] as! PHAsset;
let changeRequest = PHAssetChangeRequest(forAsset: asset);
changeRequest.location = self.currentLocation;

asset.requestContentEditingInputWithOptions(nil, completionHandler: { (input: PHContentEditingInput?,
    info: [NSObject : AnyObject]) -> Void in


    guard let input = input else { return }

    let imageManager : PHImageManager = PHImageManager();
    let requestoptions : PHImageRequestOptions = PHImageRequestOptions();
    requestoptions.resizeMode = PHImageRequestOptionsResizeMode.None;

    imageManager.requestImageForAsset(asset, targetSize: PHImageManagerMaximumSize, contentMode: PHImageContentMode.Default, options: PHImageRequestOptions(), resultHandler: { (let image : UIImage?, _) -> Void in

        let output : PHContentEditingOutput = PHContentEditingOutput(contentEditingInput: input);

        PHPhotoLibrary.sharedPhotoLibrary().performChanges({ () -> Void in

            let changeRequest = PHAssetChangeRequest(forAsset: asset);

            /* Neu */
            let imageData : NSData = NSData(contentsOfURL: (input.fullSizeImageURL)!)!;
            let image : CIImage = CIImage(data: imageData)!;
            let dataPtr = CFDataCreate(kCFAllocatorDefault, UnsafePointer<UInt8>(imageData.bytes), imageData.length)


            // Save off the properties
            let imageSource : CGImageSourceRef = CGImageSourceCreateWithData(dataPtr, nil)!;
            var metadata : NSMutableDictionary = NSMutableDictionary(dictionary: CGImageSourceCopyProperties(imageSource, nil)!);



/* Add some values to metadata */
....

            NSLog("New metadata: %@", metadata);

            // Save the image
            let outputImageSource : CGImageSourceRef = CGImageSourceCreateWithData(dataPtr, nil)!;
            let jpegData : CFMutableDataRef = CFDataCreateMutable(kCFAllocatorDefault, 0);
            let outputDestination : CGImageDestinationRef = CGImageDestinationCreateWithData(jpegData, CGImageSourceGetType(outputImageSource)!, 1, nil)!;

            // add the image data to the destination
            CGImageDestinationAddImageFromSource(outputDestination, outputImageSource, 0, metadata);

            if CGImageDestinationFinalize(outputDestination)
            {
                NSLog("Successful image creation.");
                // process the image rendering, adjustment data creation and finalize the asset edit.
            }
            else
            {
                NSLog("Image creation failed.");
            }



            (jpegData as NSData).writeToURL(output.renderedContentURL, atomically: true);


            let options : String = NSString(format: "%f|%f|%f|%f|%f|%f", self.saturationSlider.value, self.warmthSlider.value, self.brightnessSlider.value, self.sharpnessSlider.value, self.contrastSlider.value, self.gammaSlider.value ) as String;
            let nsObject: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"];

            output.adjustmentData = PHAdjustmentData(formatIdentifier: NSBundle.mainBundle().bundleIdentifier!,
                formatVersion: nsObject as! String,
                data: options.dataUsingEncoding(NSUTF8StringEncoding)!);

            changeRequest.contentEditingOutput = output;

            }, completionHandler: { (_bool, _error) -> Void in
                if !_bool && error != nil
                {
                    NSLog("%@", error!);
                }
        });
    });
});
}, completionHandler: { (_bool, _error) -> Void in
});

回答1:


You can add/set a few properties on the creationRequest object. I don't know about adding custom metadata.

PHPhotoLibrary.shared().performChanges({

    let creationRequest = PHAssetChangeRequest.creationRequestForAsset(from: self.anImage!)

    let aLocation = CLLocation(latitude: 27.63866, longitude: -80.39707)

    creationRequest.location = aLocation

    creationRequest.isFavorite = true

    creationRequest.creationDate = Date()

}, completionHandler: {success, error in
    if !success {
        print("error creating asset: \(error!)")
    } else {
        print("success creating asset!")
    }
})


来源:https://stackoverflow.com/questions/33798132/save-metadata-for-custom-image-with-swift-ios-and-photos-framework

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!