Sentetik olarak oluşturulduğuma meta veriler eklemeye ve Fotoğraflar çerçevesini kullanarak kamera rulosuna kaydetmeye çalışıyorum. Tasarrufu ve düzenleme çalışmasını aldım ancak meta verileri nasıl ekleyeceğimi anlayabiliyorum. Bir CoreGraphics görüntüsü oluşturarak meta verileri eklemek gibi birçok yaklaşımı denedim (aşağıdaki kod). Tüm bu yaklaşımlar bana bir hata vermiyor, ancak Mac'imde görüntüyü açtığımda meta verileri göremiyorum.Swift (iOS) ve Fotoğraflar çerçevesiyle özel görüntü için meta verileri kaydetme
Buraya kimse bana doğru yönde işaret edebilir mi?
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
});
Bir yıl sonra burada ama aynı sonuçları buluyorum. Hata yok, ancak özel bir meta veri yok. Fotoğraflar çerçevesi bir öğe için "meta verileri düzenleme" olarak tanımlarken, gerçek EXIF türü meta verileri düzenlemeyi açıkça önermez. – snakeoil
Aynı konuyla karşılaştım. Bu soruyu kendi versiyonumda yayınladım https://stackoverflow.com/questions/48255636/editing-photo-metadata-and-phadjustmentdata. Resimde, başka bir uygulamadan eklenen bir PHAdjustmentData varsa exif özellikleri çalışır. Sonunda pes ettim ve görüntü oluşturmadaki exif yorum özelliğine bir kimlik ekledim ve bunu Çekirdek Verilerde saklanan ek meta verileri depolayan bir sözlüğü indekslemek için kullandım. – Spads