这是我遇到的一个奇怪问题的图片:
我正在使用插件架构在 Core Graphics 中绘制东西。宿主应用程序创建一个传递给插件的上下文,插件将其绘制到上下文中并将其发送回。这里多次绘制多个对象(尽管只是为了演示,即使只有一个对象也会发生)。结果被转换CGImageRefs
并放置在画布(另一个CGContext
)上,该画布又被转换为NSImage
并显示。
如您所见,问题在于它经常返回稍微损坏的版本。每次都不一样。另一个奇怪的事情是这些盒子应该有 50% 的 alpha,但它们没有(除了第二个盒子的顶部,看起来它的颜色是正确的)。有趣的是,背景(在宿主应用程序中的 Core Graphics 中绘制)从未损坏过,因此转换或类似的东西不是CGImage
问题NSImage
。
更奇怪的是,我尝试让插件NSImage
直接导出,效果完全相同,甚至可能更糟。在我看来,问题在于在插件中使用 Core Graphics 绘制任何东西。有没有其他人遇到过这个问题,或者更好的是,有没有其他人找到解决方案?
如果有帮助,这是主机代码:
CGContextRef tC = [TC CreateBitmapContextWithWidth:720 Height:480]; //Sets up context
CGContextSetRGBFillColor(tC, 1.0, 1.0, 1.0, 1.0);
CGContextFillRect(tC, CGRectMake(0, 0, size.width, size.height)); //Draws Background
for(CDObject *cdo in [[TC DocStorage] Objects]){ //Draws each object
CGContextRef pluginContext = [TC CreateBitmapContextWithWidth:cdo.width Height:cdo.height]; //Creates context to send to plugin
[[[TC plugins] objectForKey:[cdo Type]] drawObject:cdo inContext:pluginContext]; //Pass context through appropriate plugin (based on type)
CGImageRef gci = CGBitmapContextCreateImage(pluginContext); //Create image of context
CGContextDrawImage(tC, CGRectMake(cdo.x, cdo.y, CGImageGetWidth(gci), CGImageGetHeight(gci)), gci); //Draw image to canvas
CGImageRelease(gci);
char *bitmapData = CGBitmapContextGetData(pluginContext);
CGContextRelease (pluginContext);
if (bitmapData) free(bitmapData);
}
CGImageRef fi = CGBitmapContextCreateImage(tC); //Get image of canvas
NSImage *tImage = [CGImagetoNSImage(fi) autorelease]; //Use external function to convert to NSImage
CGImageRelease(fi);
char *bitmapData = CGBitmapContextGetData(tC);
CGContextRelease (tC);
if (bitmapData) free(bitmapData);
return tImage; //Return the image to be drawn in a view
和插件代码:
- (void)drawObject:(CDObject*)cdo inContext:(CGContextRef)ctx {
CGContextSetRGBFillColor(ctx, 1.0, 0.0, 0.0, 0.5);
CGContextFillRect(ctx, CGRectMake(0, 0, cdo.width, cdo.height));}