现在的位置: 首页 > 综合 > 正文

我的扫描二维码终结了整整一天的 黑白转彩色

2013年04月01日 ⁄ 综合 ⁄ 共 2695字 ⁄ 字号 评论关闭

- (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer

{

    CVImageBufferRef buffer;

    buffer = CMSampleBufferGetImageBuffer(sampleBuffer);

    

    CVPixelBufferLockBaseAddress(buffer,
0);

    

    // CVImageBufferRef
取得影像的细部信息

    void *base;

    size_t width, height, bytesPerRow;

    base = CVPixelBufferGetBaseAddress(buffer);

    width = CVPixelBufferGetWidth(buffer);

    height = CVPixelBufferGetHeight(buffer);

    bytesPerRow = CVPixelBufferGetBytesPerRow(buffer);

    

    //利用取得影像细部信息格式化 CGContextRef

    CGColorSpaceRef colorSpace;

    CGContextRef cgContext;

    colorSpace = CGColorSpaceCreateDeviceRGB();

    cgContext = CGBitmapContextCreate(base, width, height,
8, bytesPerRow, colorSpace,
kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);

    CGColorSpaceRelease(colorSpace);

    

    //透过 CGImageRef
CGContextRef 转换成 UIImage

    CGImageRef cgImage;

    UIImage *image;

    cgImage = CGBitmapContextCreateImage(cgContext);

    image = [UIImage imageWithCGImage:cgImage];

    CGImageRelease(cgImage);

    CGContextRelease(cgContext);

    

    CVPixelBufferUnlockBaseAddress(buffer,
0);

    return image;

}

//下边的这种方法保存图片时始终有问题

- (UIImage *) imageFromSampleBuffer1:(CMSampleBufferRef) sampleBuffer

{

    CVImageBufferRef imageBuffer =
CMSampleBufferGetImageBuffer
(sampleBuffer);

    // Lock the base address of the pixel buffer

    CVPixelBufferLockBaseAddress(imageBuffer,0);

    

    // Get the number of bytes per row for the pixel buffer

    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);

    // Get the pixel buffer width and height

    size_t width = CVPixelBufferGetWidth(imageBuffer);

    size_t height = CVPixelBufferGetHeight(imageBuffer);

    

    // Create a device-dependent RGB color space

    CGColorSpaceRef colorSpace =
CGColorSpaceCreateDeviceRGB();

    if (!colorSpace)

    {

        NSLog(@"CGColorSpaceCreateDeviceRGB failure");

        return nil;

    }

    

    // Get the base address of the pixel buffer

    void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);

    // Get the data size for contiguous planes of the pixel buffer.

    size_t bufferSize = CVPixelBufferGetDataSize(imageBuffer);

    

    // Create a Quartz direct-access data provider that uses data we supply

    CGDataProviderRef provider =
CGDataProviderCreateWithData
(NULL, baseAddress, bufferSize,

                                                             
NULL
);

    // Create a bitmap image from data supplied by our data provider

    CGImageRef cgImage =

    CGImageCreate(width,

                  height,

                  8,

                  32,

                  bytesPerRow,

                  colorSpace,

                  kCGImageAlphaNoneSkipFirst |
kCGBitmapByteOrder32Little,

                  provider,

                  NULL,

                  true,

                  kCGRenderingIntentDefault);

    CGDataProviderRelease(provider);

    CGColorSpaceRelease(colorSpace);

    

    // Create and return an image object representing the specified Quartz image

    UIImage *image = [UIImage
imageWithCGImage:cgImage];

    CGImageRelease(cgImage);

    

    CVPixelBufferUnlockBaseAddress(imageBuffer,
0);

    

    return image;

}

抱歉!评论已关闭.