2015-05-28 49 views
0

下面的代码是试图获取图像,将其组件提取到vImage_Buffer中,然后通过此缓冲区循环并抓取每个组件,并通过填充outputBuffer来反转红色和蓝色通道。之后,我想要生成outputBuffer并从中创建一个UIImage。vImage_Buffer未呈现到CGContext中,为什么?

即使下面的代码编译并运行正常,outputImage是空白的,我没有得到任何错误。

CGFloat inputImageScale = inputImage.scale; 

CGSize outputImageSizeInPoints = inputImage.size; 
CGRect outputImageRectInPoints = { CGPointZero, outputImageSizeInPoints }; 

UIGraphicsBeginImageContextWithOptions(outputImageRectInPoints.size, NO, inputImageScale); 
CGContextRef outputContext = UIGraphicsGetCurrentContext(); 
CGContextScaleCTM(outputContext, 1.0, -1.0); 
CGContextTranslateCTM(outputContext, 0, -outputImageRectInPoints.size.height); 

vImage_Buffer originalBuffer; 

vImage_Buffer *inputBuffer; 
vImage_Buffer *outputBuffer; 
vImage_CGImageFormat format = { 
    .bitsPerComponent = 8, 
    .bitsPerPixel = 32, 
    .colorSpace = NULL, 
    // (kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little) 
    // requests a BGRA buffer. 
    .bitmapInfo = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little, 
    .version = 0, 
    .decode = NULL, 
    .renderingIntent = kCGRenderingIntentDefault 
}; 

vImage_Error e = vImageBuffer_InitWithCGImage(&originalBuffer, &format, NULL, inputImage.CGImage, kvImagePrintDiagnosticsToConsole); 
if (e != kvImageNoError) 
{ 
    NSLog(@"*** error: vImageBuffer_InitWithCGImage returned error code %zi for inputImage: %@", e, inputImage); 
    UIGraphicsEndImageContext(); 
    return nil; 
} 

inputBuffer = &originalBuffer; 
vImageBuffer_Init(outputBuffer, originalBuffer.height, originalBuffer.width, format.bitsPerPixel, kvImageNoFlags); 

Byte *data = (Byte*)inputBuffer->data; 

for(vImagePixelCount i = 0; i < inputBuffer->width + inputBuffer->height; i+=4) { 
    Byte B = (Byte)data[i]; 
    Byte G = (Byte)data[i + 1]; 
    Byte R = (Byte)data[i + 2]; 
    Byte A = (Byte)data[i + 3]; 
    NSLog(@"1: (%d) %d, %d, %d, %d", i, R,G,B,A); 
    ((Byte*)outputBuffer->data)[i] = R; 
    ((Byte*)outputBuffer->data)[i + 1] = G; 
    ((Byte*)outputBuffer->data)[i + 2] = B; 
    ((Byte*)outputBuffer->data)[i + 3] = A; 
} 

CGImageRef effectCGImage = vImageCreateCGImageFromBuffer(outputBuffer, &format, &cleanupBuffer, NULL, kvImageNoFlags, &e); 

// draw effect image 
CGContextSaveGState(outputContext); 
CGContextDrawImage(outputContext, outputImageRectInPoints, effectCGImage); 
CGContextRestoreGState(outputContext); 

// Cleanup 
CGImageRelease(effectCGImage); 

// Output image is ready. 
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return outputImage; 

那么,上面的代码有什么问题?

P.S .:我知道,对于反转通道,我可以使用一些vImage_函数,但这不是我想要达到的目的。我想要实现的是通过逐个更改每个像素来改变图像。最终我的意图是创建一个DisplacementMapFilter(根据提供的地图转换图像像素)。

回答

2

找出问题所在。在这种情况下,特别的问题是这样的:

为(vImagePixelCount I = 0;我<(inputBuffer->宽度* inputBuffer->高度* 4); I + = 4)

我只是通过一个循环的缓冲区的一小部分。现在我正在循环整个缓冲区。