2012-08-06 27 views
1

我的过程是这样的:为什么在视网膜显示器上CoreGraphics中的线宽呈现半宽?

  • 定义一个矩形我想画的,用点的尺寸。
  • 限定CGFloat scale = [[UIScreen mainsScreen] scale]
  • 乘以矩形的大小由秤
  • 创建使用图像上下文中CGBitmapContextCreate
  • 绘图
  • 呼叫CGBitmapContextCreateImage
  • 呼叫UIImage imageWithCGImage:scale:orientation矩形大小的图像上下文:与适当的规模。

我以为这总是在视网膜和老的屏幕上产生完美的图像,但一直没有密切关注线对比度/厚度。一般来说,笔画与填充物有很高的对比度,所以直到现在我才注意到线条与填充线之间的低对比度。

我想也许我误解了用户空间,但我认为这只是通过缩放直接转换,并应用了转换。除了视网膜屏幕双倍缩放外,在我的特殊情况下没有应用缩放和变换。

尝试呈现2像素线而不是1像素更容易解释:当我呼叫 UIContextSetLineWidth(context, 2)时,线在Retina模拟器上渲染为1像素厚。 1像素!但这应该是两个像素,在视网膜显示器上。

UIContextSetLineWidth(context, 2 * scale)会在视网膜屏幕上产生一条宽度为两个像素的线条,但我预计它会是4个像素。

UIContextSetLineWidth(context, 1)产生部分透明的1像素宽线。我了解跨越路径的笔画,所以我更喜欢用2像素宽的笔画和路径在像素边界上谈话。

我需要了解为什么渲染的线宽被分成两半。

回答

1

我的错。在我公开发布后,我自己解决了自己的99%的错误。

绘图代码包括CGContextClip构建和复制路径后。之后,可以应用填充,渐变或其他方式,然后绘制线条,所以一切都很好,很整齐。我专注于数学和特定的绘图代码,并没有注意到剪切线,但这将有效地减少笔划宽度的半径。通常我会立即发现类似这样的逻辑错误,但是因为它被发布到SO,所以这里的答案也是适当的。

相关问题