首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mac上图片库的程序化访问: PhotoKit / Photos Framework for Mac

Mac上图片库的程序化访问: PhotoKit / Photos Framework for Mac
EN

Stack Overflow用户
提问于 2015-05-10 04:14:51
回答 3查看 6.3K关注 0票数 11

在Objective-C中,有一个Photos Framework a.k.a. PhotoKit,它使iOS开发人员能够访问iPhone和iPad上的图片库,并检索图片/视频及其元数据。

Mac开发人员将如何执行类似的任务?似乎只有在iOS 8.0中才能使用PhotoKit。有没有Mac OS X版的Photos框架的等价物?

EN

回答 3

Stack Overflow用户

发布于 2015-05-11 03:40:44

Media Library Framework是最好的去处。

用法:

代码语言:javascript
复制
@import MediaLibrary;

- (void) awakeFromNib
{
  NSDictionary *options = @{
     MLMediaLoadSourceTypesKey: @(MLMediaSourceTypeImage),
     MLMediaLoadIncludeSourcesKey: @[MLMediaSourcePhotosIdentifier]
  };

  MLMediaLibrary *mediaLibrary = [[MLMediaLibrary alloc] initWithOptions:options];
  self.mediaLibrary = mediaLibrary;

  [mediaLibrary addObserver:self
                 forKeyPath:@"mediaSources"
                    options:0
                    context:(__bridge void *)@"mediaLibraryLoaded"];

  [mediaLibrary mediaSources]; // returns nil and starts asynchronous loading
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
                        change:(NSDictionary *)change context:(void *)context
{
   if (context == (__bridge void *)@"mediaLibraryLoaded") {
      // Media Library is loaded now, we can access mediaSources
      MLMediaSource *mediaSource = [self.mediaLibrary.mediaSources objectForKey:@"com.apple.Photos"];
   }
}

库背后的概念是,您必须请求它读取对象的属性,这将返回一个空引用。然后,您使用key-value-观察者订阅此属性,并等待它被加载。然后,您可以使用相同的原则检索下一个子项,依此类推。

票数 11
EN

Stack Overflow用户

发布于 2016-01-22 00:47:50

基于Pierre F answer,我扩展了显示所有照片的url的代码:

代码语言:javascript
复制
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

    NSDictionary *options = @{
                              MLMediaLoadSourceTypesKey: @(MLMediaSourceTypeImage),
                              MLMediaLoadIncludeSourcesKey: @[MLMediaSourcePhotosIdentifier]
                              };

    self.mediaLibrary = [[MLMediaLibrary alloc] initWithOptions:options];

    [self.mediaLibrary addObserver:self
                        forKeyPath:@"mediaSources"
                           options:0
                           context:(__bridge void *)@"mediaLibraryLoaded"];

    [self.mediaLibrary.mediaSources objectForKey:MLMediaSourcePhotosIdentifier];
}


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                        change:(NSDictionary *)change context:(void *)context
{
     MLMediaSource *mediaSource = [self.mediaLibrary.mediaSources objectForKey:MLMediaSourcePhotosIdentifier];

    if (context == (__bridge void *)@"mediaLibraryLoaded")
    {
        [mediaSource addObserver:self
                            forKeyPath:@"rootMediaGroup"
                               options:0
                               context:(__bridge void *)@"rootMediaGroupLoaded"];

        [mediaSource rootMediaGroup];
    }
    else if (context == (__bridge void *)@"rootMediaGroupLoaded")
    {
        MLMediaGroup *albums = [mediaSource mediaGroupForIdentifier:@"TopLevelAlbums"];

        for (MLMediaGroup *album in albums.childGroups)
        {
            NSString *albumIdentifier = [album.attributes objectForKey:@"identifier"];

            if ([albumIdentifier isEqualTo:@"allPhotosAlbum"])
            {
                self.allPhotosAlbum = album;

                [album addObserver:self
                        forKeyPath:@"mediaObjects"
                           options:0
                           context:@"mediaObjects"];

                [album mediaObjects];

                break;
            }
        }
    }
    else if (context == (__bridge void *)@"mediaObjects")
    {
        NSArray * mediaObjects = self.allPhotosAlbum.mediaObjects;

        for(MLMediaObject * mediaObject in mediaObjects)
        {
            NSURL * url  = mediaObject.URL;

            NSLog(url.path);
        }
    }
}
票数 4
EN

Stack Overflow用户

发布于 2019-01-22 17:39:30

尽管这不是官方记录的应用程序接口,但w0lfschild发布了Apple's PhotoKit framework for macOS的头文件。该应用程序接口看起来与iOS非常相似,所以也许您可以只使用iOS文档就能搞清楚。除了MediaLibrary框架之外,您还可以对库进行更改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30144547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档