为什么视网膜显示屏上CoreGraphics的线宽呈现半宽?

时间:2012-08-06 16:48:38

标签: core-graphics retina-display cgcontext

我的流程如下:

  • 使用点尺寸定义我想要绘制的矩形。
  • 定义CGFloat scale = [[UIScreen mainsScreen] scale]
  • 将矩形的大小乘以比例
  • 使用CGBitmapContextCreate
  • 创建矩形大小的图像上下文
  • 在图像上下文中绘制
  • 致电CGBitmapContextCreateImage
  • 以适当的比例致电UIImage imageWithCGImage:scale:orientation

我原本以为这一直在视网膜和旧屏幕上都能产生完美的图像,但并没有密切注意线条对比度/厚度。一般来说,笔画与填充的对比度很高,所以到目前为止我没有注意到,线和填充之间的对比度很低。

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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