我正在尝试从PHAsset创建一个UIImage(如缩略图或其他东西),以便我可以将它传递给需要UIImage的东西.我已经尝试调整我在SO上找到的解决方案(因为他们都直接将它传递到tableview或其他东西),但我没有成功(可能是因为我做得不对).
func getAssetThumbnail(asset: PHAsset) -> UIImage {
var retimage = UIImage()
println(retimage)
let manager = PHImageManager.defaultManager()
manager.requestImageForAsset(asset, targetSize: CGSize(width: 100.0, height: 100.0), contentMode: .AspectFit, options: nil, resultHandler: {(result, info)->Void in
retimage = result
})
println(retimage)
return retimage
}
Run Code Online (Sandbox Code Playgroud)
printlns告诉我,manager.request行现在没有做任何事情.如何让它作为UIImage给我资产.
谢谢.
如何确定PHAsset
iOS设备上可用的最大图像大小,其中"可用"我的意思是当前在设备上,不需要从iCloud照片库进行任何网络下载?
我一直在开发一个应用程序,其中一组缩略图显示在UICollectionView
(很像照片应用程序),然后用户可以选择一个图像来查看它的全尺寸.如有必要,可从iCloud下载完整大小的图像.但是,我希望向用户显示图像的最大版本,直到完整大小可用.
Photos Framework的工作方式相当奇怪:
在集合视图中,我使用a PHCachingImageManager
来缓存(以及稍后请求)具有targetSize
186x186像素的图像(UICollectionViewCell
由于视网膜缩放而使尺寸加倍).
这非常有效,滚动非常快,并且在用图像填充单元格时没有延迟.检查返回图像的大小,它们大约是342x256像素.这是在我的iPhone 6上启用了iCloud Photo Library并启用了"优化存储",因此大多数图像只能在设备上存储小的缩略图.
然而,奇怪的是,如果我然后请求任何图像的完整尺寸(或更大)版本,使用PHCachingImageManager
或PHImageManager.defaultManager()
使用该PHImageRequestOptionsDeliveryMode.Opportunistic
选项,返回的第一个(低质量)图像是一个小的60x45像素邮票,看起来在全屏幕上可怕,直到最终下载完整尺寸的图像来替换它.
显然,在设备上更大的缩略图(342x256)已经,因为他们是在集合视图只是显示!那么为什么地狱不会将它们作为第一个"低质量"图像返回,直到下载完整尺寸?为了确保342x256图像确实已经在设备上,我在飞行模式下运行代码,因此没有发生网络访问.
我发现如果我要求任何大小高达256x256我会得到342x256图像返回.一旦我变大(甚至1个像素),它将首先返回60x45图像然后尝试下载全尺寸图像.
我已经更改了我的代码以首先发出256x256请求,然后是一个完整大小的请求PHImageRequestOptionsDeliveryMode.HighQualityFormat
(它不会返回一个微小的中间图像),并且工作得非常好.它也是iOS Photos应用程序必须要做的,因为它在下载完整图像时显示相对高质量的缩略图.
那么,在这样的背景下,我怎么知道设备图像尺寸最大的是PHAsset
什么?256x256是一个神奇的数字,还是取决于iCloud Photo Library如何优化空间(基于库的大小和可用的设备存储)?
当然,似乎是一个错误,照片框架没有返回当前可用的最大图像(当要求的尺寸大于目前的尺寸),并且要获得它拥有的最大尺寸,你必须要求这个尺寸或更小,因为如果你要求更大,你将获得60x45的缩影!离奇.
更新:提交给Apple的错误报告:https://openradar.appspot.com/25181601
演示该错误的示例项目:https://github.com/mluisbrown/PhotoKitBug
我正在将我们的应用程序转换为使用iOS8的Photos Framework,ALAsset框架显然是iOS8下的二等公民.
我遇到的一个问题是我们的架构真的需要一个代表媒体在"磁盘"上的位置的NSURL.我们使用它将媒体上传到我们的服务器以进行进一步处理.
使用ALAsset很容易:
ALAssetRepresentation *rep = [asset defaultRepresentation];
self.originalVideo = rep.url;
Run Code Online (Sandbox Code Playgroud)
但我只是没有在PHAsset中看到这种能力.我猜我可以打电话:
imageManager.requestImageDataForAsset
Run Code Online (Sandbox Code Playgroud)
然后把它写到文件系统中的临时点,但这看起来非常重量级和浪费,更不用说潜在的慢.
有没有办法得到这个,或者我将重构更多的我的应用程序只使用NSURLs的iOS7和其他一些方法的iOS8?
我正在制作一个使用AVFoundation拍照的应用程序,我想将它们保存到自定义相册中,然后我可以在我的应用中查询和显示.(除非用户想要,否则我宁愿不在普通照片卷中使用它们)我无法在Swift中找到任何显示如何执行此操作的内容......或者根本没有.有没有不同的方式我应该这样做?
我在SO上找到了这个例子,但它对我没有意义,我无法让它工作.
func savePhoto() {
var albumFound : Bool = false
var assetCollection: PHAssetCollection!
var photosAsset: PHFetchResult!
var assetThumbnailSize:CGSize!
// Create the album if does not exist (in viewDidLoad)
if let first_Obj:AnyObject = collection.firstObject{
//found the album
self.albumFound = true
self.assetCollection = collection.firstObject as PHAssetCollection
}else{
//Album placeholder for the asset collection, used to reference collection in completion handler
var albumPlaceholder:PHObjectPlaceholder!
//create the folder
NSLog("\nFolder \"%@\" does not exist\nCreating now...", albumName)
PHPhotoLibrary.sharedPhotoLibrary().performChanges({
let request = PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(albumName)
albumPlaceholder = request.placeholderForCreatedAssetCollection
}, …
Run Code Online (Sandbox Code Playgroud) 我试图使用图像名称PHAssets
.但我找不到文件名元数据或任何获取图像名称的方法.获取文件名有不同的方法吗?
我有一张照片,我希望我的用户能够在Instagram上分享,我需要获取照片的本地文件目录.
但是,我将我的图像作为PHAsset(不是ALAsset,所有其他答案似乎都涵盖在这个主题上).
查看PHAsset文档,我没有看到"本地目录"变量.
你知道如何使用新的ios8 Photo框架从用户相机胶卷获取照片的路径吗?
这是我在用户照片卷中加载最后一张图片的代码
public func loadLastPhotoIntoGalleryIcon()
{
if(PHPhotoLibrary.authorizationStatus() != PHAuthorizationStatus.Authorized)
{
return
}
var fetchOptions:PHFetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
var fetchResult:PHFetchResult = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: fetchOptions)
var lastAsset:PHAsset = fetchResult.firstObject as PHAsset
var options:PHImageRequestOptions = PHImageRequestOptions()
options.version = PHImageRequestOptionsVersion.Current
PHImageManager.defaultManager().requestImageForAsset(lastAsset, targetSize: _view.getGalleryIconSize(), contentMode: PHImageContentMode.AspectFill, options: options)
{
(result, objects) -> Void in
self._view.setGalleryIcon(result)
}
}
Run Code Online (Sandbox Code Playgroud) 文档说:
PHImageResultIsInCloudKey:一个布尔值,指示照片资产数据是存储在本地设备上还是必须从iCloud下载.(NSNumber)如果是,则不提供图像,因为必须从iCloud下载资产数据.要下载数据,请提交另一个请求,并为networkAccessAllowed选项指定YES.
但是当资产存储在iCloud照片库中时,此键始终为YES,即使已将其完全下载到设备中(在我的应用程序中下载,也在照片应用程序中打开).
如果图像不可用,我想让用户可以下载它(但不要自动执行,至少在没有Wifi的情况下不这样做).
那么如何确定图像是否需要下载?
更奇怪的是:当我的结果块
requestImageForAsset:targetSize:contentMode:options:resultHandler:
被调用需要下载的图像时,我会在传递较小且降级的版本之后使用requestedImage == nil进行最后一次调用.
在这种情况下降级为NO,即使我没有图像,仍然必须从iCloud下载图像,因为到目前为止,只有照片应用程序中的一个小缩略图在本地可用.
我在具有不同iOS 8版本(8.1.x,8.2 beta,8.3 beta)的iPhone和iPad上进行了测试,行为总是相同的.
在Photos应用程序中打开图像后,结果处理程序的最后一次调用具有完整大小的图像,但PHImageResultIsInCloudKey仍为YES.
这是我如何请求图像的一些代码:
PHImageRequestOptions *options = [[PHImageRequestOptions alloc]init];
options.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;
options.networkAccessAllowed = NO;
[self.imageManager requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeAspectFill options:options resultHandler:^(UIImage *requestedImage, NSDictionary *info) {
// Checking for requestedImage and the info keys here
// When a full sized image was loaded, the result of PHImageResultIsInCloudKey is still YES
// When a full sized image couldn't be loaded cause it's in the cloud, isDegraded is NO and …
Run Code Online (Sandbox Code Playgroud) 你可以偷偷地使用未记录的 PHAsset.ALAssetURL
财产† ,但我正在寻找记录的东西.
†在Objective-C中,这将有所帮助
@interface PHAsset (Sneaky)
@property (nonatomic, readonly) NSURL *ALAssetURL;
@end
Run Code Online (Sandbox Code Playgroud) 更新到iOS 11后,照片资产现在加载缓慢,我在控制台中收到此消息:
[ImageManager]无法加载图像数据/var/mobile/Media/DCIM/103APPLE/IMG_3064.JPG
我使用静态函数来加载图像:
class func getAssetImage(asset: PHAsset, size: CGSize = CGSize.zero) -> UIImage? {
let manager = PHImageManager.default()
let option = PHImageRequestOptions()
option.isSynchronous = true
var assetImage: UIImage!
var scaleSize = size
if size == CGSize.zero {
scaleSize = CGSize(width: asset.pixelWidth, height: asset.pixelHeight)
}
manager.requestImage(for: asset, targetSize: scaleSize, contentMode: .aspectFit, options: option) { (image, nil) in
if let image = image {
assetImage = image
}
}
if assetImage == nil {
manager.requestImageData(for: asset, options: option, resultHandler: { (data, …
Run Code Online (Sandbox Code Playgroud) 我想播放PHAsset
从iOS相册中收集的视频.PHAsset
视频nsurl
(/sf/answers/2456990021/)对我自己的应用程序有效,可以说MyPlayer
几分钟/块.当我将图像/视频复制到MyPlayers
自己的沙箱中nsurl
时,它始终有效.在我看来,
我需要将每个视频从临时
PHAsset
nsurl 复制到MyPlayers沙箱(appgroup/documents),然后才能使用沙箱相对nsurl播放视频.
如果是这种情况,所有其他玩家如何在飞行中播放长视频?如果有任何其他方式播放视频而不复制到应用程序沙箱,请让我知道方式.