苹果iso开发:[10]CGContextSetLineWidth
来源:互联网 发布:黑米软件官方吧 编辑:程序博客网 时间:2024/06/06 02:50
form :http://jingyan.baidu.com/article/4f7d571291085c1a2119277e.html
前段时间美术在验收界面时提了问题:为啥要求1像素宽的一个矩形框似乎却变成了2,3个像素宽。仔细检查过代码后发现,的确设置了LineWidth为1,但绘制效果却并不如人愿。似乎在ios上绘制最低要2个像素的线宽。
查看文档后发现造成这个问题的原因是Quartz的抗锯齿机制。一种粗暴的解决方案是不采用抗锯齿,即:CGContextSetShouldAntialias(context, NO)。但是显而易见的问题是取消抗锯齿会导致绘制效果变差。而另外一种方案则比较取巧:将绘制调整到半像素坐标系上:
比如 CGContextMoveToPoint(context, 100.0, 100.0); CGContextAddLineToPoint(context, 100.0, 200.0);改为 CGContextMoveToPoint(context, 100.5, 100.5); CGContextAddLineToPoint(context,100.5, 200.5);
这是因为:所谓的线宽指的是给定路径的中心到两边的粗细,换句话是在路径的两边各绘制一半。如图
在绘制线宽为1的直线(3,1)到(3,5)时,实际上是占据了左右两个像素各半个像素,而真正绘制时当然是以一个像素为标准单位,所以浅蓝色区域就会以相近的方式进行渲染。这也是宽为1.0的线绘制并不准确的原因。而当将绘制中心调整到半个像素上就不会有这个问题,见右图:(3.5,1)到(3.5,5)。详细可以参考mozilla canvas绘制的文档。
最后上一个在ios上绘制带圆角矩形的代码:
view sourceprint?01if(radius <= 0) 02{ 03CGContextAddRect(context, rect); 04return; 05} 0607CGContextSaveGState(context); 08CGContextTranslateCTM(context, CGRectGetMinX(rect), CGRectGetMinY(rect)); 09CGContextScaleCTM(context, radius, radius); 10NSInteger width = CGRectGetWidth(rect) / radius; 11NSInteger height = CGRectGetHeight(rect) / radius; 12NSInteger halfWidth = width / 2; 13NSInteger halfHeight= height / 2; 1415CGContextMoveToPoint (context, width + 0.5, halfHeight + 0.5); 16CGContextAddArcToPoint(context, width + 0.5, height + 0.5, halfWidth + 0.5, height + 0.5, 1); 17CGContextAddArcToPoint(context, 0 + 0.5, height + 0.5, 0 + 0.5, halfHeight + 0.5, 1); 18CGContextAddArcToPoint(context, 0 + 0.5, 0 + 0.5, halfWidth + 0.5, 0 + 0.5, 1); 19CGContextAddArcToPoint(context, width + 0.5, 0 + 0.5, width + 0.5, halfHeight + 0.5, 1); 2021CGContextClosePath(context); 22CGContextRestoreGState(context);
以下是自己测试得出的结论,如有异意请各位老师不吝赐教,谢谢!
由于retina屏幕是640像素,而非retina是320,所以,分两种情况,在retina屏幕下和非retina屏幕下。
画一条从点(10.0, 10.0)到点(10.0, 100.0)的直线和点(10.5, 10.5)到点(10.5, 100.5)的直线,产生的样式,上面都解释了。
我想说的是从点(10.3, 10.3)到点(10.3, 100.3)的黑色一个像素的直线,CGContextSetShouldAntialias(context, YES)。
一、在retina屏幕下
====这个图片是我画出的线放大后的效果,我计算了,它绘制的是20、21、22这三个像素值,也就是说10.3 * 2 = 20.6;那么它会将第21个像素值绘制黑色,两边的绘制暗色。
二、在非retina屏幕下
====这个图片是我画出的线放大后的效果,计算后,它绘制的是10、11这两个像素值,那么它会将第11个像素值绘制黑色,10的绘制成暗色。
我还要说从点(10.7, 10.7)到点(10.7, 100.7)的黑色一个像素的直线,CGContextSetShouldAntialias(context, YES)。
一、在retina屏幕下
图片样式还是一样的,但是位置变了,这次画的是21、22、23这三个像素值,也就是说10.7 * 2 = 21.4;那么他是将第22个像素值绘制黑色,两边的绘制暗色。
二、在非retina屏幕下
====这个图片是我画出的线放大后的效果,计算后,它绘制的是11、12这两个像素值,那么它会将第11个像素值绘制黑色,12的绘制成暗色。
在说一说CGContextSetShouldAntialias(context, NO)。10.3和10.7的结果如下
一、在retina屏幕下
绘制位置都一样,但是样式变了,变成没有暗色全是黑色。
二、在非retina屏幕下
位置样式都变了,颜色只是黑色,并且都只画了第11个像素
总结-----
其实就一句话,“所谓的线宽指的是给定路径的中心到两边的粗细,换句话是在路径的两边各绘制一半”。这个原理明白了,啥都没问题了。
- 苹果iso开发:[10]CGContextSetLineWidth
- 苹果iso开发:[10]CGContextSetLineWidth
- 苹果iso软件开发教程下载
- 苹果开发 笔记(10)
- 软件开发及ISO
- iso开发关键字详解
- iso-开发基础知识-10-组合模式
- iphone CGContextSetLineWidth 画线的问题
- Objective-C 苹果开发文档 10 Conventions
- 《windows驱动开发包》[ISO]
- iso开发协议和委托
- delphi7开发工具 DelphiEnterprise71.ISO
- iso开发学习第二天
- 使用UltraISO将苹果dmg文件转换标准ISO
- Windows 10 iso
- 苹果的开发:
- 苹果开发工具集
- 苹果开发准备工作
- 深度学习笔记(转载)
- net工程师必懂题
- 三星S5PV210之芯灵思Sin210与TI Beaglebone Black之对比
- mysql 基本知识
- What is NetApp's Cluster File System?
- 苹果iso开发:[10]CGContextSetLineWidth
- hadoop之单机伪分布式环境搭建
- android学习笔记(2)- 创建虚拟机AVD
- libaio under MIPS architecture /在mips架构下使用的libaio
- ripv1汇总问题
- 状态压缩DP基础题解题报告
- C++ 中通过GetAdaptersInfo获取网卡配置和Ip地址信息
- C#防止WebBrowser在新窗口中打开链接页面
- ORACLE数据库、表空间、表的容量相关查询--1