有一种简单的方法可以在10.5中运行吗?
在10.6中我可以使用nsImage CGImageForProposedRect:NULL context:NULL提示:NULL
如果我不使用1b黑白图像(如Group 4 TIFF),我可以使用位图,但cgbitmaps似乎不喜欢这种设置......有没有一般的方法来做到这一点?
我需要这样做因为我有一个看似只想添加CGImages的IKImageView,但我所拥有的只是NSImages。目前,我正在使用一个私有的setImage:(NSImage *)方法,我真的很想不使用...
答案 0 :(得分:28)
在this page上找到以下解决方案:
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+,所以你应该没问题。
答案 1 :(得分:17)
[这是很长的路要走。如果您仍然支持旧版本的OS X,则应该只执行此操作。如果您需要10.6或更高版本,请改为使用just use the CGImage
method。]
答案 2 :(得分:16)
从Snow Leopard开始,你只需ask the image to create a CGImage for you,就可以向NSImage发送一条CGImageForProposedRect:context:hints:
消息。
答案 3 :(得分:14)
以下是使用- 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];
答案 4 :(得分: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];
答案 5 :(得分:0)
从 2021 年开始,CALayers
contents 可以直接与 NSImage
一起提供,但您仍然可能会收到 [Utility] unsupported surface format: LA08
警告。
经过几天的研究和测试,我发现如果您创建了一个带有 backingLayer(又名 CALayer)的 NSView 并且只是使用 NSImage
来提供它的 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:发布她是因为如果你也遇到这个问题,谷歌无论如何都会把你带到这个答案线程,上面的所有答案都启发了我进行这个修复。