首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将JPG文件加载到NSBitmapImageRep中?

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

Stack Overflow用户
提问于 2010-06-02 11:22:32
回答 3查看 3.4K关注 0票数 3

Objective-C / Cocoa:我需要将图像从JPG文件加载到一个二维数组中,这样我就可以访问每个像素。我正在尝试(未成功)将图像加载到NSBitmapImageRep中。我已经尝试了以下两行代码的几个变体:

代码语言:javascript
复制
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。

我尝试将第二行代码替换为:

代码语言:javascript
复制
NSImage *controlImage = [[NSImage alloc] initWithContentsOfFile:filePath];
NSBitmapImageRep *controlBitmap = [[NSBitmapImageRep alloc] initWithData:controlImage];

但这会产生编译器错误“类型不兼容”,说明initWithData需要的是NSData变量,而不是NSImage。

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

如果您知道比使用NSBitmapImageRep更容易/更简单的方法来完成我要做的事情(例如,将图像放入一个二维数组中),那么请让我知道!顺便说一句,我知道路径是有效的(用fileExistsAtPath确认) -- outLabel中的文件名是一个扩展名为.jpg的文件。

谢谢你的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-02 11:51:22

简单!

代码语言:javascript
复制
NSImage *controlImage = [[NSImage alloc] initWithContentsOfFile:filePath];
NSBitmapImageRep *imageRep = [[controlImage representations] objectAtIndex:0];

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

代码语言:javascript
复制
unsigned char *pixelData = [imageRep bitmapData];

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

票数 7
EN

Stack Overflow用户

发布于 2010-06-02 11:48:01

编辑:

卡尔有一个更好的答案。只有当您还想以某种方式操作图像时,如缩放或更改颜色模式,这才是好的。

原件:

我可能会使用核心图形来完成这个任务。NSImage和大多数NSImageRep的设计都不是为了让像素阵列闲置。它们仅在绘制时才将源图像数据转换为像素。

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

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

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

  1. 使用图像数据创建CGDataProvider。
  2. 使用足以容纳图像像素的缓冲区创建CGImageRef。
  3. 使用像素缓冲区创建与图像大小相同的CGBitmapContext。
  4. 将图像绘制到位图中。

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

票数 1
EN

Stack Overflow用户

发布于 2015-11-07 08:46:26

imageRepWithContentsOfFile是一个静态函数

正确的使用方法:

代码语言:javascript
复制
[NSBitmapImageRep imageRepWithContentsOfFile:filePath];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2954786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档