Objective c 将NSImage*转换为CGImageRef?

Objective c 将NSImage*转换为CGImageRef?,objective-c,cocoa,core-graphics,nsimage,cgimage,Objective C,Cocoa,Core Graphics,Nsimage,Cgimage,在10.5中有没有一种简单的方法可以做到这一点 在10.6中,我可以使用nsImage CGImageForProposedRect:NULL上下文:NULL提示:NULL 如果我不使用1b黑白图像(如第4组TIFF),我可以使用位图,但cgbitmaps似乎不喜欢这种设置。。。有没有一种通用的方法 我需要这样做,因为我有一个IKImageView,它似乎只想添加CGImages,但我所拥有的只是NSImages。目前,我正在使用一个私有的setImage:(NSImage*)方法,我真的不想使

在10.5中有没有一种简单的方法可以做到这一点

在10.6中,我可以使用nsImage CGImageForProposedRect:NULL上下文:NULL提示:NULL

如果我不使用1b黑白图像(如第4组TIFF),我可以使用位图,但cgbitmaps似乎不喜欢这种设置。。。有没有一种通用的方法


我需要这样做,因为我有一个IKImageView,它似乎只想添加CGImages,但我所拥有的只是NSImages。目前,我正在使用一个私有的setImage:(NSImage*)方法,我真的不想使用这个方法

在上找到以下解决方案:


所有的方法似乎都是10.4+版本,所以你应该没问题。

[这还有很长的路要走。只有当你仍然支持旧版本的OS X时,你才应该这样做。如果你可以要求10.6或更高版本,那么就改为这样做。]

  • 释放位图上下文

  • 对于Snow Leopard,您只需向NSImage发送一条
    cImageForProposedRect:context:Timps:
    消息即可。

    以下是使用
    -cImageForProposedRect:context:Timps:
    的更详细答案:

    NSImage *image = [NSImage imageNamed:@"image.jpg"];
    
    NSRect imageRect = NSMakeRect(0, 0, image.size.width, image.size.height);
    
    CGImageRef cgImage = [image CGImageForProposedRect:&imageRect context:NULL hints:nil];
    

    只是使用了
    CGImageForProposedRect:context:hints:

    NSImage *image; // an image
    NSGraphicsContext *context = [NSGraphicsContext currentContext];
    CGRect imageCGRect = CGRectMake(0, 0, image.size.width, image.size.height);
    NSRect imageRect = NSRectFromCGRect(imageCGRect);
    CGImageRef imageRef = [image CGImageForProposedRect:&imageRect context:context hints:nil];
    

    是的,但是不要打几百次电话。根据
    NSImage
    ,它最终可能会在内存中创建图像数据的完整未压缩副本。有趣。我会尝试一下,让你知道。这对性能和可预测性都不如Peter的解决方案好。如果图像有多个表示形式(例如16x16版本和128x128版本),您是通过哪种方式获得的?未定义。我尝试过这种方法,但它似乎无法处理1位黑白图像(Mac由于某些原因确实不喜欢处理CCITT TIFF…),或者分辨率降低。。。因为我有一张NSImage,我不确定我是否真的能找到分辨率来找出如何制作更好的图形上下文…查看图像的
    表示形式
    数组。其中一个应该是位图图像代表。你可以询问该对象的像素大小(相对于点),以及其他与光栅相关的事实。彼得,你是我在这里钦佩和信任的成员。感谢您分享的所有知识和经验,以及您所展示的完整性。@MikeyWard:不客气,谢谢您的好话。您能将此内容转换为代码而不是链接吗?谢谢。你知道我在哪里可以得到一个如何使用CGImageForProposedRect:NULL上下文:NULL提示:NULL的例子吗。我为第一个参数提供了一个NSRect,但我发现它的类型不匹配。我不知道我从未尝试过使用NULL以外的任何东西。。。可能是CGRect而不是NSRect?您不需要如本例所示的图形上下文。这是一个可选的参数。
    
    NSImage *image; // an image
    NSGraphicsContext *context = [NSGraphicsContext currentContext];
    CGRect imageCGRect = CGRectMake(0, 0, image.size.width, image.size.height);
    NSRect imageRect = NSRectFromCGRect(imageCGRect);
    CGImageRef imageRef = [image CGImageForProposedRect:&imageRect context:context hints:nil];