UIImage 中的绘图被扭曲

Posted

技术标签:

【中文标题】UIImage 中的绘图被扭曲【英文标题】:Drawings in UIImage are being distorted 【发布时间】:2012-07-16 06:31:47 【问题描述】:

我在我的应用中实现了一个高亮功能。此高亮显示在 UIImage 中,以便可以将其保存为 PNG 表示。一切都运行良好,但最近我意识到一个非常令人困惑的问题。有时当我突出显示时,图纸被扭曲了。这是它的样子:

每当我移动手指突出显示字符时,绘制的高光就会向左拉伸。另一个:

在这个中,每次我移动手指高亮时,绘制的高光都会向上移动!

这一切都让我很困惑。这种情况不时发生,有时仅发生在某些页面上。有时它就像这样运行良好:

我很困惑为什么会这样。谁能告诉我或至少让我知道为什么会发生这种情况?请帮帮我。

代码:

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

   currPoint = [[touches anyObject]locationInView:self];

   for (int r = 0; r < [rectangles count]; r++) 
   
      CGRect rect = [[rectangles objectAtIndex:r]CGRectValue];

      //Get the edges of the rectangles
      CGFloat xEdge = rect.origin.x + rect.size.width;
      CGFloat yEdge = rect.origin.y + rect.size.height;

    if ((currPoint.x > rect.origin.x && currPoint.x < xEdge) && (currPoint.y < rect.origin.y && currPoint.y > yEdge))
    
        imgView.image = [self drawRectsToImage:imgView.image withRectOriginX:rect.origin.x originY:rect.origin.y rectWidth:rect.size.width rectHeight:rect.size.height];
        break;
    
   


//The function that draws the highlight
- (UIImage *)drawRectsToImage:(UIImage *)image withRectOriginX:(CGFloat)x originY:(CGFloat)y rectWidth:(CGFloat)width rectHeight:(CGFloat)ht

  UIGraphicsBeginImageContext(self.bounds.size);
  CGContextRef context = UIGraphicsGetCurrentContext();
  [image drawInRect:self.bounds];

  CGContextSetStrokeColorWithColor(context, [UIColor clearColor].CGColor);

  CGRect rect = CGRectMake(x, y, width, ht);
  CGContextAddRect(context, rect);
  CGContextSetCMYKFillColor(context, 0, 0, 1, 0, 0.5);
  CGContextFillRect(context, rect);

  UIImage *ret = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  return ret;

【问题讨论】:

没有看到您的代码,很难帮助您。您需要编辑您的问题以包含获取触摸坐标并绘制突出显示的代码。 嗨。我添加了上面的代码。请帮助我知道代码有什么问题。谢谢。 【参考方案1】:

我不能确切地告诉你为什么会出现这些伪影,但是...

我认为在触摸处理程序中渲染图像不是一个好主意。触摸处理应该尽可能少。

您可能想尝试使用 CoreAnimation 的CALayer

将您的图像设置为这样的背景图像(假设您的类是UIView 的子类)或使用实际的UIImageView

self.layer.contents = (id)image.CGImage;

当您检测到另一个矩形 rect 已被触摸时,将突出显示添加为图像背景上方的子图层:

CALayer *highlightLayer = [CALayer layer];
highlightLayer.frame = rect;
highlightLayer.backgroundColor = [UIColor yellowColor].CGColor;
highlightLayer.opacity = 0.25f;
[self.layer addSublayer:highlightLayer];

shouldRasterize 层属性可能有助于在必要时提高性能:

self.layer.shouldRasterize = YES;

为了使用所有这些,请使用 QuartzCore 框架并在您的实现文件中导入 &lt;QuartzCore/QuartzCore.h&gt;

您可以通过将self.layer 渲染到图像上下文来创建层层次结构的PNG 表示,然后获取图像和您的PNG 表示。

【讨论】:

嗨 Reimar。感谢您的回复。自从我发布这个问题以来,我从使用 UIImage 切换到使用 CALayer。我可以说我终于可以更好地突出单词了。我只是想知道是什么导致了图纸的失真。无论如何,谢谢你的回答。我会赞成它。 :)

以上是关于UIImage 中的绘图被扭曲的主要内容,如果未能解决你的问题,请参考以下文章

UIView 中的 CG 绘图用作 UIImage?

CoreGraphics 在大 UIImage 上绘图

从 UIImage 清除 UIView 绘图

iOS 绘图 (UIImage的一些操作)

将 UIImage 用于 UIImageView 时 UIImage 失真

当动画 UIImage 被分配两次时,UITableViewCell 中的 UIImageView 没有动画