首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vImage_Buffer没有呈现成CGContext,为什么?

vImage_Buffer没有呈现成CGContext,为什么?
EN

Stack Overflow用户
提问于 2015-05-28 15:49:11
回答 1查看 409关注 0票数 0

下面的代码试图获取一个图像,将其组件提取到一个vImage_Buffer中,然后循环遍历这个缓冲区,抓取每个组件,并通过填充一个outputBuffer反转红色和蓝色通道。在此之后,我希望获取结果outputBuffer并从其中创建一个UIImage。

尽管下面的代码编译和运行良好,但outputImage是空的,我没有收到任何错误。

代码语言:javascript
复制
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 (根据提供的地图转换图像像素)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-28 16:11:47

解决了问题。本案的具体问题是:

用于(vImagePixelCount i= 0;i<(输入缓存器->宽度*输入缓冲区->高度* 4);i+=4)

我只是在穿过一小部分缓冲区。现在我正在遍历整个缓冲区。

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

https://stackoverflow.com/questions/30511392

复制
相关文章

相似问题

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