`
iamzhaozheng
  • 浏览: 161006 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Mac OS截屏

阅读更多

从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;
}
0
1
分享到:
评论

相关推荐

    MAC OS X 截图快捷键

    MAC OS X 截图快捷键

    MAC OS基本操作

    在MAC OS中,用户可以通过多种方式实现屏幕截图。其中,一种是通过系统自带的应用程序“抓图”进行操作: 1. **打开“抓图”应用程序**: - 首先,在桌面菜单中选择“前往”-&gt;“应用程序”-&gt;“实用工具”-&gt;“抓图...

    Mac技巧之苹果电脑Mac OS X系统上,类似Windows画图板的软件paintbrush_For Tiger

    苹果电脑Mac OS X系统上,类似Windows画图板的软件paintbrush截图 paintbrush界面截图 paintbrush 的按钮布局和功能与PC电脑Windows自带的画图都很接近,基本不用介绍了。注意那个地雷按钮!他的作用是清除整个画面-...

    Mac OS壁纸,4K、5k壁纸,13张

    本文将详细讨论Mac OS操作系统中的壁纸,特别是那些4K和5K分辨率的高清壁纸,以及如何在Mac设备上管理和更换壁纸。 Mac OS是由苹果公司开发的一款操作系统,以其独特的设计美学和流畅的用户体验而广受赞誉。壁纸,...

    苹果Mac OS X快捷键大全

    ### 苹果Mac OS X快捷键大全 #### 开机与系统操作 - **Option (⌥) 键**:开机时按住Option键可进入启动管理器界面,选择启动磁盘。 - **Command (⌘) + Option (⌥)**:用于进入经典模式下的Mac OS 9系统环境,...

    mac os internals

    Mac OS内部机制的探讨,意味着对操作系统的底层架构、运行原理和历史发展进行深入了解。根据上述文件信息,可以提炼以下知识点: 1. Mac OS X的起源和发展历史:文档中提到,该文档不仅涵盖了Mac OS X及其相关祖先...

    MAC OS没有截图工具?省着点,系统帮你备着呢.docx

    在Mac OS操作系统中,用户无需担心找不到截图工具,因为系统本身已经内置了强大的截图功能,这些功能既简单又实用,可以满足大多数用户的截图需求。在本文中,我们将深入探讨Mac OS自带的截图工具以及如何利用它进行...

    关于Mac OS X5个屏幕截图功能.docx

    Mac OS X操作系统提供了丰富的屏幕截图功能,这使得用户能够轻松捕获并保存屏幕上的任何内容。以下是关于Mac OS X五个屏幕截图功能的详细介绍: 1. 快捷键截图: - `Command + Shift + 3`:按下这个快捷键组合会...

    YUV播放器For MAC OS 功能强大能用

    标题提到的"YUV播放器For MAC OS 功能强大能用",指的是专门针对MAC操作系统设计的一款能够处理和播放YUV格式视频文件的应用程序。YUV格式通常被用于数字视频处理,因为它可以有效地分离亮度(Y)和色度(U和V)信息...

    Mac技巧之苹果电脑Mac OS X系统上,类似Windows画图板的软件paintbrush(For Mac 10.5 or higher)

    苹果电脑Mac OS X系统上,类似Windows画图板的软件paintbrush截图 paintbrush界面截图 paintbrush 的按钮布局和功能与PC电脑Windows自带的画图都很接近,基本不用介绍了。注意那个地雷按钮!他的作用是清除整个画面-...

    MAC Os Mojave.png

    网上教程,寻找资源不易,故全部截图,有几个图片失联,但是总体不影响,因为失联的是安装完成的。我们需要的是怎么安装,步骤没少

    安装Mac os系统,,主要介绍如何通过windows制作U盘启动盘并按照U盘安装Mac os系统

    1、本文档主要介绍如何通过windows制作U盘启动盘并按照U盘安装Mac os系统 2、文档中包括两个文件,一个是详细的制作U盘过程和安装Mac os 过程,包含截图 另一文件是windows 制作U盘的工具软件

    VM15安装Mac OS10.14懒人版CDR版 全套链接.rar

    标题中的“VM15安装Mac OS10.14懒人版CDR版”指的是使用VMware Fusion 15虚拟机软件安装Mac OS Mojave(版本10.14)的一种简便方法。懒人版通常是指经过优化和预配置的系统镜像,使得安装过程更加简单快捷,尤其适合...

    WebVideoPlugin.pkg.zip

    【标题】"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 Programming for Mac OS X 4th Edition》是一本专注于教授如何使用Cocoa框架进行Mac OS X应用开发的专业书籍。本书由Aaron ...

    WIN7安装Mac OS X10.6超详细教程(硬盘安装)

    但我可以根据标题和描述,以及一般性的了解,提供一个关于在Windows 7环境下安装Mac OS X 10.6(雪豹)的详细教程的知识点。 首先,这个教程关注的是如何在Windows 7操作系统下,通过硬盘安装方式实现Mac OS X 10.6...

    VMware14下安装MAC OS 10.13 虚拟机(全屏显示问题处理).docx

    在本文档中,我们将探讨如何在Windows 10操作系统上使用VMware 14安装MAC OS 10.13 High Sierra虚拟机,并解决安装后虚拟机无法全屏显示的问题。VMware 14和Mac插件的安装过程相对简单,因此在此不再详细解释。 ...

    PhoneGap命令行工具快速创建IOS PhoneGap项目 基于Mac OS X

    PhoneGap命令行工具快速创建IOS PhoneGap项目,基于Mac OS X 有截图

    Mac.OS.X.Leopard.Phrasebook

    我粗略翻了一下,果然是Phrasebook,几乎没有图的——想想看,一本几乎没有截图的Mac OS X的图书是一本多恐怖的书!而全是文字又意味着什么呢?当然是UNIX!想体验Mac OS X华丽的界面下强大的UNIX核心的用户,这本书...

    Sublime Text 2.0.2 ST中文论坛 破解加强版(Mac OS)

    Sublime Text 2.0.2 ST中文论坛 破解加强版(Mac OS) 下载安装后即可使用,免注册,无乱码,默认支持GBK,GB2312 软件截图见:http://sublimetext.iaixue.com/forum.php?mod=viewthread&tid=18

Global site tag (gtag.js) - Google Analytics