如何将JPG文件加载到NSBitmapImageRep中?

问题描述:

目标C /可可: 我需要从JPG文件加载图像划分成二维阵列,这样我可以访问每一个象素。我试图(不成功)将图像加载到NSBitmapImageRep。我已尝试若干变化上的代码的以下两行:如何将JPG文件加载到NSBitmapImageRep中?

NSString *filePath = [NSString stringWithFormat: @"%@%@",@"/Users/adam/Documents/phoneimages/", [outLabel stringValue]]; //this coming from a window control 
NSImageRep *controlBitmap = [[NSImageRep alloc] imageRepWithContentsOfFile:filePath]; 

随着显示的代码,得到了一个运行时错误: - [NSImageRep imageRepWithContentsOfFile:]:无法识别的选择发送到实例0x100147070。

我试图与更换的第二行代码:

NSImage *controlImage = [[NSImage alloc] initWithContentsOfFile:filePath]; 
NSBitmapImageRep *controlBitmap = [[NSBitmapImageRep alloc] initWithData:controlImage]; 

但是,这产生一个编译器错误“不兼容的类型”说initWithData想要一个NSData的变量不是一个NSImage中。

我也尝试过各种其他的方式来完成这件事,但都是不成功或者是由于编译器或运行时错误。有人可以帮我弄这个吗?我最终需要以相同的方式加载一些PNG文件(所以对于这两种文件都有一致的技术是很好的)。

如果您知道更简单/更简单的方法来完成我想要做的事情(即将图像转换为二维数组),而不是使用NSBitmapImageRep,那么请让我知道!顺便说一句,我知道路径是有效的(通过fileExistsAtPath确认) - outLabel中的文件名是带有.jpg扩展名的文件。

感谢您的帮助!

简单!

NSImage *controlImage = [[NSImage alloc] initWithContentsOfFile:filePath]; 
NSBitmapImageRep *imageRep = [[controlImage representations] objectAtIndex:0]; 

然后得到实际的位图像素数据:

unsigned char *pixelData = [imageRep bitmapData]; 

如果你的形象有多种表示法(它可能没有),你可以让他们的是同一个数组的。相同的代码将适用于您的.png图像。

+0

非常感谢!这确实将数据存入数组中供我使用。 – Adam 2010-06-03 02:06:38

编辑:

卡尔有一个更好的答案。如果你还想以某种方式操纵图像,比如缩放或改变颜色模式,这样做只会是好事。

原创:

我可能会为此使用核心图形。 NSImage和大多数NSImageRep没有被设计为有一个像素数组。它们只在绘制时才将源图像数据转换为像素。

当你创建一个CGBitmapContext,你可以通过它的像素使用的缓冲区。这是您的二维数组,包括您指定的任何行字节,颜色深度,像素格式和其他属性。

您可以使用CGImageCreateWithJPEGDataProvider或CGImageCreateWithPNGDataProvider分别使用JPG或PNG数据初始化CGImage。

一旦绘制图像与CGContextDrawImage情况下你传递给CGBitmapContextCreate原始缓冲区现在充满了图像的像素数据。

  1. 用图像数据创建一个CGDataProvider。
  2. 创建数据提供一个CGImageRef。
  3. 为图像像素创建足够大的缓冲区。
  4. 创建CGBitmapContext即与像素缓冲器中的图像的大小。
  5. 将图像绘制到位图上下文中。
  6. 访问缓冲区中的像素。

如果要使用NSImage而不是CGImage,可以使用graphicsContextWithGraphicsPort从CGContext创建NSGraphicsContext:flipped:并将其设置为当前上下文。基本上用你想用来制作NSImage的任何代码替换上面的步骤1和2。

imageRepWithContentsOfFile是静态函数

使用它的正确方法:

[NSBitmapImageRep imageRepWithContentsOfFile:filePath];