5

我一直在尝试大量不同的选项和技巧来让 UIImage 从 CIImage 正确构建。但是,每次我创建 CIImage 时,它​​的颜色似乎都被反转了。

我最近的代码是:

NSURL *url = [[NSBundle mainBundle] URLForResource:@"C4Sky" withExtension:@"png"];
CIImage *c = [CIImage imageWithContentsOfURL:url];
UIImage *i = [UIImage imageWithCIImage:c];
UIImageView *uiiv = [[UIImageView alloc] initWithImage:i];
[self.canvas addSubview:uiiv];

这会产生以下图像:

反转的彩色图像。

但是,构建这样的图像:

UIImage *i = [UIImage imageNamed:@"C4Sky"];
UIImageView *uiiv = [[UIImageView alloc] initWithImage:i];
[self.canvas addSubview:uiiv];

...产生以下图像:

在此处输入图像描述

我尝试了很多不同的方法来构建 CIImage。

这是因为在 iOS 中 CIImage 的像素格式是 ARGB 吗?(这似乎是目前 iOS6 上唯一可能的格式)

如果是这样,我怎样才能交换像素格式让这个 CIImage 看起来正常?



我在 git 上创建了一个项目 repo,显示了我尝试过的所有主要不同方式(不包括每种方式的变体)。有6种方法,前5种失败:

https://github.com/C4Code/CIImageTest

最后一种方法有效,但它真的很脏:

-(void)test6 {
    UIImage *img = [UIImage imageNamed:@"C4Sky"];

    CGContextRef    bitmapContext = NULL;
    void *          bitmapData;
    int             bitmapByteCount;
    int             bitmapBytesPerRow;
    CGSize          size = img.size;
    bitmapBytesPerRow   = (size.width * 4);
    bitmapByteCount     = (bitmapBytesPerRow * size.height);
    bitmapData = malloc( bitmapByteCount );
    bitmapContext = CGBitmapContextCreate(bitmapData, size.width, size.height,8,bitmapBytesPerRow,
                                          CGColorSpaceCreateDeviceRGB(),kCGImageAlphaPremultipliedFirst);
    CGContextDrawImage(bitmapContext, (CGRect){CGPointZero,size}, img.CGImage);
    CGImageRef imgRef = CGBitmapContextCreateImage(bitmapContext);

    CIImage *cii = [CIImage imageWithCGImage:imgRef];
    UIImage *finalImage = [UIImage imageWithCIImage:cii];

    UIImageView *uiiv = [[UIImageView alloc] initWithImage:finalImage];
    [self.canvas addSubview:uiiv];
    //works but it's dirrrrrrrty
}

我正在从 UIImage 绘制到我自己的图形上下文中,并且因为它有效,所以我相信 CIImage 的本机实现可能存在错误。也就是说,从 UIImage 创建 CIImage 不起作用...同样,我唯一能想到的是 CIImage 在 ARGB 空间中,而 UIImage 不是...但是,我不知道如何解决这个问题?

这是一个错误吗?

4

3 回答 3

6

尝试一些其他变体:

//Grab the CIImage directly from the UIImage
UIImage *img = [UIImage imageNamed:@"C4Sky.png"];
CIImage *c = img.CIImage;
UIImage *i = [UIImage imageWithCIImage:c];
UIImageView *uiiv = [[UIImageView alloc] initWithImage:i];
[self.canvas addSubview:uiiv];

或者

//Maybe you need to set your own color space?
UIImage *img = [UIImage imageNamed:@"C4Sky.png"];
CIImage *c = [CIImage imageWithCGImage:img.CGImage options:@{kCIImageColorSpace: kCGColorSpaceModelRGB}];
UIImage *i = [UIImage imageWithCIImage:c];
UIImageView *uiiv = [[UIImageView alloc] initWithImage:i];
[self.canvas addSubview:uiiv];

-jt

于 2013-01-31T09:35:31.970 回答
2

这以前也咬过我。我用这样的东西UIImageCIImages 转换 s:

- (UIImage *)newUIImageFromCIImage:(CIImage *)image
{
    CGImageRef newImageRef = [[CIContext contextWithOptions:nil] createCGImage:image fromRect:[image extent]]; // you can cache CIContext as it's a little slow to create
    UIImage *newImage = [[UIImage alloc] initWithCGImage:newImageRef];
    CGImageRelease(newImageRef);

    return newImage;
}

这里有一些讨论。

于 2013-02-07T06:01:12.157 回答
1

看看这个教程。您必须在看起来正常之前应用过滤器。希望这可以帮助!

雷切尔:)

例如(以防万一链接中断)

CIImage *beginImage = [CIImage imageWithContentsOfURL:fileNameAndPath];

CIContext *context = [CIContext contextWithOptions:nil];

CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"
                          keysAndValues: kCIInputImageKey, beginImage,
                @"inputIntensity", @0.8, nil];
CIImage *outputImage = [filter outputImage];


CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];


UIImage *newImage = [UIImage imageWithCGImage:cgimg]; 
self.imageView.image = newImage;


CGImageRelease(cgimg);
于 2013-01-31T05:36:03.973 回答