首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用CGImage相机制作灰度CGImage?

如何用CGImage相机制作灰度CGImage?
EN

Stack Overflow用户
提问于 2015-05-04 15:35:17
回答 3查看 838关注 0票数 5

我想要创建灰度CGImage从iPhones相机数据。我使用AVFoundation并将像素格式类型设置为

代码语言:javascript
复制
kCVPixelFormatType_420YpCbCr8BiPlanarFullRange

如果我正确理解,我应该能够从Y组件创建灰度图像,因此我实现了以下委托方法:

代码语言:javascript
复制
func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {
        let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)

        CVPixelBufferLockBaseAddress(imageBuffer, 0)
        let yPlanBufferAddress = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0)

        let width = CVPixelBufferGetWidth(imageBuffer)
        let height = CVPixelBufferGetHeight(imageBuffer)        

        let data = NSData(bytes: yPlanBufferAddress, length: width * height)
        let colorSpace = CGColorSpaceCreateDeviceGray()
        let dataProvider = CGDataProviderCreateWithCFData(data)
        let imageRef = CGImageCreate(width, height, 8, 8, width * 8, colorSpace, CGBitmapInfo.ByteOrderDefault, dataProvider, nil, false, kCGRenderingIntentDefault)
        let img = UIImage(CGImage: imageRef)

        CVPixelBufferUnlockBaseAddress(imageBuffer, 0)
        delegate?.cameraController(self, didCreateImage: img)
    }

但我看到了这样奇怪的画面:

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-04 17:50:14

你必须得到'bytesPerRow‘的Y飞机,并提供给CGImageCreate。

代码语言:javascript
复制
let bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane( w, 0 );

let imageRef = CGImageCreate(
    width
,   height
,   8
,   8
,   bytesPerRow
票数 3
EN

Stack Overflow用户

发布于 2015-05-04 16:24:17

在此之前,我使用了一个名为GPU图像的BradLarson实现的框架,非常棒的一个框架,用来制作自定义过滤器。他们也有一些预定义的过滤器,可以使用。效果相当快。

试试看!

票数 -1
EN

Stack Overflow用户

发布于 2015-05-04 16:47:26

创建灰度图像的最简单方法是使用像这样的CIFliter,只需使用这些值来获得所需的效果。你也可以把几个过滤器串联起来,以便更好地控制对比度、曝光、颜色等。

代码语言:javascript
复制
+ (UIImage *)makeBW:(UIImage *)imageToConvert
{
    CIImage *beginImage = [CIImage imageWithCGImage:[imageToConvert CGImage]];

    CIImage *blackAndWhite = [CIFilter filterWithName:@"CIColorControls"
                                        keysAndValues:
                              kCIInputImageKey, beginImage,
                              @"inputBrightness", [NSNumber numberWithFloat:0.0],
                              @"inputContrast", [NSNumber numberWithFloat:1.12],
                              @"inputSaturation", [NSNumber numberWithFloat:0.0], nil].outputImage;

    CIContext *context = [CIContext contextWithOptions:nil];

    CGImageRef cgiimage = [context createCGImage:output fromRect:output.extent];
    UIImage *newImg = [UIImage imageWithCGImage:cgiimage];

    CGImageRelease(cgiimage);

    return newImg;
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30034076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档