Core Image坐标系的ScaleCTM(1,-1)和TranslateCTM(0, y)-记录便于理解

来源:互联网 发布:游戏公司程序员面试 编辑:程序博客网 时间:2024/05/11 05:38

  • Core Image坐标系中
  • UIKit坐标系中
  • 那么需要转换的思路


1.Core Image坐标系中

CoreImage的坐标系

2.UIKit坐标系中

UIKit的坐标系

但是,实际是,在UIkit坐标系下,我们想要的并不是两个红色矩形框的位置,而是黄色矩形框的位置

注意: 黄色矩形框的位置是以下面代码中的获取的坐标值为准则

原因: 下面代码说明了,所有的位置是相对于原始图片的,而原始图片的是以左下角为原点的.所以一开始得到的矩形框的位置,是和在Core Image坐标系的位置是一致的.和UIKit坐标系的位置是不一样的

/** A barcode feature found by a CIDetector All positions are relative to the original image. */@available(iOS 8.0, *)public class CIQRCodeFeature : CIFeature {    public var bounds: CGRect { get }    public var topLeft: CGPoint { get }    public var topRight: CGPoint { get }    public var bottomLeft: CGPoint { get }    public var bottomRight: CGPoint { get }    public var messageString: String { get }}

思考:
为了让矩形框,在不同坐标系下的位置,相对于图片(整个图片)是不变的 ???

 -  造成的根本原因是,Core Image坐标系原点在图的左下角,y方向向上;而UIKit坐标系原点在图的左上角,y方向向下,那么可以得出以下结论:

1).同一个坐标值(x,y)在这两个不同坐标系中,使得在同一个图片(整个图片)上的位置看上去是不一样的
2).对于坐标值(x,y) 和坐标值(x,图片.height-y - 矩形框.height),在这两个不同坐标系中,使得在同一个图片上的位置看上去是一样的
3).其实Core Image坐标系和UIKit坐标系就是原点的位置和y轴的正向朝向不同

3.那么需要转换的思路

思考:
- 对于上面两个图中,遇到的问题是:
- 1. 在UIKit坐标系下,通过CIDetector获取的黄色矩形框的位置,却是相对于原始图片(原始图片是以左下角为原点)的坐标值
- 2. 但是,获取的这个坐标值,用于绘制矩形,就会使得位置相对
看到的黄色的位置是不一样的,拿到这个坐标值,直接绘制之后,实际的表现是在UIKit坐标系中的红色矩形框的位置

目标:
将Core Image坐标系经过转换后,和UIKit的坐标系是一样的话,那么最终,再转换到UIKit坐标系中,绘制的矩形框相对于在同一张图片上的位置和在设备上看到的矩形的位置是一样的


举例:
UIKit坐标系,如下图
UIKit的坐标系

  • 1.比如:上UIKit坐标系的图中,为了能将矩形真正的绘制在黄色矩形框相对于图片(整个图片)的位置上
  • 2.而现在通过CIDector拿到的位置是以图片的左下角为原点(Core Image坐标系的原点一样)
  • 3.那么在转换Core Image坐标系之前,在Core Image坐标系中,绘制矩形的位置就是在UIKit坐标系的黄色矩形框相对应图片的位置,再转换到UIKit坐标系中,在手机设备上,看到的位置却是UIKit坐标系图中的红色矩形相对于图片的位置
  • 4.转换Core Image坐标系使得和UIKit坐标系相同之后,在Core Image坐标系中,绘制矩形的位置就是在UIKit坐标系图中的红色矩形相对于图片(整个图片)的位置;再转换到UIKit坐标系中,在手机设备上,看到的位置,就是在黄色矩形框相对应图片的位置
  • 5.综上所述,问题得到解决.

1)在Core Image坐标系为左下角来说,scaleCTM(1,-1)之后,坐标系的y的朝向变为向下,坐标原点还是黄图左下角为(0,0),如下图

scaleCTM(1,-1)之后

2)在Core Image坐标系为黄图左下角为(0,0),y轴向下为正 情况下,经过
translateCTM(0,-size.height)之后的整个坐标系,现在变为黄图的左上角为(0,0)点,y向下为正的,如下图

translateCTM(0,-size.height)之后

3)那么现在绘制矩形框的话,在Core Image现在的坐标系中,分析Core Image坐标系转换前后,同一个(x,y)的位置的变化,如下图

  • 注意:
    • 黄色坐标轴是转换以前的, 蓝色坐标轴是转换之后的
    • 对于同一个坐标值的矩形框,在Core Image的坐标系 变换之前(以黄色坐标轴)和变换之后(以蓝色坐标轴)的位置是不一样的

分析Core Image坐标系转换前后,同一个(x,y)的位置的变化

注意:
1. 现在Core Image坐标系原点位置和y轴朝向与UIKit坐标系原点位置和y轴朝向是一样的
2. 都是,黄图左上角为原点(0,0),y轴向下为正
3. 那么此时,坐标系都变得一样了的话,那么问题就得到解决了
4. 从绘制图片的位置和实际上UIKit坐标系中的位置(看到的位置)的效果来看,他们是相对于图片水平中轴对称的
5. 从Image Core坐标系中绘制图片的相对于图片左下角的坐标值和实际上UIKit坐标系中的相对于图片左上角的坐标值来看,它们的坐标值是一样的.


转载请注明出处: http://blog.csdn.net/pgwizardmac

0 0