15

有没有一种简单的方法可以在 10.5 中使用?

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

如果我不使用 1b 黑白图像(如 Group 4 TIFF),我可以使用位图,但 cgbitmaps 似乎不喜欢这种设置......有没有一般的方法来做到这一点?

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

4

6 回答 6

32

在此页面上找到以下解决方案:

NSImage* someImage;
// create the image somehow, load from file, draw into it...
CGImageSourceRef source;

source = CGImageSourceCreateWithData((CFDataRef)[someImage TIFFRepresentation], NULL);
CGImageRef maskRef =  CGImageSourceCreateImageAtIndex(source, 0, NULL);

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

于 2010-03-30T21:25:43.150 回答
18

[这是很长的路要走。仅当您仍支持旧版本的 OS X 时才应执行此操作。如果您需要 10.6 或更高版本,请改用该CGImage方法。]

  1. 创建一个 CGBitmapContext。
  2. 为位图上下文创建一个 NSGraphicsContext。
  3. 将图形上下文设置为当前上下文。
  4. 绘制图像。
  5. 从位图上下文的内容创建 CGImage。
  6. 释放位图上下文。
于 2010-03-30T23:11:19.757 回答
16

从 Snow Leopard 开始,您可以通过向 NSImage 发送消息来要求图像为您创建 CGImageCGImageForProposedRect:context:hints:

于 2012-07-30T19:25:54.363 回答
16

这是使用的更详细的答案- CGImageForProposedRect:context:hints:

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];
于 2015-03-24T15:36:55.460 回答
1

只是使用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];
于 2015-07-25T09:36:34.793 回答
0

自 2021 年起,可以直接馈送CALayers 内容NSImage,但您仍然可能会收到
[Utility] unsupported surface format: LA08警告。经过几天的研究和测试,我发现如果您使用 backingLayer(又名 CALayer)创建了一个 NSView 并仅使用 anNSImage来提供它的contents. 仅此一项问题不大。但是如果你尝试通过 渲染它[self.layer renderInContext:ctx],每次渲染都会再次触发警告。

为了简单起见,我创建了一个 NSImage 扩展来解决这个问题。

@interface NSImage (LA08FIXExtension)
-(id)CGImageRefID;
@end

@implementation NSImage (LA08FIXExtension)

-(id)CGImageRefID {
    NSSize size = [self size];
    NSRect rect = NSMakeRect(0, 0, size.width, size.height);
    CGImageRef ref = [self CGImageForProposedRect:&rect context:[NSGraphicsContext currentContext] hints:NULL];
    return (__bridge id)ref;
}

@end

看看它是如何不直接返回 CGImageRef 而是桥接转换为id..!这可以解决问题。

现在你可以像..

CALayer *somelayer = [CALayer layer];
somelayer.frame = ... 
somelayer.contents = [NSImage imageWithName:@"SomeImage"].CGImageRefID;

PS:发布她是因为如果你也遇到这个问题,谷歌无论如何都会引导你到这个答案线程,以上所有答案都启发了我进行这个修复。

于 2021-06-19T08:16:40.700 回答