2012-01-05 45 views
2

在iOS中我正在使用的应用程序中,我需要从用户那里获取图片,然后将其转换为我们都喜欢的块状,像素化8位样式。我假设我使用了一些Quartz/CoreImage(我有我的Mac和iOS dev混合了methinks)过滤器来激活它?我从来没有使用任何这些,所以任何帮助将不胜感激。iOS中的8位图像

回答

1

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

8位表示要么:

  • 使用色谱表/彩色地图
  • 或RRRGGGBB格式

前者更复杂。如果这对您而言是新的,那么首先将像素值转换为近似RRRGGGBB。假设你知道如何通过CoreGraphics(大量的例子存在)来转移位图并创建一个位图,那么你就全都设置好了!

+0

使用Core Image实际上比这样做要快得多,因为它利用了GPU。如果您使用核心映像,您也不需要编写任何图像处理代码,这总是不错的... – 2012-01-05 09:03:48

+0

但是,您无法支持iOS 4(或3)。 – jrtc27 2012-01-05 09:12:58

+0

@Rob 1)关于GPU的好处,但在所有情况下肯定不会更快。 2)CI不保证在什么地方会发生什么,并且出于什么原因--CG(作为基于类似概念的示例)确实在GPU上做了很多工作。 3)你的例子是一个近似的效果 - 但它看起来不错。 4)CI在iOS 5之前不可用。奖金)图像处理代码很有趣! ...对于我们中的一些人;)所以我决定在我回答时另一个答案是好的。 – justin 2012-01-05 09:38:22

4

您可以使用Core Image,特别是CIColorPosterizeCIPixellate过滤器。核心图像具有利用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仅适用于iOS 5.

+0

我试图使用这段代码,但我无法让它正常工作。我稍微修改它以使用NSClassFromString,因为我的应用程序必须支持iOS 4.3。我以这种方式使用它:http://pastebin.com/5hwb0xcr我的图像视图保持空白,但如果我尝试将我输入的CIImage转换回UIImage,我的图像视图显示原始图像。有任何想法吗? – 2012-01-07 05:33:32

+1

Argh。我刚刚在iOS上尝试过这两种过滤器,并返回'nil'。在检查了iOS文档后,我发现iOS上没有'CIColorPosterize'和'CIPixellate',它们似乎只是Mac。我很抱歉带领你走下这条花园的道路,我忘记了iOS只有核心图像过滤器的一个子集。 – 2012-01-07 11:41:00

+0

该死,我想我需要推出我自己的图像处理代码。不过谢谢你的回答。 – 2012-01-07 19:27:41