从Snow Leopard系统开始,苹果直接提供了截取屏幕的API,使得之前通过读取分析屏幕信息进行截屏的方式大大简化。
#include "OpenGL/gl.h"
+ (NSImage *)capture
{
CGImageRef imageRef = CGDisplayCreateImage(kCGDirectMainDisplay);
NSImage *image = [[NSImage alloc]initWithCGImage:imageRef size:NSZeroSize];
return image;
}
而在10.5之前,则类似于这样的代码:
+ (NSImage *)captureOld
{
NSEnumerator * enumerator = [[NSScreen screens] objectEnumerator];
id obj = nil;
NSRect screenRect;
NSScreen * useThisScreen = [NSScreen mainScreen];
// NSRect rect = NSMakeRect(0, 0, 256, 256);
NSRect rect = [useThisScreen frame];
while (obj = [enumerator nextObject])
{
screenRect = [obj frame];
if ((rect.origin.x >= screenRect.origin.x) &&
(rect.origin.x <= screenRect.origin.x + screenRect.size.width) &&
(rect.origin.y >= screenRect.origin.y) &&
(rect.origin.y <= screenRect.origin.y + screenRect.size.height))
{
useThisScreen = obj;
}
}
if (nil == useThisScreen)
{
NSLog(@"unable to find a valid screen");
return nil;
}
NSDictionary * descr = [useThisScreen deviceDescription];
CGDirectDisplayID display = (CGDirectDisplayID)[[descr valueForKey:@"NSScreenNumber"] unsignedIntValue];
CGRect srcRect;
srcRect.origin.x = rect.origin.x - [useThisScreen frame].origin.x;
srcRect.origin.y = rect.origin.y - [useThisScreen frame].origin.y;
srcRect.size.height = rect.size.height;
srcRect.size.width = rect.size.width;
CGContextRef bitmap;
CGColorSpaceRef cSpace = CGColorSpaceCreateDeviceRGB();
CGLContextObj glContextObj;
CGLPixelFormatObj pixelFormatObj;
long numPixelFormats;
CGLPixelFormatAttribute attribs[] =
{
kCGLPFAFullScreen,
kCGLPFADisplayMask,
0, // Display mask bit goes here
0
} ;
if ( display == kCGNullDirectDisplay )
display = CGMainDisplayID();
attribs[2] = CGDisplayIDToOpenGLDisplayMask(display);
// Build a full-screen GL context
CGLChoosePixelFormat( attribs, &pixelFormatObj, &numPixelFormats );
CGLCreateContext( pixelFormatObj, NULL, &glContextObj ) ;
CGLDestroyPixelFormat( pixelFormatObj ) ;
CGLSetCurrentContext( glContextObj ) ;
CGLSetFullScreen( glContextObj ) ;
glReadBuffer(GL_FRONT);
void * data;
long bytewidth;
GLint width, height;
long bytes;
width = srcRect.size.width;
height = srcRect.size.height;
bytewidth = width * 4; // Assume 4 bytes/pixel for now
bytewidth = (bytewidth + 3) & ~3; // Align to 4 bytes
bytes = bytewidth * height; // width * height
// Build bitmap context _
data = malloc(height * bytewidth);
bitmap = CGBitmapContextCreate(data, width, height, 8, bytewidth,
cSpace, kCGImageAlphaNoneSkipFirst);
CFRelease(cSpace);
// Read framebuffer into our bitmap
glFinish(); //Finish all OpenGL commands
glPixelStorei(GL_PACK_ALIGNMENT, 4); // Force 4-byte alignment
glPixelStorei(GL_PACK_ROW_LENGTH, 0);
glPixelStorei(GL_PACK_SKIP_ROWS, 0);
glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
glReadPixels((GLint)srcRect.origin.x, (GLint)srcRect.origin.y, width, height, GL_BGRA, GL_UNSIGNED_BYTE,data);
int i, j;
unsigned char *tmpdata = (unsigned char *)data;
char temp[4] = {0};
for (i=0; i < height / 2; i ++) {
for (j = 0; j < width; j ++) {
memcpy(temp, tmpdata + bytewidth * i + j * 4, 4);
memcpy(tmpdata + bytewidth * i + j * 4, tmpdata + bytewidth * (height - i - 1) + j * 4, 4);
memcpy(tmpdata + bytewidth * (height - i - 1) + j * 4, temp, 4);
}
}
CGImageRef newImage = CGBitmapContextCreateImage(bitmap);
NSImage *img = [[NSImage alloc]initWithCGImage:newImage size:NSZeroSize];
return img;
}
分享到:
相关推荐
MAC OS X 截图快捷键
在MAC OS中,用户可以通过多种方式实现屏幕截图。其中,一种是通过系统自带的应用程序“抓图”进行操作: 1. **打开“抓图”应用程序**: - 首先,在桌面菜单中选择“前往”->“应用程序”->“实用工具”->“抓图...
苹果电脑Mac OS X系统上,类似Windows画图板的软件paintbrush截图 paintbrush界面截图 paintbrush 的按钮布局和功能与PC电脑Windows自带的画图都很接近,基本不用介绍了。注意那个地雷按钮!他的作用是清除整个画面-...
本文将详细讨论Mac OS操作系统中的壁纸,特别是那些4K和5K分辨率的高清壁纸,以及如何在Mac设备上管理和更换壁纸。 Mac OS是由苹果公司开发的一款操作系统,以其独特的设计美学和流畅的用户体验而广受赞誉。壁纸,...
### 苹果Mac OS X快捷键大全 #### 开机与系统操作 - **Option (⌥) 键**:开机时按住Option键可进入启动管理器界面,选择启动磁盘。 - **Command (⌘) + Option (⌥)**:用于进入经典模式下的Mac OS 9系统环境,...
Mac OS内部机制的探讨,意味着对操作系统的底层架构、运行原理和历史发展进行深入了解。根据上述文件信息,可以提炼以下知识点: 1. Mac OS X的起源和发展历史:文档中提到,该文档不仅涵盖了Mac OS X及其相关祖先...
在Mac OS操作系统中,用户无需担心找不到截图工具,因为系统本身已经内置了强大的截图功能,这些功能既简单又实用,可以满足大多数用户的截图需求。在本文中,我们将深入探讨Mac OS自带的截图工具以及如何利用它进行...
Mac OS X操作系统提供了丰富的屏幕截图功能,这使得用户能够轻松捕获并保存屏幕上的任何内容。以下是关于Mac OS X五个屏幕截图功能的详细介绍: 1. 快捷键截图: - `Command + Shift + 3`:按下这个快捷键组合会...
标题提到的"YUV播放器For MAC OS 功能强大能用",指的是专门针对MAC操作系统设计的一款能够处理和播放YUV格式视频文件的应用程序。YUV格式通常被用于数字视频处理,因为它可以有效地分离亮度(Y)和色度(U和V)信息...
苹果电脑Mac OS X系统上,类似Windows画图板的软件paintbrush截图 paintbrush界面截图 paintbrush 的按钮布局和功能与PC电脑Windows自带的画图都很接近,基本不用介绍了。注意那个地雷按钮!他的作用是清除整个画面-...
网上教程,寻找资源不易,故全部截图,有几个图片失联,但是总体不影响,因为失联的是安装完成的。我们需要的是怎么安装,步骤没少
1、本文档主要介绍如何通过windows制作U盘启动盘并按照U盘安装Mac os系统 2、文档中包括两个文件,一个是详细的制作U盘过程和安装Mac os 过程,包含截图 另一文件是windows 制作U盘的工具软件
标题中的“VM15安装Mac OS10.14懒人版CDR版”指的是使用VMware Fusion 15虚拟机软件安装Mac OS Mojave(版本10.14)的一种简便方法。懒人版通常是指经过优化和预配置的系统镜像,使得安装过程更加简单快捷,尤其适合...
【标题】"WebVideoPlugin.pkg.zip" 是一个专为MAC OS设计的网络视频插件的安装包。这个压缩文件包含了 "WebVideoPlugin.pkg" 这个核心组件,它旨在提升MAC用户在网页浏览时的视频体验。 【描述】"MAC OS ...
### Cocoa Programming for Mac OS X 4th Edition #### 核心知识点概览 《Cocoa Programming for Mac OS X 4th Edition》是一本专注于教授如何使用Cocoa框架进行Mac OS X应用开发的专业书籍。本书由Aaron ...
但我可以根据标题和描述,以及一般性的了解,提供一个关于在Windows 7环境下安装Mac OS X 10.6(雪豹)的详细教程的知识点。 首先,这个教程关注的是如何在Windows 7操作系统下,通过硬盘安装方式实现Mac OS X 10.6...
在本文档中,我们将探讨如何在Windows 10操作系统上使用VMware 14安装MAC OS 10.13 High Sierra虚拟机,并解决安装后虚拟机无法全屏显示的问题。VMware 14和Mac插件的安装过程相对简单,因此在此不再详细解释。 ...
PhoneGap命令行工具快速创建IOS PhoneGap项目,基于Mac OS X 有截图
我粗略翻了一下,果然是Phrasebook,几乎没有图的——想想看,一本几乎没有截图的Mac OS X的图书是一本多恐怖的书!而全是文字又意味着什么呢?当然是UNIX!想体验Mac OS X华丽的界面下强大的UNIX核心的用户,这本书...
Sublime Text 2.0.2 ST中文论坛 破解加强版(Mac OS) 下载安装后即可使用,免注册,无乱码,默认支持GBK,GB2312 软件截图见:http://sublimetext.iaixue.com/forum.php?mod=viewthread&tid=18