2

这是我遇到的一个奇怪问题的图片:

截屏

我正在使用插件架构在 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));}
4

0 回答 0