标签: phasset

PHAsset到UIImage

我正在尝试从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给我资产.

谢谢.

swift phasset

53
推荐指数
7
解决办法
4万
查看次数

确定iOS设备上可用的最大PHAsset图像大小

如何确定PHAssetiOS设备上可用的最大图像大小,其中"可用"我的意思是当前在设备上,不需要从iCloud照片库进行任何网络下载?

我一直在开发一个应用程序,其中一组缩略图显示在UICollectionView(很像照片应用程序),然后用户可以选择一个图像来查看它的全尺寸.如有必要,可从iCloud下载完整大小的图像.但是,我希望向用户显示图像的最大版本,直到完整大小可用.

Photos Framework的工作方式相当奇怪:

在集合视图中,我使用a PHCachingImageManager缓存(以及稍后请求)具有targetSize186x186像素的图像(UICollectionViewCell由于视网膜缩放而使尺寸加倍).

这非常有效,滚动非常快,并且在用图像填充单元格时没有延迟.检查返回图像的大小,它们大约是342x256像素.这是在我的iPhone 6上启用了iCloud Photo Library并启用了"优化存储",因此大多数图像只能在设备上存储小的缩略图.

然而,奇怪的是,如果我然后请求任何图像的完整尺寸(或更大)版本,使用PHCachingImageManagerPHImageManager.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

ios photokit phasset icloud-photo-library

50
推荐指数
1
解决办法
2092
查看次数

来自PHAsset的NSURL

我正在将我们的应用程序转换为使用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?

alassetslibrary ios8 photosframework phasset

39
推荐指数
5
解决办法
3万
查看次数

使用phimagemanager将图像保存到自定义相册?

我正在制作一个使用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)

uiimage ios swift ios8 phasset

35
推荐指数
3
解决办法
2万
查看次数

iOS8 Photos Framework:如何获取PHAsset的名称(或文件名)?

我试图使用图像名称PHAssets.但我找不到文件名元数据或任何获取图像名称的方法.获取文件名有不同的方法吗?

ios phasset

21
推荐指数
5
解决办法
3万
查看次数

获取PHAsset的本地文件路径

我有一张照片,我希望我的用户能够在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)

ios instagram swift photosframework phasset

19
推荐指数
1
解决办法
1万
查看次数

如何识别是否没有从iCloud完全下载PHAsset(所以我需要再次使用options.networkAccessAllowed请求)

文档说:

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)

ios photokit phasset

19
推荐指数
2
解决办法
9286
查看次数

如何从PHAsset获取ALAsset URL?

你可以偷偷地使用未记录的 PHAsset.ALAssetURL财产† ,但我正在寻找记录的东西.


†在Objective-C中,这将有所帮助

@interface PHAsset (Sneaky)

@property (nonatomic, readonly) NSURL *ALAssetURL;

@end
Run Code Online (Sandbox Code Playgroud)

alasset alassetslibrary ios8 photokit phasset

18
推荐指数
2
解决办法
2万
查看次数

iOS 11:[ImageManager]无法加载图像数据

更新到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)

gallery uiimage swift phasset ios11

17
推荐指数
2
解决办法
7766
查看次数

Swift - 从iOS PHAsset播放视频

我想播放PHAsset从iOS相册中收集的视频.PHAsset视频nsurl(/sf/answers/2456990021/)对我自己的应用程序有效,可以说MyPlayer几分钟/块.当我将图像/视频复制到MyPlayers自己的沙箱中nsurl时,它始终有效.在我看来,

我需要将每个视频从临时PHAssetnsurl 复制到MyPlayers沙箱(appgroup/documents),然后才能使用沙箱相对nsurl播放视频.

如果是这种情况,所有其他玩家如何在飞行中播放长视频?如果有任何其他方式播放视频而不复制到应用程序沙箱,请让我知道方式.

video nsurl ios swift phasset

16
推荐指数
3
解决办法
6133
查看次数