从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 X系统上,类似Windows画图板的软件paintbrush截图 paintbrush界面截图 paintbrush 的按钮布局和功能与PC电脑Windows自带的画图都很接近,基本不用介绍了。注意那个地雷按钮!他的作用是清除整个画面-...
网上教程,寻找资源不易,故全部截图,有几个图片失联,但是总体不影响,因为失联的是安装完成的。我们需要的是怎么安装,步骤没少
关于Mac OS X5个屏幕截图功能.docx
1、本文档主要介绍如何通过windows制作U盘启动盘并按照U盘安装Mac os系统 2、文档中包括两个文件,一个是详细的制作U盘过程和安装Mac os 过程,包含截图 另一文件是windows 制作U盘的工具软件
MAC OS没有截图工具?省着点,系统帮你备着呢.docx
苹果电脑Mac OS X系统上,类似Windows画图板的软件paintbrush截图 paintbrush界面截图 paintbrush 的按钮布局和功能与PC电脑Windows自带的画图都很接近,基本不用介绍了。注意那个地雷按钮!他的作用是清除整个画面-...
Windows环境下使用虚拟机安装Mac OS教程 很详细,包括所需软件以及安装的每个步骤截图
12张PC壁纸,一张手机壁纸。 喜欢mac os的朋友可以下载,省去找的时间。
PhoneGap命令行工具快速创建IOS PhoneGap项目,基于Mac OS X 有截图
我粗略翻了一下,果然是Phrasebook,几乎没有图的——想想看,一本几乎没有截图的Mac OS X的图书是一本多恐怖的书!而全是文字又意味着什么呢?当然是UNIX!想体验Mac OS X华丽的界面下强大的UNIX核心的用户,这本书...
当前Mac OS 系统版本:10.14 当前QQ 版本:V6.6.1 前言 由于已经安装了Snipaste用于截图,且给设置了截图快捷键是:control+command+A,这个和QQ的默认快捷键冲突了。然后就想把QQ的快捷键给取消掉。倒是在百度经验...
在VMware14下安装MAC OS 10.13 HSierra为例, VMware14及MAC插件的安装比较简单,文档中不再赘述,本文主要讲述安装MAC虚拟机及如何解决MAC虚拟机安装完成后不能全屏显示的问题,文档中附有详细操作步骤、截图,...
Snapz Pro X for mac是由 Ambrosia Software 推出的一款Mac OS系统实用的截屏及屏幕录像软件。Snapz Pro X 允许用户截取屏幕画面或者屏幕上的任一视频。它的主要特征是:一系列设置选项;用户可以识别文件类型、压缩...
Sublime Text 2.0.2 ST中文论坛 简体中文汉化版(Mac OS) 下载安装后即可使用,简体中文汉化菜单,免注册,无乱码,默认支持GBK,GB2312 软件截图见:http://sublimetext.iaixue.com/forum.php?mod=viewthread&tid=19
Sublime Text 2.0.2 ST中文论坛 破解加强版(Mac OS) 下载安装后即可使用,免注册,无乱码,默认支持GBK,GB2312 软件截图见:http://sublimetext.iaixue.com/forum.php?mod=viewthread&tid=18
Sublime Text 2.0.2 ST中文论坛 繁体中文汉化版(Mac OS) 下载安装后即可使用,繁体中文汉化菜单,免注册,无乱码,默认支持GBK,GB2312 软件截图见:http://sublimetext.iaixue.com/forum.php?mod=viewthread&tid=20
里面有在VMware8.0下安装Mac操作系统的详细步骤,及每一步截图!希望对大家有帮助!
一款适用于Windows和MAC系统的截屏生成GIF动画的软件.zip,用于windows和os x的licecap简单动画屏幕捕获工具
重命名 iRename 是 Mac OS X Lion 的批量重命名应用程序。 AppStore 版本不是我的。 从本项目的 Releases 部分下载它。 截图 主窗口 简单替换 正则表达式替换为模式验证 内联编辑