5
私は合成で生成したメタデータにメタデータを追加し、Photosフレームワークを使用してカメラロールに保存しようとしています。私は保存と編集の作業をしましたが、メタデータを追加する方法を理解しているように見えます。 CoreGraphicsイメージを作成してメタデータを追加するなど、さまざまなアプローチを試みました(下記のコードを参照)。これらのアプローチはすべてエラーにはなりませんが、Macで画像を開くとメタデータは表示されません。Swift(iOS)とPhotosフレームワークでカスタム画像のメタデータを保存
誰でも正しい方向に向けることができますか?
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年以上後、私は同じ結果を得ています。エラーはなく、カスタムメタデータもありません。 Photosフレームワークはアセットの「編集メタデータ」を宣伝しますが、実際のEXIFタイプのメタデータは編集できません。 – snakeoil
私は同じ問題にぶつかりました。私はこの質問の自分のバージョンを投稿した。https://stackoverflow.com/questions/48255636/editing-photo-metadata-and-phadjustmentdata。画像に既に別のアプリケーションからPHAdjustmentDataが添付されている場合、exifプロパティの編集が機能しているようです。私は最終的にあきらめて、イメージ作成のexif commentプロパティにIDを追加し、これを使用してコアデータに格納されている追加のメタデータを格納している辞書を索引付けしました。 – Spads