15

10.5で機能するこれを行う簡単な方法はありますか?

10.6では、nsImage CGImageForProposedRectを使用できます:NULLコンテキスト:NULLヒント:NULL

1bの白黒画像(グループ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にメッセージを送信することで、画像にCGImageを作成するように依頼できます。CGImageForProposedRect: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

As of 2021, CALayers contents can directly be feed with NSImage but you still may get an
[Utility] unsupported surface format: LA08 warning. After a couple of days research and testing around i found out that this Warning is triggered if you created an NSView with backingLayer, aka CALayer and just used an NSImage to feed its contents. This alone is not much of a problem. But if you try to render it via [self.layer renderInContext:ctx], each rendering will trigger the warning again.

To make use simple, i created an NSImage extension to fix this..

@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

see how it does not return an CGImageRef directly but a bridged cast to id..! This does the trick.

Now you can use it like..

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

PS: posted her because if you got that problem also, google will lead you to this Thread of answers anyway, and all above answers inspired me for this fix.

于 2021-06-19T08:16:40.700 に答える