UIKit和Core Graphics绘图——绘制光泽,仿射变换与矩阵变换

UIKit与Core Graphics绘图技术详解 Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎。它提供了低级别、轻量级、高保真度的2D渲染。该框架可以用于基于路径的绘图、变换、颜色管理、脱屏渲染,模板、渐变、遮蔽、图像数据管理、图像的创建、遮罩以及PDF文档的创建、显示和分析。为了从感官上对这些概念做一个入门的认识,你可以运行一下官方的example code。 阅读详情

绘制光泽


在一个矩形上绘制光泽其实可以通过在原有色彩的基础上绘制一层透明度较高的渐变来实现。首先先看以前绘制渐变的函数。

void drawLinearGradient(CGContextRef context, CGRect rect, CGColorRef startColor, CGColorRef endColor)
{
    CGContextSaveGState(context);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    NSArray *array = @[(__bridge id)startColor, (__bridge id)endColor];
    
    CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)array, (CGFloat[]){0.0, 1.0});
    
    CGPoint startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect));
    CGPoint endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect));
    CGContextAddRect(context, rect);
    CGContextClip(context);
    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
    
    CGColorSpaceRelease(colorSpace);
    CGGradientRelease(gradient);
    CGContextRestoreGState(context);
}


我们可以利用此函数同时绘制色彩渐变与增加光泽效果,函数如下:

void drawGlossAndLinearGradient(CGContextRef context, CGRect rect, CGColorRef startColor, CGColorRef endColor)
{
    drawLinearGradient(context, rect, startColor, endColor);
    
    UIColor *dark = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.1];
    UIColor *light = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.35];
    CGRect halfRect = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height/2);  //光泽在上半部分
    
    drawLinearGradient(context, halfRect, light.CGColor, dark.CGColor);
}

在我们自定义UIView的drawRect中调用,同时加了阴影效果。

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGRect paintingRect = CGRectMake(5, 5, self.bounds.size.width - 10, self.bounds.size.height - 10);
    UIColor *lightBlue = [UIColor colorWithRed:105/255.0 green:179/255.0 blue:216/255.0 alpha:1.0];
    UIColor *darkBlue = [UIColor colorWithRed:21/255.0 green:92/255.0 blue:136/255.0 alpha:1.0];
    
    CGContextSaveGState(context);
    CGContextAddRect(context, paintingRect);
    CGContextSetFillColorWithColor(context, lightBlue.CGColor);
    CGContextSetShadowWithColor(context, CGSizeMake(0, 2), 3.0, [[UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1.0] CGColor]);
    CGContextFillPath(context);
    
    CGContextStrokePath(context);
    CGContextRestoreGState(context);
    
    drawGlossAndLinearGradient(context, paintingRect, lightBlue.CGColor, darkBlue.CGColor);

效果如下




看起来还算不错~


仿射变换


在路径中加入放射变化可以对绘制的图形发生一些变换效果,例如平移,缩放和旋转
函数分别为
CGAffineTransformMakeTranslation
CGAffineTransformMakeScale
CGAffineTransformMakeRotation
三者都返回一个类型为CGAffineTransform的对象,可以在设置路径的时候设置到参数中

举一个例子,画一个矩形 对它进行平移

- (void)rectTranslate
{
    CGMutablePathRef path = CGPathCreateMutable();
    CGAffineTransform transform = CGAffineTransformMakeTranslation(100, 10);
    
    CGPathAddRect(path, &transform, CGRectMake(10, 10, 200, 300));
    
    CGContextRef context  = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextAddPath(context, path);
    [[UIColor colorWithRed:.2f green:.6f blue:.8f alpha:1.0f] setFill];
    [[UIColor brownColor] setStroke];
    CGContextSetLineWidth(context, 5.0f);
    
    CGContextDrawPath(context, kCGPathFillStroke);
    
    CGContextRestoreGState(context);
    CGPathRelease(path);
}

这里平移的参数是x轴正向移动100,y轴正向移动10。然后将地址&transform传入到CGPathAddRect函数中。

