如何将JPG文件加载到NSBitmapImageRep?

时间:2010-06-02 03:22:32

标签: objective-c cocoa

Objective-C / Cocoa: 我需要将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扩展名的文件。

感谢您的帮助!

3 个答案:

答案 0 :(得分:7)

容易!

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

然后获取实际的位图像素数据:

unsigned char *pixelData = [imageRep bitmapData];

如果您的图像有多个表示(可能没有),您可以将它们从同一个数组中取出。相同的代码适用于.png图像。

答案 1 :(得分:1)

编辑:

卡尔有一个更好的答案。如果您还想以某种方式操作图像,例如缩放或更改颜色模式,则此功能非常有用。

原件:

我可能会使用核心图形。 NSImage和大多数NSImageRep没有设计成围绕像素阵列。它们仅在绘制时将源图像数据转换为像素。

创建CGBitmapContext时,可以向其传递要使用的像素缓冲区。这是您的二维数组,包括您指定的行字节,颜色深度,像素格式和其他属性。

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

使用CGContextDrawImage将图像绘制到上下文中后,传递给CGBitmapContextCreate的原始缓冲区现在将填充图像的像素数据。

  1. 使用图像数据创建CGDataProvider。
  2. 使用数据提供程序创建CGImageRef。
  3. 为图像像素创建足够大的缓冲区。
  4. 使用像素缓冲区创建一个CGBitmapContext,它是图像的大小。
  5. 将图像绘制到位图上下文中。
  6. 访问缓冲区中的像素。
  7. 如果要使用NSImage而不是CGImage,可以使用graphicsContextWithGraphicsPort从CGContext创建NSGraphicsContext:flipped:并将其设置为当前上下文。这基本上用你想用来制作NSImage的代码替换上面的第1步和第2步。

答案 2 :(得分:1)

imageRepWithContentsOfFile是一个静态函数

正确的使用方法:

[NSBitmapImageRep imageRepWithContentsOfFile:filePath];