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

- (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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值