【问题标题】:iOS : Drawing on a CGContext eventually blursiOS:在 CGContext 上绘图最终会变得模糊
【发布时间】:2015-02-02 16:49:49
【问题描述】:

我有一个应用程序,它显示一个顶部有 UIImage 的文档,您可以在其中绘制线条等以突出显示内容。

如果我一直画线(触摸、绘制、松开手指,然后在屏幕的不同区域重复)

线条慢慢模糊。

这是我的触摸代码,我使用 kCGBlendModeCopy 作为混合模式,但使用了 kCGBlendModeNormal。 DrawingView 是一个 UIImageView。

更新 这是我已经画的线条,它们越老越模糊,感觉就像每增加一条线都会衰减旧的。在 iPad 2 ios8 iPad Mini Retina ios7 上测试

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    mouseSwiped = NO;

    if ( self.drawingEnabled )
    {
        UITouch *touch = [touches anyObject];
        lastPoint = [touch locationInView:self.drawingView];

        UIGraphicsBeginImageContext(self.drawingView.frame.size);
        [self.drawingView.image drawInRect:CGRectMake(0, 0, self.drawingView.frame.size.width, self.drawingView.frame.size.height) blendMode:kCGBlendModeCopy alpha:1.0];
    }
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    if ( self.drawingEnabled )
    {
        mouseSwiped = YES;
        UITouch *touch = [touches anyObject];

        CGPoint currentPoint = [touch locationInView:self.drawingView];

        CGContextRef ctxt = UIGraphicsGetCurrentContext();
        CGContextMoveToPoint(ctxt, lastPoint.x, lastPoint.y);
        CGContextAddLineToPoint(ctxt, currentPoint.x, currentPoint.y);
        CGContextSetLineCap(ctxt, kCGLineCapRound);
        CGContextSetLineWidth(ctxt, self.brush );
        CGContextSetRGBStrokeColor(ctxt, self.redColour, self.greenColour, self.blueColour, OPACITY);

        if (self.eraserOn)
        {
            CGContextSetBlendMode(ctxt,kCGBlendModeClear);
        }
        else
        {
            CGContextSetBlendMode(ctxt,kCGBlendModeCopy);
        }

        CGContextStrokePath(ctxt);
        self.drawingView.image = UIGraphicsGetImageFromCurrentImageContext();

        lastPoint = currentPoint;
    }
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{


    [super touchesCancelled:touches withEvent:event];

    UIGraphicsEndImageContext();

    if(!mouseSwiped)
    {
        //self.drawingView.image = nil;
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {


    if ( self.drawingEnabled )
    {

        if(!mouseSwiped) {
            UIGraphicsEndImageContext();

            UIGraphicsBeginImageContext(self.drawingView.frame.size);
            [self.drawingView.image drawInRect:CGRectMake(0, 0, self.drawingView.frame.size.width, self.drawingView.frame.size.height)];
            CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
            CGContextSetLineWidth(UIGraphicsGetCurrentContext(), self.brush);
            CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), self.redColour, self.greenColour, self.blueColour, OPACITY);
            CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
            CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
            CGContextStrokePath(UIGraphicsGetCurrentContext());
            CGContextFlush(UIGraphicsGetCurrentContext());
            self.drawingView.image = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
        }

        if (self.delegate)
        {
            [self.delegate drawingUpated];
        }

        //NSLog(@"%@  ---  %@", NSStringFromCGRect(self.frame) , NSStringFromCGRect(self.drawingView.frame) );
    }
}

【问题讨论】:

  • 你已经画的线变得模糊了?还是您添加的新线条模糊不清?你在什么设备上测试这个?可以发几张示例图片吗?
  • UIGraphicsBeginImageContext 文档说它使用的比例因子为 1;如果您使用的是视网膜设备,则可能需要使用 UIGraphicsBeginImageContextWithOptions
  • 谢谢你,但这在非视网膜上也会出错

标签: ios uiimageview cgcontext cgcontextdrawimage


【解决方案1】:

这原来是我如何设置自我框架的问题。 drawingView 和里面的图片大小。

图像是 1005 x 720 drawingView 为 1004.2 x 719.9,因此存在舍入问题。每次我画一条新线,它都会向下舍入。

【讨论】:

  • 遇到了同样的问题,你救了我的命!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多