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::unrecognized选择器发送到实例0x100147070。
我尝试将第二行代码替换为:
NSImage *controlImage = [[NSImage alloc] initWithContentsOfFile:filePath];
NSBitmapImageRep *controlBitmap = [[NSBitmapImageRep alloc] initWithData:controlImage];但这会产生编译器错误“类型不兼容”,说明initWithData需要的是NSData变量,而不是NSImage。
我还尝试了其他各种方法来完成这项工作,但由于编译器或运行时错误,所有方法都不成功。有人能帮我一下吗?我最终将需要以相同的方式加载一些PNG文件(所以对于这两种文件都有一个一致的技术将是很好的)。
如果您知道比使用NSBitmapImageRep更容易/更简单的方法来完成我要做的事情(例如,将图像放入一个二维数组中),那么请让我知道!顺便说一句,我知道路径是有效的(用fileExistsAtPath确认) -- outLabel中的文件名是一个扩展名为.jpg的文件。
谢谢你的帮助!
发布于 2010-06-02 11:51:22
简单!
NSImage *controlImage = [[NSImage alloc] initWithContentsOfFile:filePath];
NSBitmapImageRep *imageRep = [[controlImage representations] objectAtIndex:0];然后获取实际的位图像素数据:
unsigned char *pixelData = [imageRep bitmapData];如果您的图像有多个表示(可能没有),您可以从同一数组中获取它们。同样的代码也适用于您的.png镜像。
发布于 2010-06-02 11:48:01
编辑:
卡尔有一个更好的答案。只有当您还想以某种方式操作图像时,如缩放或更改颜色模式,这才是好的。
原件:
我可能会使用核心图形来完成这个任务。NSImage和大多数NSImageRep的设计都不是为了让像素阵列闲置。它们仅在绘制时才将源图像数据转换为像素。
创建CGBitmapContext时,可以向其传递要使用的像素缓冲区。这是您的二维数组,具有您指定的任何行字节、颜色深度、像素格式和其他属性。
您可以使用CGImageCreateWithJPEGDataProvider或CGImageCreateWithPNGDataProvider分别使用JPG或PNG数据初始化CGImage。
一旦您使用CGContextDrawImage将图像绘制到上下文中,您传递给CGBitmapContextCreate的原始缓冲区现在就用图像的像素数据填充了。
如果您想使用NSImage而不是CGImage,您可以使用NSGraphicsContext NSGraphicsContext:flipped:从CGContext创建一个翻转,并将其设置为当前上下文。这基本上将上面的步骤1和2替换为您想要用来创建NSImage的任何代码。
发布于 2015-11-07 08:46:26
imageRepWithContentsOfFile是一个静态函数
正确的使用方法:
[NSBitmapImageRep imageRepWithContentsOfFile:filePath];https://stackoverflow.com/questions/2954786
复制相似问题