首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何得到非矩形旋转UIImage的“边”?

要得到非矩形旋转UIImage的“边”,可以通过以下步骤实现:

  1. 创建一个UIImage对象,该对象包含需要进行非矩形旋转的图像。
  2. 使用Core Graphics框架绘制一个透明的矩形图像上下文,大小与原始图像相同。
  3. 在图像上下文中,使用CGContextClipToMask函数将图像剪切为非矩形形状。可以通过创建一个CGPath对象,描述非矩形形状的边界。
  4. 将图像绘制到图像上下文中,并应用所需的旋转变换。
  5. 使用CGContextStrokePath函数绘制非矩形形状的边界。可以设置边界的颜色、线宽等属性。
  6. 使用UIGraphicsGetImageFromCurrentImageContext函数从图像上下文中获取最终的非矩形旋转UIImage对象。

下面是一个示例代码,演示如何实现上述步骤:

代码语言:txt
复制
import UIKit

func createNonRectangularRotatedImage(image: UIImage, rotationAngle: CGFloat, shapePath: UIBezierPath, borderColor: UIColor, borderWidth: CGFloat) -> UIImage? {
    // 创建图像上下文
    UIGraphicsBeginImageContextWithOptions(image.size, false, image.scale)
    guard let context = UIGraphicsGetCurrentContext() else {
        return nil
    }
    
    // 将图像剪切为非矩形形状
    context.saveGState()
    shapePath.addClip()
    
    // 应用旋转变换
    context.translateBy(x: image.size.width / 2, y: image.size.height / 2)
    context.rotate(by: rotationAngle)
    context.translateBy(x: -image.size.width / 2, y: -image.size.height / 2)
    
    // 绘制图像
    image.draw(at: .zero)
    
    // 绘制边界
    context.setStrokeColor(borderColor.cgColor)
    context.setLineWidth(borderWidth)
    context.addPath(shapePath.cgPath)
    context.strokePath()
    
    context.restoreGState()
    
    // 从图像上下文中获取最终图像
    let finalImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    return finalImage
}

// 示例用法
let originalImage = UIImage(named: "your_image_name")
let rotationAngle: CGFloat = CGFloat.pi / 4  // 旋转角度,这里以π/4为例
let shapePath = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: originalImage.size.width, height: originalImage.size.height))  // 非矩形形状,这里以椭圆为例
let borderColor = UIColor.red  // 边界颜色
let borderWidth: CGFloat = 2.0  // 边界线宽

if let rotatedImage = createNonRectangularRotatedImage(image: originalImage, rotationAngle: rotationAngle, shapePath: shapePath, borderColor: borderColor, borderWidth: borderWidth) {
    // 使用旋转后的图像
    // ...
} else {
    // 创建旋转后的图像失败
    // ...
}

这是一个示例代码,用于演示如何得到非矩形旋转UIImage的“边”。根据具体需求,你可以根据这个示例进行修改和扩展。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS MachineLearning 系列(2)—— 静态图像分析之矩形识别

本篇将首先介绍如何分析出静态图片中的矩形区域。矩形区域的是被非常重要,其通常用来对要分析的图片进行预处理,例如通过矩形分析截取其中的二维码,条形码部分后再进行精准的识别。...1 - 矩形分析示例 与视觉相关的大部分AI能力都封装在Vision框架中,本文要介绍的是通过发起矩形分析请求来分析图片,得到分析结果后将分析出来的矩形区域绘制回原图像上。...首先定义一些属性: // 要分析的图片资源 let image = UIImage(named: "image2")!...最后,使用下面的代码来发起请求,静态图像的分析将会是一个耗时的过程,因此建议在非主线程中进行: DispatchQueue.global(qos: .userInitiated).async {...{ get } } 需要注意,设置最大最小纵横比时,会总是以长的一边作为纵,短的一边作为横。

