gpt4 book ai didi

ios - Swift 3 或 4 保存到自定义相册会创建重复图像

转载 作者:行者123 更新时间:2023-11-29 00:10:53 27 4
gpt4 key购买 nike

在选择或相机完成后,我将图像保存到自定义相册。显然,相机完成后,只有一张图像,但是当用户在图库选择器中选择图像时,在完成处理程序中,当我将该图像保存到自定义相册时,总是会创建一个副本。都在图库和根相册中。似乎到处都是。我无法引用该 ID 来查看它是否是之前创建的,因为该 ID 是使用占位符新创建的。

有没有办法获取基本图像引用 ID,以便我可以将每个图像与原始图像相关联?据我了解,IOS(我讨厌ios)只保存一张实际图像,其余的只是指向原始图像对象的指针。如果是这种情况,我希望有一种方法可以获得对原始图像的可靠引用,并且从那里,我可以轻松管理从该基础图像创建的 Assets 。

public static func addNewImage(_ image:UIImage, toAlbum albumName:String,imageID:String?,onSuccess success:@escaping(String)->Void, onFailure failure:@escaping(Error?)->Void) {
guard let album = self.getAlbum(withName: albumName) else {
failure(SDPhotosHelper.albumNotFoundError)
return
}

var localIdentifier = String();

if(imageID != nil){
if(self.hasImageInAlbum(withIdentifier: imageID!, fromAlbum: albumName)){
failure(SDPhotosHelper.albumNotFoundError)
return;
}
}

PHPhotoLibrary.shared().performChanges({
let albumChangeRequest = PHAssetCollectionChangeRequest(for: album)

let assetCreationRequest = PHAssetChangeRequest.creationRequestForAsset(from: image)
//assetCreationRequest.location = "";
let placeHolder = assetCreationRequest.placeholderForCreatedAsset
albumChangeRequest?.addAssets([placeHolder!] as NSArray)
if placeHolder != nil {
localIdentifier = (placeHolder?.localIdentifier)!
}

}) { (didSucceed, error) in
OperationQueue.main.addOperation({
didSucceed ? success(localIdentifier) : failure(error)
})
}
}

最佳答案

没有人愿意为此提供帮助。幸运的是,我能够找到解决方案。对于任何遇到这个或类似的也与蟋蟀坐在一起的人:Choosing a picture causes resave to camera roll这是一个解决方案。

我的代码是创建一个新 Assets 。仅对用户用相机拍照后将图像保存到您的自定义相册有用。它适用于全新的 Assets 。

但是,对于现有 Assets ,您不想创建新 Assets 。相反,您想要将现有 Assets 添加到自定义相册。为此,您需要一种不同的方法。这是我创建的代码,它似乎可以正常工作。请记住,您必须首先获取 Assets ID,以便将其发送到您的方法并访问现有 Assets 。

因此,在您的 imagePickerController 中,您必须确定用户是选择了现有图像还是从新的相机操作中调用了该方法。

let pickerSource = picker.sourceType;
switch(pickerSource){
case .savedPhotosAlbum, .photoLibrary:
if(let url = info[UIIMagePickerControllerReferenceURL] as? NSURL{
let refURLString = refURL?.absoluteString;
/* value for refURLString looks something like assets-library://asset/asset.JPG?id=82A6E75C-EA55-4C3A-A988-4BF8C7F3F8F5&ext=JPG */
let refID = {function here to extract the id query param from the url string}
/*above gets you the asset ID, you can get the asset directly, but it is only
available in ios 11+.
*/
MYPHOTOHELPERCLASS.transferImage(toAlbum: "myalbumname", withID: refID!, ...)

}
break;
case .camera:
...
break;
}

现在,在您的 photohelper 类(或任何地方的任何函数中)中,编辑 Assets 而不是创建新 Assets ,这就是我所拥有的。我假设可以省略 changeRequest 变量。我只是在玩,直到我做对了。通过完全荒谬的苹果文档,我至少能够注意到还有其他方法可以使用。我发现 NSFastEnumeration 参数可以是 PHAssets 的 NSArray,而不仅仅是占位符 PHObjectPlaceholder 对象。

public static func transferImage(toAlbum albumName:String, withID imageID:String, onSuccess success:@escaping(String)->Void, onFailure failure:@escaping(Error?)->Void){

guard let album = self.getAlbum(withName: albumName) else{
... failure here, albumNotFoundError
return;
}

if(self.hasImageInAlbum(withIdentifier: imageID, fromAlbum: albunName)){
... failure here, image already exists in the album, do not make another
return;
}

let theAsset = self.getExistingAsset(withLocalIdentifier: imageID);
if(theAsset == nil){
... failure, no asset for asset id
return;
}

PHPhotoLibrary.shared().performChanges({
let albumChangeRequest = PHAssetCollectionChangeRequest(for: album);
let changeRequest = PHAssetChangeRequest.init(for: theAsset!);
let enumeration:NSArray = [theAsset!];
let cnt = album.estimatedAssetCount;
if(cnt == 0){
albumChangeRequest?.addAssets(enumeration);
}else{
albumChangeRequest?.inserAssets(enumeration, at: [0]);
}
}){didSucceed, error) in
OperationQueue.main.addOperation({
didSucceed ? success(imageID) : failure(error);
})
}

}

所以,它几乎是一样的,除了不是创建 Assets 创建请求并为创建的 Assets 生成占位符,而是使用现有 Assets ID 获取现有 Assets 并将现有 Assets 添加到 addasset/insertasset NSArray 参数而不是新创建的 Assets

关于ios - Swift 3 或 4 保存到自定义相册会创建重复图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46508037/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com