矩阵变换


这里是指二维矩阵变换,对上下文以后绘制的所有内容进行转换。这里不同于Path只是给rect设置变换,矩阵变换是以后上下文绘制的内容全部发生变化。
在上下文中加入矩阵变换的函数为
CGContextTranslateCTM
CGContextScaleCTM
CGContextRotateCTM(传入的为弧度)

- (void)rectScale
{
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddRect(path, NULL, CGRectMake(10, 10, 200, 300));
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextScaleCTM(context, .5f, .5f);   //需要在加路径之前使用,上下文设置的所有内容都进行缩放
    CGContextAddPath(context, path);
    CGContextSetLineWidth(context, 5.0f);
    [[UIColor colorWithRed:.2f green:.6f blue:.8f alpha:1.0f] setFill];
    [[UIColor brownColor] setStroke];
    
    CGContextDrawPath(context, kCGPathFillStroke);
    CGContextRestoreGState(context);
    CGPathRelease(path);
}

这个方法中,设置了一个缩放矩阵,之后绘制的矩形则变成了原来尺寸的一半。


以上为本篇文章全部内容,欢迎指正和交流。转载请注明出处~
使用 imshow() 绘制矩阵 使用 imshow() 绘制矩阵 基础的展示效果 import matplotlib.pyplot as plt import numpy as np mat = np.arange(0, 100).reshape(10, 10) plt.imshow(mat, cmap=plt.cm.Blues) plt.show() 在画布上画多张图 import matplotlib.pyplot as plt import numpy as np fig = plt.figure(figsize=(10, 1 阅读详情

相关推荐

IOS飞机大战OC版

前一阵子看到了很多版本的打飞机游戏,有Java版的C++版本的还有C语言版的。。。 这几天闲着的时候写了一个OC版的,也正好是因为答应朋友写这个游戏来把飞机都换成他照片- -。 没有用Cocos2d框架,用的QuartzCore中的CADisplayLink来完成。 先看下完成后的效果    简单的架构思路设计如下: 图片资源与音乐资

RannieR的技术博客 3983

图像仿射变换与透视变换

____在做图片的相关任务时,由于拍摄角度等原因需要对图像进行一些预处理。最近用到了仿射变换和透视变换。通过查看了别人的博客以及一些相关的书籍,整理如下: ____仿射变化主要用在对图像的形变,如旋转、平移、缩放等,它是二维空间上的变换。透视变换(Perspective Transformation)是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转...

aliyanah_的博客 3399

Unity接入Google登录:Credential Manager完整集成指南与避坑实践

在移动应用开发中,第三方登录是提升用户体验和降低注册门槛的关键技术。其核心原理是通过OAuth 2.0等授权协议,安全地获取用户在平台的身份凭证。对于面向海外市场的Unity应用,Google登录因其庞大的用户基数成为首选方案。然而,随着Android系统更新和隐私政策收紧,传统的WebView登录方式面临兼容性挑战。Credential Manager作为Google推出的现代化凭据管理API,通过系统级集成解决了这一问题,它统一了密码、通行密钥和第三方登录的调用接口,显著提升了登录成功率和原生体验。在U

weixin_28025327的博客 320

Shader学习笔记:投影矩阵及其应用

好久好久没有更新博客了,去年考完研以后直接摆了好几个月,刚刚开始学习又遇到了一些很受挫的事情,之后写了一大堆草稿也该好好总结一下之前做过的东西了,重新写博客当然就从一些理论上的东西开始写才行,这篇博客主要讲述投影矩阵的推导以及投影矩阵的一些简单需求。首先我们假设一个矩阵ProjectionMatrix,它的值都是未知数: 而我们假设相机空间的某一个点的坐标可以表示为: 从相机空间到投影空间的工序 对于相机空间的一个点而言,它要转移到投影空间去仅有...

MEIGAZAMU 4206

python怎样按某一列值拆分Excel表格

pd.ExcelWriter@python #用python按某一列拆分Excel工作表,将内容写入一个工作簿 本次以“按照表中的某一列,将一张表格拆分为多张表”的需求为例,简单介绍这个过程中用到的pd.ExcelWriter,及每一句的作用。 如上表《学生.xlsx》,假设有14万行28列,请按照学校名,拆分表格(不想用复制粘贴)。 ##代码及解释如下 import pandas as pd from time import time#用来计算时间,展示进度,减少焦虑 in_ws='学生.xlsx'#

learn_get的博客 6785

金蝶云星空核心数据表解析与高效关联查询指南

本文深入解析金蝶云星空核心数据表结构,提供高效关联查询的实战指南。文章详细介绍了基础资料、业务单据和财务模块的关键表及其关联逻辑,重点阐述了如何利用关联表(_LK表)进行跨单据溯源,并分享了编写高性能SQL的实用技巧与避坑建议,帮助开发者、实施顾问和数据分析师快速掌握数据查询方法,提升工作效率。

weixin_29254673的博客 526

iOS-矩阵与线性代数的关系____仿射变换

原文:http://www.ruanyifeng.com/blog/2015/09/matrix-multiplication.html 大多数人在高中,或者大学低年级,都上过一门课《线性代数》。这门课其实是教矩阵。 刚学的时候,还蛮简单的,矩阵加法就是相同位置的数字加一下。 矩阵减法也类似。 矩阵乘以一个常数,就是所有位置都乘以这个数。

like_sky_的博客 2125

element的el-cascader组件动态加载,以及报错处理问题

Blocked aria-hidden on an element because its descendant retained focus. The focus must not be hidden from assistive technology users. 报错处理

weixin_56527169的博客 1263

图解图像仿射变换

一. 原理: 文章参考自:https://www.cnblogs.com/liekkas0626/p/5238564.html 仿射变换(Affine Transformation 或 Affine Map)是一种二维坐标(x,y)到二维坐标(u,v)的线性变换,其数学表达式为: 仿射变换数学表达式 ↑ 对应齐次坐标矩阵 ↑ ...

Ibelievesunshine的博客 1025

FPGA远程升级避坑指南:用AXI Quad SPI IP读写N25Q128 Flash的完整流程

本文详细介绍了FPGA远程升级过程中使用AXI Quad SPI IP读写N25Q128 Flash的完整流程,包括IP核配置、Flash操作指令集、双镜像备份设计及生产级远程升级协议。通过最佳实践和避坑策略,帮助开发者实现可靠的镜像更新方案,提升系统可靠性和可维护性。

weixin_30542079的博客 673

人工智能——框架表示法

1975年美国明斯基在“A framework for representing knowledge”提出了框架理论。 1. 框架及框架的一般表示形式 框架:一种描述对象属性的数据结构。 框架的一般表示形式 <框架名> 槽名1: 侧面名1:值1,值2…,值p1 侧面名2:值1,值2…,值p2 侧面名2:值1,值2…,值pm1 槽名2: 侧面名...

weixin_33759269的博客 1642

UIKit和Core Graphics绘图——字符串,线条,矩形,渐变

概述 CoreGraphics也称为Quartz 2D 是UIKit下的主要绘图系统,频繁的用于绘制自定义视图。Core Graphics是高度集成于UIView和其他UIKit部分的。Core Graphics数据结构和函数可以通过前缀CG来识别。 视图可以通过子视图、图层或实现drawRect:方法来表现内容,如果说实现了drawRect:方法,那么最好就不要混用其他方法了,如图层和子...

jishublog 191

【声纳技术】声呐时间反转镜技术:从被动聚焦到主动空间复用

时间反转镜技术以其独特的物理机制,为水声通信与声呐探测提供了一条绕过传统自适应均衡器的新路径。被动时间反转利用接收端的空间分集实现脉冲压缩,结构简洁、计算高效;主动时间反转则通过发射端预编码,将多径能量引导至目标位置,为多用户下行链路的空间复用奠定了物理基础。从Kuperman等人在海洋中首次验证声学时间反转镜,到TR-MIMO声呐的湖试验证,再到VTRM-CRK多用户通信系统的海试成功,该技术已从理论概念逐步走向工程实用。

u012133341的博客 55

UIKit和Core Graphics绘图——构造路径,阴影以及渐变扩展

构造路径 通常,一系列点组合一起构成一个形状,而若干个形状组合在一起可以构造一个路径,路径可以规则也可以不规则,随意组合。通过Core Graphics很容易管理路径。 主要用到的函数或方法: CGPathCreateMutable()创建可变路径的方法 CGContextAddPath 将路径加入到上下文中 CGContextDrawPath绘制路径 CGPathRe...

jishublog 197

9篇2章2节:GBD 数据库的数据申请详解

无论您是初入公共卫生领域的学生、资深的科研工作者,还是政策决策者,GBD数据库都将成为您数据分析与决策支持中不可或缺的重要工具。

MD Code 2599

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C#中使用Graphics画图的Matrix变换错误分析(持续更新中)

Question1:     点击左眼,在图片上将左眼的标记画出来,然后拖动图片或则缩放图片,graphics会漂移,不能按照指定的方式进行变换     详细描述:         pictureBox中点击左眼,获得左眼位置;         调用CommonFunctions.MatrixTransform(m_matrix,e.Location)方法对坐标进行变换,获得该点在原图中的

sd396791336的专栏 2038

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

android getpixel函数,关于Graphics.Blit函数在android上的巨坑

五月 13.2019.0 Comment在XR相关的app中经常会使用Camera,一般AR app都会使用AR 引擎自带的ARCamera,缺点是启动比较慢,定制型比较差,无法选择分辨率等;其他一般需求则会使用unity自带的WebCamTexture,在android上它只支持取preview数据,无法实现高分辨率的拍照功能,(android上图像可从preview或photo中生成,但高的分...

weixin_39552768的博客 606

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

iOS绘图系统UIKit与Core Graphics

概述 iOS主要的绘图系统有UIKit,Core Graphics,Core Animation,Core Image,Open GL等,本片博文主要介绍UIKit与Core Graphics的绘图系统。 关于UIKit iOS中的原生控件以UI前缀开头的类名都是由UIKit绘制的。可以说我们进行开发打交道最多的就是UIKit这个框架。 关于Core Graphic...

weixin_30662109的博客 238

CAAnimation——基本动画,关键帧动画和贝塞尔路径

概述 在做对于图层的动画效果时,往往直接改变属性或者使用隐式动画是不能满足我们的需求的,所以我们就用到了显式动画,CAAnimation。它可以管理重复动画、准确的控制时间和步调,并且能设定图层过渡。当然,所有隐式动画能做到的,显式动画也都能做到。 来看下CAAnimation的继承体系 CABasicAnimation - (void)de

RannieR的技术博客 1万+

UIKit和Core Graphics绘图——绘制虚线,椭圆以及饼图

绘制虚线 虚线绘制主要调用CGContextSetLineDash函数。 这个函数有4个参数,除了一个是上下文外,phase为初始跳过几个点开始绘制,第三个参数为一个CGFloat数组,指定你绘制的样式,绘几个点跳几个点(下面为绘10个点,跳过5个),最后一个参数是上个参数数组元素的个数。 - (void)drawLineDash { CGContextRef con

RannieR的技术博客 3590

【iOS】用Layer创建一个三维模型以及拖动

关于CALayer的介绍以及基本属性,在这篇博客中有交代:CoreAnimation —— CALayer 这篇博客讲述简单的通过对layer的transform属性的设置一个CATransform3D来进行自定义三维图形,甚至后续的处理。 通常简单的仿射变换我们也是通过对其的transform属性进行设置。不过这里设置的是一个3D变换类。如果线性代数很好的话,那应该能够理解内部具体做

RannieR的技术博客 3575
上一篇: UIKit和Core Graphics绘图——绘制虚线,椭圆以及饼图
下一篇: UIKit封装的系统动画
RannieR
博客等级 码龄14年 180粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值