iOS中的8位图像

iOS中的8位图像,ios,cocoa,image-processing,Ios,Cocoa,Image Processing,在我用iOS开发的应用程序中,我需要从用户那里获取一张图片,然后将其转换为我们都喜欢的块状、像素化的8位样式。我假设我使用了一些Quartz/CoreImage(我的Mac和iOS开发人员混合了methinks)过滤器来激活它?我从未使用过任何一种,因此希望您能提供任何帮助。您可以使用Core Image,特别是CIColorPosterize和Cipixellae过滤器。Core Image的优点是它利用了GPU,并且比手动操作位图快得多 一个简单的例子如下: NSURL* imageURL

在我用iOS开发的应用程序中,我需要从用户那里获取一张图片,然后将其转换为我们都喜欢的块状、像素化的8位样式。我假设我使用了一些Quartz/CoreImage(我的Mac和iOS开发人员混合了methinks)过滤器来激活它?我从未使用过任何一种,因此希望您能提供任何帮助。

您可以使用Core Image,特别是
CIColorPosterize
Cipixellae
过滤器。Core Image的优点是它利用了GPU,并且比手动操作位图快得多

一个简单的例子如下:

NSURL* imageURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForImageResource:@"yourSourceImage"]];
CIImage* inputImage = [[CIImage alloc] initWithContentsOfURL:imageURL];

CIFilter* posterize = [CIFilter filterWithName:@"CIColorPosterize"];
[posterize setDefaults];
[posterize setValue:[NSNumber numberWithDouble:8.0] forKey:@"inputLevels"];
[posterize setValue:inputImage forKey:@"inputImage"];

CIFilter* pixellate = [CIFilter filterWithName:@"CIPixellate"];
[pixellate setDefaults];
[pixellate setValue:[NSNumber numberWithDouble:4.0] forKey:@"inputScale"];
[pixellate setValue:[posterize valueForKey:@"outputImage"] forKey:@"inputImage"];

CIImage* outputImage = [pixellate valueForKey:@"outputImage"];
[inputImage release];

//do something with outputImage
您应该在
/Developer/Applications/Graphics Tools
中找到“Core Image Fun House”应用程序,以获取过滤器的值,从而获得您想要的结果


您应该记住,核心映像仅在iOS 5中可用。

这个过程非常简单,您可以自己编写。可以使用CoreGraphics使用CGImage和CGBitmapContext渲染为位图。然后直接操作像素值

8位表示将:

  • 使用簇/颜色贴图
  • 或RRRGGGBB格式

前者更为复杂。如果这对您来说是新的,那么首先将像素值转换为近似的RRRGGGBB。假设您知道如何通过CoreGraphics进行位移位和创建位图(存在大量示例),那么一切就绪

使用核心映像实际上比这样做要快得多,因为它利用了GPU。如果您使用Core image,您也不需要编写任何图像处理代码,这总是很好的…但您不能支持iOS 4(或3)。@Rob 1)GPU的优点很好,但在所有情况下肯定不会更快。2) CI不能保证在什么地方会发生什么,出于什么原因——CG(作为一个基于类似概念的示例)当然会在GPU之外做很多工作。3) 您的示例是效果的近似值,但看起来确实不错。4) 在iOS 5之前,CI不可用。奖励)图像处理代码很有趣…对我们中的一些人来说;)所以当我回答时,我决定另一个答案是可以的。我试图使用这个代码,但我就是无法让它工作。我稍微修改了一下,使用了NSClassFromString,因为我的应用程序必须支持iOS 4.3。我这样使用它:我的图像视图保持空白,但如果我尝试将输入的CIImage转换回UIImage,我的图像视图将显示原始图像。有什么想法吗?啊。我刚刚在iOS上试过这个,两个过滤器都返回
nil
。检查iOS文档后,我发现iOS上既没有
CIColorPosterize
也没有
cipixellae
可用,它们似乎只是Mac。很抱歉在这件事上把你引向歧途,我忘了iOS只有核心图像过滤器的一个子集。该死,我想我需要自己编写图像处理代码。不过,谢谢你的回答。