由于项目需要,需要一个截图功能。
// 截屏(全屏幕)
- (IBAction)button1:(id)sender {
NSMutableArray *datas = [NSMutableArray array];
//存储所有显示器显示id
CGDirectDisplayID dspyIDArray[10];
uint32_t dspyIDCount = 0;
//获取当前活跃的所有显示器id及其个数
if (CGGetActiveDisplayList(10, dspyIDArray, &dspyIDCount) != kCGErrorSuccess)
return;
CFStringRef dspyDestType = CFSTR("public.png");
for(uint32_t i = 0; i < dspyIDCount; i++) {
CGDirectDisplayID mainID = dspyIDArray[i];
// 根据Quartz分配给显示器的id,生成显示器mainID的截图
CGImageRef mainCGImage = CGDisplayCreateImage(mainID);
CFMutableDataRef mainMutData = CFDataCreateMutable(NULL, 0);
CGImageDestinationRef mainDest = CGImageDestinationCreateWithData(mainMutData, dspyDestType, 1, NULL);
CGImageDestinationAddImage(mainDest, mainCGImage, NULL);
CGImageRelease(mainCGImage);
CGImageDestinationFinalize(mainDest);
CFRelease(mainDest);
[datas addObject:(__bridge NSData *)mainMutData];
CFRelease(mainMutData);
}
CFRelease(dspyDestType);
NSInteger imageCount = [datas count];
if (imageCount <= 0) {
return;
}
NSImage *tmpImage = [[NSImage alloc] initWithData:[datas objectAtIndex:imageCount-1]];
[self.imageviews setImage:tmpImage];
}
// 选取截图
- (IBAction)button2:(id)sender {
NSTask *capture = [[NSTask alloc] init];
capture.launchPath = @"/usr/sbin/screencapture";
capture.arguments = [NSArray arrayWithObjects:@"-i", @"-c", nil];
[capture setTerminationHandler: ^(NSTask *t) {
NSPasteboard *pboard = [NSPasteboard generalPasteboard];
if ([pboard pasteboardItems].count <= 0) return ;
NSPasteboardItem *pboardItem = [[pboard pasteboardItems] objectAtIndex:0];
NSString *pboardItemType = [[pboard types] objectAtIndex:0];
NSData *imageData = [pboardItem dataForType:pboardItemType];
NSImage *image = [[NSImage alloc] initWithData:imageData];
[self.imageviews setImage:image];
}];
[capture launch];
}
// 3
// 命令行选择性截屏
- (IBAction)button3:(id)sender {
NSTask *capture = [[NSTask alloc] init];
capture.launchPath = @"/usr/sbin/screencapture";
capture.arguments = [NSArray arrayWithObjects:@"-c", nil];
[capture setTerminationHandler:^(NSTask *t) {
NSPasteboard *pboard = [NSPasteboard generalPasteboard];
NSPasteboardItem *pboardItem = [[pboard pasteboardItems] objectAtIndex:0];
NSString *pboardItemType = [[pboard types] objectAtIndex:0];
NSData *imageData = [pboardItem dataForType:pboardItemType];
NSImage *image = [[NSImage alloc] initWithData:imageData];
[self.imageviews setImage:image];
image = nil;
}];
[capture launch];
}