3

インメモリ イメージを作成し、その上に描画してディスクに保存しようとしています。

現在のコードは次のとおりです。

NSBitmapImageRep *rep = [[NSBitmapImageRep alloc]
                         initWithBitmapDataPlanes:NULL
                         pixelsWide:256
                         pixelsHigh:256
                         bitsPerSample:8
                         samplesPerPixel:4
                         hasAlpha:YES
                         isPlanar:YES
                         colorSpaceName:NSDeviceRGBColorSpace
                         bitmapFormat:NSAlphaFirstBitmapFormat
                         bytesPerRow:0
                         bitsPerPixel:8
                         ];


[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithBitmapImageRep:rep]];

// Draw your content...
NSRect aRect=NSMakeRect(10.0,10.0,30.0,30.0);
NSBezierPath *thePath=[NSBezierPath bezierPathWithRect:aRect];
[[NSColor redColor] set];
[thePath fill];

[NSGraphicsContext restoreGraphicsState];


NSData *data = [rep representationUsingType: NSPNGFileType properties: nil];
[data writeToFile: @"test.png" atomically: NO];

現在のコンテキストで描画しようとすると、エラーが発生します

CGContextSetFillColorWithColor: invalid context 0x0

ここで何が問題なのですか?NSBitmapImageRep によって返されるコンテキストが NULL になるのはなぜですか? 描画した画像を作成して保存する最良の方法は何ですか?

アップデート:

最終的に次の解決策に達しました:

NSImage *image = [[NSImage alloc] initWithSize:NSMakeSize(256, 256)];
[image lockFocus];

NSRect aRect=NSMakeRect(10.0,10.0,30.0,30.0);
NSBezierPath *thePath=[NSBezierPath bezierPathWithRect:aRect];
[[NSColor redColor] set];
[thePath fill];

[image unlockFocus];

NSData *data = [image TIFFRepresentation];
[data writeToFile: @"test.png" atomically: NO];
4

1 に答える 1

5

あなたの回避策は当面のタスクには有効ですが、実際にNSBitmapImageRepを機能させるよりも高価な操作です! 少しの議論については、http://cocoadev.com/wiki/NSBitmapImageRepを参照してください。

[ NSGraphicsContext graphicsContextWithBitmapImageRep :] ドキュメントに次のように記載されていることに注意してください。

「このメソッドは、単一平面の NSBitmapImageRep インスタンスのみを受け入れます。」

NSBitmapImageRepを isPlanar:YES で設定しているため、複数のプレーンを使用しています... NO に設定してください。

言い換えると:

NSBitmapImageRep *rep = [[NSBitmapImageRep alloc]
                     initWithBitmapDataPlanes:NULL
                     pixelsWide:256
                     pixelsHigh:256
                     bitsPerSample:8
                     samplesPerPixel:4
                     hasAlpha:YES
                     isPlanar:NO
                     colorSpaceName:NSDeviceRGBColorSpace
                     bitmapFormat:NSAlphaFirstBitmapFormat
                     bytesPerRow:0
                     bitsPerPixel:0
                     ];
// etc...
于 2012-11-29T00:47:00.860 に答える