objective-c - Mac OS X : Drawing into an offscreen NSGraphicsContext using CGContextRef C functions has no effect. 为什么?

标签 objective-c macos cocoa core-graphics quartz-2d

Mac OS X 10.7.4

我正在绘制到通过 +[NSGraphicsContext graphicsContextWithBitmapImageRep:] 创建的屏幕外图形上下文中。

当我使用 NSBezierPath 绘制到此图形上下文中时,一切都按预期工作。

但是,当我使用 CGContextRef C 函数 绘制到此图形上下文中时,我看不到任何绘制结果。什么都没用。

由于我不会深入的原因,我确实需要使用 CGContextRef 函数(而不是 Cocoa NSBezierPath 类)进行绘制。

下面列出了我的代码示例。我正在尝试绘制一个简单的“X”。一笔使用NSBezierPath,一笔使用CGContextRef C函数。第一笔有效,第二笔无效。我做错了什么?

NSRect imgRect = NSMakeRect(0.0, 0.0, 100.0, 100.0);
NSSize imgSize = imgRect.size;

NSBitmapImageRep *offscreenRep = [[[NSBitmapImageRep alloc]
   initWithBitmapDataPlanes:NULL
   pixelsWide:imgSize.width
   pixelsHigh:imgSize.height
   bitsPerSample:8
   samplesPerPixel:4
   hasAlpha:YES
   isPlanar:NO
   colorSpaceName:NSDeviceRGBColorSpace
   bitmapFormat:NSAlphaFirstBitmapFormat
   bytesPerRow:0
   bitsPerPixel:0] autorelease];

// set offscreen context
NSGraphicsContext *g = [NSGraphicsContext graphicsContextWithBitmapImageRep:offscreenRep];
[NSGraphicsContext setCurrentContext:g];

NSImage *img = [[[NSImage alloc] initWithSize:imgSize] autorelease];

CGContextRef ctx = [g graphicsPort];

// lock and draw
[img lockFocus];

// draw first stroke with Cocoa. this works!
NSPoint p1 = NSMakePoint(NSMaxX(imgRect), NSMinY(imgRect));
NSPoint p2 = NSMakePoint(NSMinX(imgRect), NSMaxY(imgRect));
[NSBezierPath strokeLineFromPoint:p1 toPoint:p2];

// draw second stroke with Core Graphics. This doesn't work!
CGContextBeginPath(ctx);
CGContextMoveToPoint(ctx, 0.0, 0.0);
CGContextAddLineToPoint(ctx, imgSize.width, imgSize.height);
CGContextClosePath(ctx);
CGContextStrokePath(ctx);

[img unlockFocus];

最佳答案

您没有指定如何查看结果。我假设您正在查看 NSImage img 而不是 NSBitmapImageRep offscreenRep

当您调用 [img lockFocus] 时,您正在将当前 NSGraphicsContext 更改为绘制到 img 中的上下文。因此,NSBezierPath 绘图进入 img,这就是您所看到的。 CG 绘图进入您没有看到的 offscreenRep

与其将焦点锁定在 NSImage 上并在其中绘图,不如创建一个 NSImage 并将 offscreenRep 添加为其代表之一。

NSRect imgRect = NSMakeRect(0.0, 0.0, 100.0, 100.0);
NSSize imgSize = imgRect.size;

NSBitmapImageRep *offscreenRep = [[[NSBitmapImageRep alloc]
   initWithBitmapDataPlanes:NULL
   pixelsWide:imgSize.width
   pixelsHigh:imgSize.height
   bitsPerSample:8
   samplesPerPixel:4
   hasAlpha:YES
   isPlanar:NO
   colorSpaceName:NSDeviceRGBColorSpace
   bitmapFormat:NSAlphaFirstBitmapFormat
   bytesPerRow:0
   bitsPerPixel:0] autorelease];

// set offscreen context
NSGraphicsContext *g = [NSGraphicsContext graphicsContextWithBitmapImageRep:offscreenRep];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext:g];

// draw first stroke with Cocoa
NSPoint p1 = NSMakePoint(NSMaxX(imgRect), NSMinY(imgRect));
NSPoint p2 = NSMakePoint(NSMinX(imgRect), NSMaxY(imgRect));
[NSBezierPath strokeLineFromPoint:p1 toPoint:p2];

// draw second stroke with Core Graphics
CGContextRef ctx = [g graphicsPort];    
CGContextBeginPath(ctx);
CGContextMoveToPoint(ctx, 0.0, 0.0);
CGContextAddLineToPoint(ctx, imgSize.width, imgSize.height);
CGContextClosePath(ctx);
CGContextStrokePath(ctx);

// done drawing, so set the current context back to what it was
[NSGraphicsContext restoreGraphicsState];

// create an NSImage and add the rep to it    
NSImage *img = [[[NSImage alloc] initWithSize:imgSize] autorelease];
[img addRepresentation:offscreenRep];

// then go on to save or view the NSImage

关于objective-c - Mac OS X : Drawing into an offscreen NSGraphicsContext using CGContextRef C functions has no effect. 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10627557/

相关文章:

ios - 与 NSUserDefaults 混淆

ios - BFTask 在嵌套查询完成时返回

objective-c - 如何在 Mac App Store 上的 os x 应用程序中捆绑命令行实用程序(使用沙盒授权)

java - macOS Mojave (10.14) 到 Lion (10.7) 上的 JAVA_HOME 在哪里?

objective-c - 在编译旧版本时使用 App Store 中较新的 OS X SDK

objective-c - 将临时对象添加到 NSMutableArray

objective-c - 如何检查字符串是否与 objective-c 中的正则表达式匹配?

macos - 提交时如何在 vim 中获得 git diff 着色?

iphone - 同时发送 NSURLConnection 请求

javascript - Cocoa:WKWebView/WebView 无法打开 Gmail 或 Inbox 内的链接