Objective C中的部分屏幕截图

时间:2013-02-07 22:57:44

标签: objective-c macos xcode4 core-graphics screenshot

我一直试图弄清楚如何在目标C中创建一个OS X例程:

  • 在后台运行(单独的线程)和

  • 重复(定时或满足某些条件时)捕获指定窗口/屏幕的若干已定义子集(即无需用户交互)和

  • 将图像保存到指定的路径中。

类似于“预编程的cmd-shift-4 + mouseDown-drag循环”的输出。

来自Mac开发者库的SonofGrab和ScreenSnapshot都没有表明如何做到这一点,但我怀疑CGImageRef是一种/(?)方式。

  1. 有谁知道怎么做?

  2. 除了CGImageRef之外还有其他可能的方法来解决这个问题吗?例如,它可以通过命令行工具和NSTask来完成吗?

  3. 如果是这样,不同方法在速度和复杂性方面有哪些优点/缺点?

1 个答案:

答案 0 :(得分:2)

假设您具有执行screengrab所需的逻辑(您可以在SonOfGrab中看到),您只需使用调度队列或计时器来完成这项工作。

void MyTakeScreengrab();

dispatch_queue_t  queue    = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,  0);

dispatch_source_t timerSrc = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,0,0,queue);

dispatch_source_set_timer(timerSrc, 
      dispatch_time(DISPATCH_TIME_NOW,0) /* start on */,
      SECONDS_PER_GRAB * NSEC_PER_SEC /* interval */, 
      NSEC_PER_SEC /* leeway */);

dispatch_source_set_event_handler_f(timerSrc, MyTakeScreengrab);

dispatch_resume(timerSrc);

您也可以使用NSTimer。

-(void)setup {
    _timer = [[NSTimer scheduledTimerWithTimeInterval: (NSTimerInterval)SECONDS_PER_GRAB 
            target: self 
            selector: @selector(takeScreegrabOnBGThread:) 
            userInfo: @{ @"folderPath" : MyFolderPath(), 
                         @"imageSettings" : MYCGImageSettings() }  
            repeats: YES];
    [_timer fire];
}

-(void)takeScreengrabOnBGThread:(id)userInfo {
    [self performSelectorInBackground:@selector(takeScreengrabBlocking:) 
            withObject:userInfo];
}

-(void)takeScreengrabBlocking:(id)userInfo {

    MyTakeScreengab(userInfo);
}

要使用终端执行此操作,您要查找的命令为screencapture(1)