我一直在尝试大量不同的选项和技巧来让 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。
- https://stackoverflow.com/a/7788510/1218605
- http://www.raywenderlich.com/5689/beginning-core-image-in-ios-5
- [CIImage imageWithData:UIImagePNGRepresentation(img)];
- 几乎所有其他 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 不是...但是,我不知道如何解决这个问题?
这是一个错误吗?