71010
  • CALayer 图层概念二、CALayer属性二、方法

    CGImageRef, CGColorRef两种数据类型是定义在CoreGraphics框架中的. UIColor, UIImage是定义在UIKit框架中的....当对非 Root Layer的部分属性进行修改时, 默认会自动产生一些动画效果, 而这些属性称为Animatable Properties (可动画属性)....= YES ; 设置两边多余地方不裁剪 button.imageView.clipsToBounds = NO; 路径绘制,绘图剪裁 矩形图片剪裁成圆并且外面设置圆环并存储 给layer设置背景图片...用法一样,也有make和非make方法) @property CATransform3D transform; (1) 平移(当没有3D旋转的时候z值没有效果) CATransform3D CATransform3DMakeTranslation...以哪个轴的哪个点进行旋转,以一个轴旋转,轴上的任何点都一样,参数填1就可以 CATransform3DMakeRotation (CGFloat angle, CGFloat x, CGFloat

    1.4K70

    UIKit中封装了一些最常用的绘图方法2. 贝塞尔路径常用方法列表(BezierPath)3. 保存屏幕截图,并存储至相册

    贝塞尔路径常用方法列表(BezierPath) 2.1 贝塞尔路径的常用方法列表 2.1.1 构造函数 矩形 bezierPathWithRect 圆角矩形 bezierPathWithRoundedRect...,也可以用这种方式画圆 - (void)drawRect:(CGRect)rect { // 创建路径 // 参数1:矩形的左上角圆点及矩形的宽高。...) cornerRadius:10]; // 渲染 [path stroke]; } 2.4 画椭圆,根据这种方法也可以画圆 画出来的也是矩形的内切椭圆 - (...系统指定的保存后结束要执行的方法.png OS8.0 之后,访问相册,给出提示文字。 ? 访问相册,给出提示文字.png 接下来,会分享如何使用OC绘制饼状图、柱状图和扇形图。...以及如何使用它们来绘制动态的进度条等等

    1.6K40

    C++ OpenCV检测并提取数字华容道棋盘

    # 实现思路 1 图像预处理后进行边缘检测 2 查找到最大的轮廓并且是4边形的轮廓 3 将查找到的轮廓获取到最小旋转矩形进行透视变换 4 提取出透视变换后的图像显示出来 代码实现 ?...= 4) continue; //求出最小旋转矩形 RotatedRect rRect = minAreaRect(contours[i]); //更新最小旋转矩形中面积最大的值...,首先通过计算轮廓的周长再乘0.01得到的值做为阈值,然后通过这个阈值对轮廓的点进行多边形拟合,拟合后的轮廓点个数来判断是不是四边形。...03 取出旋转矩形透视变换并提取 上一步找到符合条件的最大轮廓的编号后,我们单独对这个轮廓进行处理,处理的方式就是《C++ OpenCV透视变换改进---直线拟合的应用》篇中透视变换的改进-----采用直线拟合的方式...上图中轮廓检测没问题,但是多边形拟合后得到的轮廓为5个点, 所以不认为是四边形 ? 行人这个肯定检测不出四边形 ?

    1K20

    iOS动画-CALayer基础知识

    下面是一些UIView没有暴露出来的CALayer的功能: 设置阴影、圆角、带颜色边框 3D变换 非矩形范围 透明遮罩 多级非线性动画 二、CALyer寄宿图与contents属性 CALayer具有和...UIView一样的层级关系树,可用于显示一个矩形块。...CALayer的contents,却会得到一个编译错误。...frame&&bounds.png 上图对原有视图做了旋转变换,之后的frame实际上代表了覆盖在图层旋转之后的整个轴对齐的矩形区域,此时frame的宽和高和bounds不再一致了。...;但这时候我们又不得不考虑一个问题:修改锚点可以让我们的动画围绕非中心点旋转,但是这也改变了原有视图的位置frame,这是我们不想要的结果,该如何解决呢?

    1.9K50

    Quartz2D复习(一)--- 基础知识 绘制线段圆弧 图片水印 截图

    /矩形/圆和弧)、绘制文字、绘制和生成图片、读取/生成pdf、截图/裁剪图片、自定义UI控件等 3、对于界面复杂且个性化的UI,普通的UI控件无法实现,而Quartz2D技术却可以通过自定义UI控件来实现...会触发layoutSubviews,当然前提是frame的值设置前后发生了变化 33 4、滚动一个UIScrollView会触发layoutSubviews 34 5、旋转Screen会触发父UIView...163 kCGPathEOFill, //奇偶规则 164 kCGPathStroke, //描边 165 kCGPathFillStroke,//填充又描边 166...drawInRect:CGRectMake(0, 300, 200, 40) withAttributes:dicts]; 352 353 //画图片 : 可以想象UIImageView是如何展示图片的...该值改变描边宽度(相对于字体size 的百分比)。默认为 0,即不改变。正数只改变描边宽度。负数同时改变文字的描边和填充宽度。例如,对于常见的空心字,这个值通常为3.0。

    2.6K10

    EAST算法超详细源码解析:数据预处理与标签生成

    shrink_poly(ii) 注意,以上move_points 代表移动一条边,即2个顶点,返回的是移动后顶点的坐标(包括未移动的),接下来看看具体是如何移动顶点的。...06 find_min_rect_angle: 寻找文本框的最小外接矩形,获得对应的旋转角度 我们知道,场景文字的方向并不都是水平的,因此文本框与水平轴是有一定角度的,那么如何知道这个角度是多少呢?...此处是通过枚举的方式,对于在 [ ] 范围内的每个角度,都将文本框进行对应的旋转,旋转后记录对应的外接矩形面积,文本框和前10个面积最小的外接矩形的拟合误差,最终选取误差最小的那个方案对应的旋转角。...理想情况下,我们找到了真实的角度 ,这时候旋转文本框,得到的外接矩形就会和文本框重合(当然,文本框不是直角矩形而是其它多边形形状时,不会重合),如上图中间部分,这时候外接矩形的面积最小,拟合误差最小。...上图代码应该交代的很明白了,拟合误差实质就是文本框与外接矩形4个顶点之间对应距离之和。 08 rotate_all_pixels:旋转图像中的所有点 最后来看看图像中的点是如何旋转的。

    2K30

    iOS开发——Core Graphics绘图

    iOS常见的图形绘制 画线 画圆、圆弧、贝塞尔曲线 画矩形、椭圆形、多边形 绘制图片 绘制文字 ---- iOS绘图基础 在绘图之前,我们先来了解一下几个基本的概念 context:上下文,ios绘图的方法都需要传一个上下文...画几条线或几个点从而形成一个路径,之后可以利用理解去填色或者描边 stroke,fill 描边和填充,每个路径都需要填充或者描边后才能在视图中看见,他们都各自有很多样式可以设置,常见的有颜色、粗细、渐变...根据路径填充颜色 填充笔触和颜色 填充颜色也分为非零绕数规则和奇偶规则,这个概念比较复杂难以解释,大家可以百度看看或者画几个图试试就明白。...//填充指定的一些矩形 CGContextFillEllipseInRect //填充指定矩形中的椭圆 常见的图形绘制 准备工作 新建一个文件,继承UIView 重写-(void...*image = [UIImage imageNamed:@"head.jpeg"]; [image drawInRect:CGRectMake(10, 300, 100, 100)]

    2.5K20

    opencv 7 -- 边界矩形

    有两类边界矩形 一、直边界矩形—boundingRect() 一个直矩形(就是没有旋转的矩形)。它不会考虑对象是否旋转。 所以边界矩形的面积不是最小的。...可以使用函数 cv2.boundingRect() 查找得到 (x,y)为矩形左上角的坐标,(w,h)是矩形的宽和高 x,y,w,h = cv2.boundingRect(cnt) cv2.boundingRect...,y4]]) # 必须是array数组的形式 二、旋转的边界矩形 这个边界矩形是面积最小的,因为它考虑了对象的旋转。...90 最小外接矩形的4个顶点顺序、中心坐标、宽度、高度、旋转角度(是度数形式,不是弧度数)的对应关系如下: ?...注意:旋转角度θ是水平轴(x轴)逆时针旋转,与碰到的矩形的第一条边的夹角。并且这个边的边长是width,另一条边边长是height。

    1.8K20

    【文本检测与识别-白皮书-3.1】第一节:常用的文本检测与识别方法

    ;然后通过随机森林(random forest)对候选区域进行文本和非文本分类以过滤背景区域,得到的文本候选区域最后通过一个CNN 对边界框回归,得到最终的检测结果。...pooling,RoI-Pooling)操作,增加了特征尺寸,然后在Fast R-CNN 中额外增加了一个分支预测旋转的矩形以及一个针对倾斜框的非极大值抑制后处理算法以解决多方向文本的检测问题。...Ma 等人(2018)同样也指出应该用旋转矩形替代水平矩形来进行文本检测。...作者提出了旋转候选区域生成网络(rotated region proposal network,RRPN),结合旋转矩形的锚点框(anchor)来生成倾斜的文本候选区域。...然后设计了旋转感兴趣区域池化(rotated region of interest pooling,RROI Pooling)算法为每个倾斜的候选区域从卷积特征图中提取固定尺度的特征以进一步地进行文本和非文本分类

    1.3K30

    腾讯地图JavaScript API GL实现文本标记的碰撞避让

    商业转载请联系作者获得授权,非商业转载请注明出处。 前言 本文主要是总结一下web页面中的旋转矩形的碰撞检测,碰撞算法本身并不难,只是需要注意web坐标系在计算中的影响。...但是用户可以对label进行旋转和偏移操作,普通的检测方法就不适用了,如果强行把label用一个大的水平矩形包裹起来再计算,精度损失会很多,所以调研了一下旋转矩形的碰撞检测方法。...对于矩形来说可以进一步简化,因为一个矩形的4条轴内有2个是重复的,所以只需要检测矩形互相垂直的两条边对应的轴就可以了。...vectorB[0] + vectorA[1] * vectorB[1]); } 然后就是如何表示矩形两个轴的单位向量,假设矩形以自身的中心点为原点,逆时针旋转θ,其两条相邻边的轴的单位向量如下图所示:...我们需要把右边2条检测轴投影到蓝色线段所在X轴的单位向量(即左边矩形的检测轴单位向量),得到投影比例,然后乘以检测轴长度(即矩形长、宽的一半),可计算出右边矩形的半径投影。

    1.6K40

    View编程指南(三)

    即使在每种情况下旋转和平移的数量是相同的,但是变换的顺序影响最终的结果。 此外,您添加的任何转换都将应用于相对于view的center。 因此,应用旋转因子围绕其中心点旋转view。...中转换坐标时,UIKit会在假定要返回的矩形反映源矩形所覆盖的屏幕区域的情况下转换矩形。...图显示了一个转换过程中如何导致矩形大小改变的例子。 在图中,外部父view包含旋转的subview。 将subview坐标系中的矩形转换为父坐标系,得到一个物理上较大的矩形。...这个较大的矩形实际上是outerView bounds中最小的矩形,它完全包围了旋转的矩形。...UIImage layerContents = [[UIImage imageNamed:@"myImage"] retain]; CGSize imageSize = layerContents.size

    1.8K30

    iOS学习——Quartz2D学习之UIKit绘制

    在绘制发生的时候如果使用的是系统提供的视图,绘制工作会自动得到处理。然而,如果是自定义视图,则必须重写drawRect:方法,在此提供相应的绘制代码。...rect),填充矩形函数  - UIRectFrame(CGRect rect),矩形描边函数  - UIBezierPath,绘制常见路径类,包括险段、渐变、阴影、反锯齿等高级特性支持还是不及Quartz...在前面我们学会了如何在自定义view中绘制文本信息,其实绘制图片的方法绘制文本的方法非常类似,所以基本步骤如下: 导入素材 在DrawRect加载图片  UIImage *image = [UIImage...9、如何选用UIKit提供的方法快速画一个矩形?...UIRectFill(rect);快速的用矩形去填充一个区域 UIRectFrame(rect);快速绘制一个矩形的边框  10、用UIKit裁剪一个区域 UIRectClip(CGRectMake

    1.5K20

    你被追尾了

    外接图形判别法的优点是极为简单,但是缺点也是瞎眼可见的 相对局限:两物体必须是矩形,且均不允许旋转,即上面的矩形的边必须平行于坐标轴....对于包含着图案(非填满整个矩形)的矩形进行碰撞检测,可能存在精度不足的问题。例如你写一个坦克大战游戏 ?...既然代码和矩形碰撞检测的代码类似,那么优缺点和适用场景和矩形碰撞检测也就完全类似了 圆形与无旋转矩形 所谓无旋转前面已经解释过了, 就是矩形的边需要平行于坐标轴 那么这种检测算法就很简单了....圆形与旋转矩形(以矩形中心为旋转轴) 算法和上面 圆和无旋转矩形 碰撞的思想完全类似,即本质依旧是求出 矩形上离圆心的最近点 看似有点小困难,但其实你把矩形旋转视作是圆绕着矩形中心反方向旋转的话,就很好理解了...这就是分离轴定理名字的由来. ? 但是程序中遍历所有光源的角度是不现实的,那如何确定 投影轴 呢?其实投影轴的数量与多边形的边数相等即可。 ?

    4.6K30

    文本检测算法EAST介绍

    支持旋转矩形框、任意四边形两种文本区域的标注形式。换句话说EAST在回归文本区域的时候包括了旋转矩形框、矩形框加旋转角或者任意四边形这样两种不同的区域检测的过程。...在输出层有两种不同的输出,这两种不同的输出则对应到了旋转矩形框(1个score map+4个回归框+1个角度信息)和任意四边形(1个score map+8个坐标信息) EAST标签 上图中对于a图是一块文本区域...通过对文本区域计算它的外接矩形,也就是c图中的粉色区域,也就能得到RBOX的label信息。对于角度,我们同样计算矩形区域同水平线所产生的夹角,这个夹角表达为RBOX的旋转角度。...此时我们就能够得到RBOX以及四边形区域,并且用于后续的网络的回归和预测。 EAST损失函数 作者采用了Balanced-xent(类平衡交叉熵)、IOU loss和角度loss。...这里是针对于文本区域所对应的矩形区域得到的IOU。角度loss,这里采用余弦距离作为角度的loss。通过将这三组loss结合之后得到网络的损失函数,并且用于后续的训练。

    2K20

    【opencv实践】仿射变换和透视变换

    等式右边是平移之后的坐标。 放缩 进行放缩,就是将矩形(图像)放缩n倍,也就是长宽各乘一个变量。 ? 旋转 对矩形(图片)进行旋转,关于旋转的数学推导在后面仿射会介绍: ?...印象最深刻的就是下图: ? 可以看到,仿射变换(下)是将矩形变换成平行四边形(即变换后各边依旧平行),而透视变换(上)可以变换成任意不规则四边形。 这样看来,好像仿射变换是透视变换的子集。...一个点P在原始坐标系下的坐标是(Xsp,Ysp)。然后要完成旋转操作,旋转操作是基于原点的。如何得到旋转之后的点的坐标,这里用到一个技巧: 坐标系中某个点的旋转可以等价地去旋转坐标轴。...基于这个结论,我们可以通过简单的立体几何知识确定P在新坐标系中的坐标。P在新坐标系中的X坐标和Y坐标分别是 ? 进而我们可以得到: ? 到此,我们完成了旋转操作,如何平移呢?...然后我们需要选取原图上的四个点,并计算出该四对点变换后的位置。 如何选点?我们可以选两边白条的四个定点。那变换后的位置就需要我们自己估算了,如下图: ? 我们希望将蓝色的透视变换为黄色的。

    5.6K30

    碰撞检测的向量实现

    AABB与OBB的区别在于,AABB中的矩形的其中一条边和坐标轴平行,OBB的计算复杂度要高于AABB。根据不同的使用场景,可以用不同的方案。 ?...向量运算 加法:向量的加法满足平行四边形法则和三角形法则。具体的,两向量相加还是一个向量,分别是x与y两个分量的相加。 ?...然后,把 v 减去 h,负数的分量设置为0,就得到圆心与矩形最短距离的矢量 u。下图展示了4种情况,红色的u是结果。 ? 最后要比较 u 和 r 的长度,若距离少于 r,则两者相交。...} 两矩形相交非轴对称OBB ?...若在某一角度光源下,两物体的投影存在间隙,则为不碰撞,否则为发生碰撞。 因为矩形的对边平行,所以只要判断四条对称轴上的投影即可。 ? 如何投影?这里补充一下向量点积的几何意义。 ?

    1.6K10

    CTPN、TextBoxes、SegLink、RRPN、FTSN、DMPNet…你都掌握了吗?一文总结OCR必备经典模型(一)

    这样就可以得到一个密集预测的text proposal,接下来使用一个标准的非极大值抑制算法(NMS)来滤除多余的box。最后使用基于图的文本行构造算法,将得到的文本段合并成文本行。...进一步的,引入RRoI Pooling用于RRPN中的旋转矩形的池化。首先需要设置超参数Hr 和Wr ,分别表示池化后得到的Feature Map的高和宽。...后处理 为了得到最终的检测结果,使用非最大抑制机制(NMS)来过滤重叠的文本实例,并保留那些具有最高分的文本。在NMS之后,为每个文本实例生成一个覆盖掩码的最小四边形,如图7所示。...多边形滑窗 作者提出了倾斜四边形作为anchor box,如图8所示:在正方形窗口内增加两个45度的矩形窗;在长矩形窗内增加两个长平行四边形窗口;在高矩形窗内增加两个高平行四边形窗口。...序贯协议 对于水平的矩形框,只需要预测两个对角点的位置即可唯一确定该矩形,但对于任意的四边形,则需要同时预测四个角点的坐标。为了统一角点的顺序,论文提出了一种序贯协议。

    54430
    领券