当前位置:编程学习 > wap >>

iOS Example:SquareCam分析

[cpp] 
// used for KVO observation of the @"capturingStillImage" property to perform flash bulb animation  
static const NSString *AVCaptureStillImageIsCapturingStillImageContext = @"AVCaptureStillImageIsCapturingStillImageContext"; 
 
static CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;}; 
 
static void ReleaseCVPixelBuffer(void *pixel, const void *data, size_t size); 
static void ReleaseCVPixelBuffer(void *pixel, const void *data, size_t size)  

    /**
     CVPixelBuffer(core video pixel buffer): 指的是主内存中的图片缓存,用来保存图片像素数据。应用程序在产生图片帧、解压缩视频数据或调用Core Image的时候可以调用此对象
     **/ 
    CVPixelBufferRef pixelBuffer = (CVPixelBufferRef)pixel; 
    CVPixelBufferUnlockBaseAddress( pixelBuffer, 0 ); 
    CVPixelBufferRelease( pixelBuffer ); 

 
 
//用给定的pixel buffer创建CGImage对象, pixel buffer必须为未压缩的kCVPixelFormatType_32ARGB 或者 kCVPixelFormatType_32BGRA  
static OSStatus CreateCGImageFromCVPixelBuffer(CVPixelBufferRef pixelBuffer, CGImageRef *imageOut); 
static OSStatus CreateCGImageFromCVPixelBuffer(CVPixelBufferRef pixelBuffer, CGImageRef *imageOut)  
{    
    OSStatus err = noErr; 
    OSType sourcePixelFormat; 
    size_t width, height, sourceRowBytes; 
    void *sourceBaseAddr = NULL; 
    CGBitmapInfo bitmapInfo; 
    CGColorSpaceRef colorspace = NULL; 
     
    //一些Quartz程序直接提供block数据给程序,而不是从内存中读取,CGDataProviderRef允许用户以这种方式提供给Quartz数据。(等于是Quartz定义的一种数据格式)  
    CGDataProviderRef provider = NULL; 
    CGImageRef image = NULL; 
     
    sourcePixelFormat = CVPixelBufferGetPixelFormatType( pixelBuffer ); 
    if ( kCVPixelFormatType_32ARGB == sourcePixelFormat ) 
        bitmapInfo = kCGBitmapByteOrder32Big | kCGImageAlphaNoneSkipFirst; 
    else if ( kCVPixelFormatType_32BGRA == sourcePixelFormat ) 
        bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst; 
    else 
        return -95014; // only uncompressed pixel formats  
     
     
    //获取pixel buffer中数据属性  
    sourceRowBytes = CVPixelBufferGetBytesPerRow( pixelBuffer ); 
    width = CVPixelBufferGetWidth( pixelBuffer ); 
    height = CVPixelBufferGetHeight( pixelBuffer ); 
     
    CVPixelBufferLockBaseAddress( pixelBuffer, 0 ); 
     
    //获取pixel buffer的其实地址?直接内存操作了啊? 靠  
    sourceBaseAddr = CVPixelBufferGetBaseAddress( pixelBuffer ); 
     
    colorspace = CGColorSpaceCreateDeviceRGB(); 
     
    CVPixelBufferRetain( pixelBuffer ); 
     
    //将Data转换为Quartz直接访问的数据类型,目测其逻辑为制定数据内容,给定起始地址、长度等信息。  
    provider = CGDataProviderCreateWithData( (void *)pixelBuffer, sourceBaseAddr, sourceRowBytes * height, ReleaseCVPixelBuffer); 
    image = CGImageCreate(width, height, 8, 32, sourceRowBytes, colorspace, bitmapInfo, provider, NULL, true, kCGRenderingIntentDefault); 
     
bail: 
    if ( err && image ) { 
        CGImageRelease( image ); 
        image = NULL; 
    } 
    if ( provider ) CGDataProviderRelease( provider ); 
    if ( colorspace ) CGColorSpaceRelease( colorspace ); 
    *imageOut = image; 
    return err; 

 
// utility used by newSquareOverlayedImageForFeatures for   
static CGContextRef CreateCGBitmapContextForSize(CGSize size); 
static CGContextRef CreateCGBitmapContextForSize(CGSize size) 

    CGContextRef    context = NULL; 
    CGColorSpaceRef colorSpace;   //  
    int             bitmapBytesPerRow; 
     
    bitmapBytesPerRow = (size.width * 4); 
     
    colorSpace = CGColorSpaceCreateDeviceRGB(); 
    context = CGBitmapContextCreate (NULL, 
                                     size.width, 
                                     size.height, 
                                     8,      // bits per component  
                                     bitmapBytesPerRow, 
                                     colorSpace, 
                                     kCGImageAlphaPremultipliedLast); 
    CGContextSetAllowsAntialiasing(context, NO); 
    CGColorSpaceRelease( colorSpace ); 
    return context; 

 
#pragma mark-  
 
@inte易做图ce UIImage (RotationMethods) 
- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees; 
@end 
 
@implementation UIImage (RotationMethods) 
 
- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees 
{    
    // calculate the size of the rotated view's containing box for our drawing space &nb

补充:移动开发 , IOS ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,