我一直在尝试各种方法和技巧来使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://dev59.com/6msz5IYBdhLWcg3wmo9a#7788510
- http://www.raywenderlich.com/5689/beginning-core-image-in-ios-5
- [CIImage imageWithData:UIImagePNGRepresentation(img)];
- 几乎所有其他CIImage构造函数...
这是因为iOS中CIImage的像素格式是ARGB吗?(似乎这是目前iOS6上唯一可能的格式)
如果是这样,如何交换像素格式以使此CIImage看起来正常?
我在git上创建了一个项目存储库,显示了我尝试的所有主要不同方法(不包括每种变体)。有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的本地实现可能存在bug。也就是说,从UIImage创建CIImage不起作用... 我能想到的唯一一件事就是CIImage在ARGB空间中,而UIImage不在...但是,我不知道如何解决这个问题?
这是一个bug吗?