使用PhotoKit(PHAsset)导出视频,每次都会得到不同的视频文件。
我使用该方法(A的结尾)从设备检索视频.它的作用是在库中找到第一个视频,创建导出会话并将视频导出到MOV文件中. 在两次运行应用程序(在方法之间停止应用程序)后,将比较两个结果文件.两个文件都是不同的.我期望这两个文件都相同,因为同一资产正在导出. 另外一句话:在同一应用程序运行中两次运行该方法为我提供了两个相同的文件. 是否可以使PhotoKit每次运行时导出相同的文件? - (void)testVideoRetrievalSO { PHAsset *oneVideo = [[PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:nil] firstObject]; PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init]; options.networkAccessAllowed
0 2023-11-18
编程技术问答社区
PHPhotoLibrary在保存图片的URL时出现错误
我在PHContentEditingOutput提供的URL上创建图像.当我将数据加载到UIImage并这样保存时 - 它可以工作. [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ NSData *data = [NSData dataWithContentsOfURL:contentEditingOutput.renderedContentURL] UIImage *image = [UIImage imageWithData:data]; [PHAssetChangeRequest creationRequestForAssetFromImage:image]; } completionHandler:^(BOOL success, NSError *error) { ... }]; 但是当我尝试使用URL接近时,它会失败: [[PHPhotoLibrary sharedP
2 2023-11-09
编程技术问答社区
如何在Phasset中添加图像并将其从照片库中删除?
我正在使用隐藏照片之类的应用程序,我想将图像移至我的应用程序,因此我必须从图库中导入图像并从库中删除该图像,但我不明白如何使用PHAssets>以及在哪里实施. 我使用uipickerview选择图像,然后从库中删除图像,请任何人都可以帮助我 这是我获得图像的挑选器: UIImage *chosenImage = info[UIImagePickerControllerEditedImage]; 这是用于删除的,但是资产是什么: [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ [PHAssetChangeRequest deleteAssets:formatWithOrientation]; } completionHandler:^(BOOL success, NSError *error) { NSLog(@"Finished deleting asset. %@", (succ
2 2023-11-03
编程技术问答社区
把写好的10亿多像素的图片复制到照片上?
我的应用程序成功编写了多gigapixel图像(每个图像数十亿像素). 有没有办法,没有将图像读为UIImage,将保存的图像添加或将保存的图像添加到照片? ? 很难搜索该主题,以找到不需要UIImageWriteToSavedPhotosAlbum的解决方案. 问题是,保存的图像太大而无法加载为UIImage,所以我不能使用UIImageWriteToSavedPhotosAlbum. 编辑:看来可以使用PhotoKit完成.有人可以将我指向从保存的图像文件中创建PHAsset的示例吗?我目前正在搜索. 编辑2:嗯,似乎只能修改现有PHAsset(例如,照片中已经存在的项目).我想如果是这样,那将是一个死胡同. 解决方案 您当然可以从文件中创建一个新资产,然后将其插入用户的光纤维中.看看[PHAssetChangeRequest creationRequestForAssetFromImageAtFileURL]和相关文档:
4 2023-11-03
编程技术问答社区
iOS PhotoKit。取出除全景图外的所有智能相册
我正在使用以下代码获取所有智能相册: PHAssetCollection.fetchAssetCollections(with: PHAssetCollectionType.smartAlbum, subtype: PHAssetCollectionSubtype.albumRegular, options: nil) 如何从此获取中排除Panoramas智能专辑?我认为我必须使用选项参数添加谓词,但是我不知道如何格式化谓词. 解决方案 如果要排除全景图,请考虑使用数组并仅获取所需的集合.换句话说,白名单集合.或者,您可以通过集合列举并排除全景.白名单还可以使您控制集合的顺序. var smartAlbums: [PHAssetCollection] = [] let subtypes:[PHAssetCollectionSubtype] = [ // all photos collection // .smartAlbumUserLibrary
4 2023-10-10
编程技术问答社区
如何获取屏幕录制视频
我们知道,我们可以使用PhotoKit框架 获取屏幕截图照片 let collection = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .smartAlbumScreenshots, options: fetchOption) 但是如何获取屏幕录制视频? 解决方案 if let res = PHAssetResource.assetResources(for: asset).first { if res.originalFilename.hasPrefix("RPReplay") { screenRecordings.append(asset.localIdentifier) } } 其他解决方案 尝试此⬇️ func openVideoGallery() { let picke
8 2023-10-09
编程技术问答社区
从PHAsset中修改带有mediaType视频的元数据失败。
我尝试使用mediaType == .video> mediaType == .video添加/修改元数据,我发现了一些有关类似问题的问题: 如何使用AvassetWriter? 如何更改视频元数据? 使用Avoundation 关于这些问题中的答案,我构建了以下片段,这是phasset的扩展: let options = PHVideoRequestOptions() options.version = .original PHImageManager.default().requestAVAsset(forVideo: self, options: options, resultHandler: { asset, audioMix, info in if asset != nil && asset!.isKind(of: AVURLAsset.self) { let urlAsset = asset as! AVURLAsse
4 2023-10-09
编程技术问答社区
PHAsset: 什么是'assetSource'?
我正在枚举一个phfetchresult.如果我在返回的拟光的phasset上进行println,我会得到: 4CBE5A4F-90BD-438B-954E-6FF1B14538CD/L0/001 mediaType=1/0, assetSource=3, (2448x3264), creationDate=2014-10-15 14:20:12 +0000, location=1, hidden=0, favorite=1 有人知道assetSource=3位是什么?如果可能的话,我想在AssetSource上运行谓词,但找不到有关它是什么或如何访问它的任何信息.是私人吗? 解决方案 assetSource是一个私人变量,因此其含义有目的不透明. 您可以使用谓词从其description上过滤description进行进一步调查,例如 其他解决方案 可能与IOS9中即将到来的Phassetsourcetype有关
2 2023-10-09
编程技术问答社区
以编程方式向iCloud共享相册添加资产
使用Photokit将照片添加到共享的iCloud相册中是否存在任何限制?虽然我可以将新照片添加到常规专辑的AssetCollections中,但如果资产计算代表iCloud共享专辑,它根本不起作用.我还需要添加其他类型的phasset吗? 如果我更改fetchAssetCollections使用.albumRegular而不是.albumCloudShared,则下面的代码可行.否则我会遇到错误: The operation couldn't be completed. (PHPhotosErrorDomain error -1.) let sharedAlbums = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .albumCloudShared, options: nil) let target = sharedAlbums.firstObject PHPhotoLibrary.
6 2023-10-08
编程技术问答社区
获取保存在照片库中的图像的PHAsset/localIdentifier
我正在使用 UIImageWriteToSavedPhotosAlbum 将图像保存到照片应用程序中.这是我发现让您这样做的唯一功能. 这是我的代码: import UIKit import Photos class ViewController: UIViewController { /// photo of a cactus let photoURL = URL(string: "https://raw.githubusercontent.com/aheze/DeveloperAssets/master/cactus.png")! /// in my app it's actually a local URL, but this also works func saveToPhotos() { DispatchQueue.global().async { let data = try? Data
2 2023-10-08
编程技术问答社区
PHObject localIdentifier的可靠性
是否有情况,本地识别仪可以更改还是不准确?我正在研究一个备份照片的应用程序,并被我的同事告诉本地Identientifier不能被信任.但是,经过一些研究,我找不到有人在谈论这个问题. 解决方案 LocalIdentifier有时在更新iOS版本后会更改. 在我自己的应用中,iOS更新两次后,我已经看到PHAsset.localIdentifiers(照片API)更改.最后一次是在更新iOS 11之后.相关的应用程序跟踪局部识别仪,因此可以根据各种谓词找到/分类特定的图像. . 一旦iOS10到11的更新完成了,所有 该应用程序在本地保存的本地识别器就变得无用,因为它们与任何设备映像不匹配,尽管它们仍然存在于相机卷中. 就像您一样,我已经搜索了有关此主题的信息,而没有成功.抱歉,我的答复是坏消息. 其他解决方案 在各处使用phcloudidentifier.如果需要数据存储目的,则可以使用myCloudidentifier.stringvalue.
4 2023-10-08
编程技术问答社区
给定一个CIImage,将图像数据写入磁盘的最快方式是什么?
我正在与Photokit合作,并且已经实现了用户可以在其照片库中申请照片.我目前正在获取图像,应用过滤器,将编辑版本返回为CIImage,然后使用UIImageJPEGRepresentation将CIImage转换为NSData,因此我可以将其写入磁盘.虽然这可以很好地工作,但是当用户尝试编辑真正的大型(例如30 MB)照片时,可能需要超过30秒的时间才能发生,而98%的时间在UIImageJPEGRepresentation上花费了98%(从仪器中获得). 我正在寻找一种更有效的方法来将这张编辑的照片保存到磁盘上,而无需损害质量. 我理解UIImagePNGRepresentation可能会提高质量,但这甚至比JPEG表示慢. 这是我目前正在做的,在默认优先级线程(qos_class_utility)上: func jpegRepresentationOfImage(image: CIImage) -> NSData { let eaglContext
40 2023-10-07
编程技术问答社区
获取新创建资产的URL,iOS 9风格
如今, ALAssetsLibrary已弃用,但实际上所有示例都在使用它.为了我的目标,我需要知道添加到照片库的视频的URL,以便我可以在Instagram应用程序中分享一个视频(这是Instagram接受视频的唯一途径). URL可能应该以"资产://..." 开始 这很简单,ALAssetsLibrary: ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; [library writeVideoAtPathToSavedPhotosAlbum:videoFilePath completionBlock:^(NSURL *assetURL, NSError *error) { // ... 上面,URL作为参数传递给完成块.但是iOS 9与PHPhotoLibrary类和performChanges方法兼容的方式呢? var videoAssetPlaceholder:PHObjectPlace
0 2023-10-07
编程技术问答社区
如何从PHPickerViewController委托中获取实时照片或视频
苹果的新iOS 14 phpickerviewController代表仅收到NSITEMPROVIDER. 2020年WWDC视频显示了如何从那里到达uiimage: let prov = result.itemProvider prov.loadObject(ofClass: UIImage.self) { im, err in if let im = im as? UIImage { DispatchQueue.main.async { // display the image here 但是,用户是否选择现场照片或视频呢?我们如何得到? 解决方案 实时照片很容易;以完全相同的方式进行操作.您可以这样做,因为Phlivephoto是一类.所以: let prov = result.itemProvider prov.loadObject(ofClass: P
8 2023-06-02
编程技术问答社区
如何知道一个PHAsset是否被修改了?
更具体地说,您怎么知道PHAsset是否具有与原始资产不同的当前版本? 我的用户只需要在必要时在当前或原始资产之间进行选择.然后我需要他们的答案PHImageRequestOptions.version. 解决方案 从iOS 16开始,PHAsset具有hasAdjustments属性,该属性指示是否已编辑资产. 对于以前的发行版,您可以通过PHAssetResource api获取给定资产的一系列数据资源 - 如果已编辑该资产,它将具有调整数据资源. let isEdited = PHAssetResource.assetResources(for: asset).contains(where: { $0.type == .adjustmentData }) 请注意,如果您想实际使用资源文件,则必须使用PHAssetResourceManager API获取其数据.另请注意,此方法立即返回 - 与其他答案不同,没有等待异步网络请求. 其他解决方案
2 2023-06-02
编程技术问答社区
IOS8。照片应用程序的错误?
当我在iOS8中使用标准照片应用程序中使用过滤器时,我无法获得完整的元数据. 我尝试两种方法获取元数据: [manager requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { CIImage *ciimage = [CIImage imageWithData:imageData]; NSMutableDictionary *exif = [NSMutableDictionary dictionary]; [exif addEntriesFromDictionary:ciimage.properties]; }]; [asset requestContentEditingInputWithOptions:
10 2023-05-25
编程技术问答社区
对Mac OS X上的照片库的程序化访问。PhotoKit / Photos Framework for Mac
在Objective-C中,有一个照片框架a.k.a.开发人员可以访问iPhone和iPad上的照片库,并与他们的元数据一起检索图片/视频. Mac开发人员将如何执行类似的任务? 似乎Photokit仅在iOS 8.0中可用. Mac OS X是否有相当于照片框架? 解决方案 用法: @import MediaLibrary; - (void) awakeFromNib { NSDictionary *options = @{ MLMediaLoadSourceTypesKey: @(MLMediaSourceTypeImage), MLMediaLoadIncludeSourcesKey: @[MLMediaSourcePhotosIdentifier] }; MLMediaLibrary *mediaLibrary = [[MLMediaLibrary alloc] initWithOptions:options]; sel
8 2023-05-25
编程技术问答社区
使用照片框架从画廊上传视频
使用Photos Framework从画廊上传视频的最佳方法是什么? 在使用AlassetRementation和Next方法之前: - (NSUInteger)getBytes:(uint8_t *)buffer fromOffset:(long long)offset length:(NSUInteger)length error:(NSError **)error; 这允许上传文件,而无需首先将其复制到App Temp Directory.在照片框架中没有看到任何替代方案.似乎使用Avassetexportsession->导出到本地目录 - >上传,但这需要额外的存储空间(如果视频太大,可能是一个问题) 解决方案 似乎唯一有效的方法是从PHImageManager请求AVAsset,并检查返回的资产是否为AVURLAsset.在这种情况下,URL可用于直接访问文件并获得字节所需的块: [[PHImageManager defaultManager] req
10 2023-05-05
编程技术问答社区
Photokit中的元数据(EXIF、TIFF等)
在iOS 8中,使用新的光塑料,创建新图像的方法是-[PHPhotoLibrary performChanges:completionHandler],以此方式: [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; // TODO set metadata? } completionHandler:^(BOOL success, NSError *error) { if(success) { // do stuff } }]; 但是,我找不到有关如何在图像上设置元数据的任何文档. 在旧的AlassetLibrary中(仍然有效,仍然可能是"正确"的方式),您只需
14 2023-05-05
编程技术问答社区
使用照片框架将图像保存到照片库
每次尝试使用照片框架保存图像时,我的应用都会崩溃. -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ _mChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:[info valueForKey:UIImagePickerControllerOriginalImage]]; [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ _mChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:[info valueForKey:UIImageP
8 2023-05-04
编程技术问答社区