ios画图开发,画图ios

先说下背景,项目里需要绘制音乐和视频的波形图,由于产品上的设计,波形图的长度基本都可以达到屏幕长度的几十倍。并且图形并不是折线图而是柱状图,还要跟随音乐音量变化,所以图形肯定是无法直接拉伸挤压的,所以当时为了性能和内存方面的考虑,尝试了很多方案。

UIImage:

使用UIGraphicsGetImageFromCurrentImageContext方法将绘制的图形生成图片。

这种方式适用于图片不长并且图片不变的情况。

优点:可在子线程绘制,方便缓存。

缺点:占用内存大,绘制不够高效。

PS:注意此方法有个隐患,因为系统会对设置给UIImageView的图片进行缓存,如果一直调用,即使是完全相同的图片,也会产生内存占用。

示例:

CALayer:

layer的基类,重写drawInContext方法进行进行绘制。

优点:量级轻(实在想不到优点)。

缺点:主线程绘制,绘制不够高效。

CATiledLayer:

layer的子类,专门用于绘制大图的方案,系统底层已进行过优化,子线程绘制,并且不会绘制屏幕外的内容。可将大图分割成若干个更小的单元进行绘制,可通过tileSize设置单个绘制单元的大小。

优点:子线程绘制,性能极好。

缺点:绘制较缓慢,能控制的变量较少。

与CALayer用法一致,可设置额外属性

YYAsyncLayer:

知名的异步绘制的第三方控件,是CALayer的子类,内部创建了队列进行管理,能将绘制的操作转换为异步操作,并且引入了RunLoop机制进行管理,只在RunLoop空闲的时候才进行刷新操作。

优点:子线程绘制,性能很高,不阻塞用户操作。

缺点:因为只在空闲时执行,图形刷新不及时。

CAShapeLayer+UIBezierPath:

layer的子类,CAshapeLayer能在GPU上渲染,性能很高,绘制速度很快,而且曲线绘制既能选择在主线程绘制,也能选择在子线程绘制。

优点:无论子线程还是主线程都可绘制,且性能很高。

缺点:曲线路径量大的话,还是影响性能。

最终还是选择了CAShapeLayer+UIBezierPath方案,但是因为音波数据量特别大(每秒40个音频数据),导致多个图形频繁刷新的时候发热十分严重,而且也出现了卡顿的情况。

为了优化,最后又加入了分屏绘制的逻辑:

蓝色区域表示屏幕区域,红色表示绘制的区域,黑色线条表示临界边,

整体逻辑:

0、转换坐标为窗体坐标。

1、判断是否有上次绘制的位置,没有则直接绘制。

2、绘制完成后保存当前位置为绘制位置,计算出黑色临临界区域。

3、滑动视图的过程中判断滑动位置是否超出了黑线区域,超出则重新进行绘制。

4、重复2、3。

IOS中绘图的三种方式

定义:CoreGraphics是一套基于C语言的API框架.使用Quartz绘图引擎.

基本概念:图形上下文CGContentRef

考虑到效率方面上的问题,通常我们不会创建。直接获取

通过

获取图形上下文

默认情况下返回值为nil.在调用这个方法之前调用

方法,视图将创建一个绘图上下文,并且设置为thecurrentcontext(当前上下文,也就是绘图图层栈栈顶的上下文).这个上下文context只会在drawRect:方法中存在.一旦调用此方法调用完成,这个上下文context将会被销毁.

如果你不是使用UIView去绘制,这时候你需要手动往栈顶入一个。使用下面的方法

这个方法可以在app中的任何线程中调用.

CGPath也就是路径信息。CGPath可以确定绘制边框的各种属性(颜色粗细拐点),边框内部区域的绘图属性,绘制边框还是绘制边框内部

创建路径

在绘制路径时

需要指定绘制路径时模式

CGAffineTransform是一个结构体

系统已经帮我封装好了一下方法

用于绘制虚线

由于项目需要用到k线图,但是在网上搜索了很多都不太理想,大概看了一下,理了一下思路决定自己写。这些都是使用最简单的画图写出来的,并没有那么多高深的东西。

k线图简单来说有三点:

使用以下触摸方法来控制位移

首先要计算出手指移动的距离、方向,根据距离来确定移动了多少个元素,使用代理方法LSSKLineViewDelegate在vc里进行数据的操作

终于找到之前的项目了,由于是4年前的项目,整体比较乱,也有一些bug,暂时供参考思路,稍后可能重构加注释之类的吧

DEMO

这种绘制是根据图片的像素比例等比例进行绘制的,在选择图片和创建展示图片的imageView时,注意查看尺寸注:绘图时使用[UIScreenmainScreen].scale可以是图片更清晰UIGraphicsBeginImageContextWithOptions(image.size,NO,[UIScreenmainScreen].scale);//这样就不模糊了

//图片上添加文字详细版

-(UIImage*)text:(NSString*)textaddToView:(UIImage*)image{

//设置字体样式

UIFont*font=[UIFontfontWithName:@"Arial-BoldItalicMT"size:100];

NSMutableAttributedString*str=[[NSMutableAttributedStringalloc]initWithString:text];

[straddAttribute:NSForegroundColorAttributeNamevalue:[UIColorblueColor]range:NSMakeRange(0,1)];

[straddAttribute:NSFontAttributeNamevalue:[UIFontsystemFontOfSize:100]range:NSMakeRange(0,text.length)];

//CGSizetextSize=[textsizeWithAttributes:dict];

CGSizetextSize=[strsize];

//绘制上下文

UIGraphicsBeginImageContext(image.size);

//UIGraphicsBeginImageContextWithOptions(image.size,NO,[UIScreenmainScreen].scale);//这样就不模糊了

[imagedrawInRect:CGRectMake(0,0,image.size.width,image.size.height)];

//intborder=10;

CGRectre={CGPointMake((image.size.width-textSize.width)/2,200),textSize};

//CGRectrect=CGRectMake(0,0,image.size.width,500);

//此方法必须写在上下文才生效

[strdrawInRect:re];

UIImage*newImage=UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

returnnewImage;

}

//修改图片尺寸

-(UIImage*)imageWithImageSimple:(UIImage*)imagescaledToSize:(CGSize)newSize

{

//Createagraphicsimagecontext

UIGraphicsBeginImageContext(newSize);//这样压缩的图片展示出来会很模糊

//Telltheoldimagetodrawinthisnewcontext,withthedesired

//newsize

[imagedrawInRect:CGRectMake(0,0,newSize.width,newSize.height)];

//Getthenewimagefromthecontext

//Endthecontext

//Returnthenewimage.

//圆角

-(UIImage*)getRadioImaeg:(NSString*)imageName1{

UIImage*image1=[UIImageimageNamed:imageName1];

UIGraphicsBeginImageContextWithOptions(image1.size,0,0);

CGContextRefctx=UIGraphicsGetCurrentContext();

CGRectrect=CGRectMake(00,0,image1.size.width,image1.size.width);

CGContextAddEllipseInRect(ctx,rect);

CGContextClip(ctx);

[image1drawInRect:rect];

UIImage*img=UIGraphicsGetImageFromCurrentImageContext();

returnimg;

//图片叠加

-(UIImage*)addImage:(NSString*)imageName1withImage:(NSString*)imageName2{

UIImage*image2=[selfgetRadioImaeg:@"333"];

UIGraphicsBeginImageContext(image1.size);

[image1drawInRect:CGRectMake(0,0,image1.size.width,image1.size.height)];

[image2drawInRect:CGRectMake((image1.size.width-image2.size.width)/2,(image1.size.height-image2.size.height)/2,image2.size.width,image2.size.height)];

UIImage*resultingImage=UIGraphicsGetImageFromCurrentImageContext();

returnresultingImage;

即UIBezierPath在drawRect中的使用,在实际中,我们多使用UIBezierPath来自定义视图。

效果

UIBezierPath与CAShapeLayer的结合,是我们开发中最常见的,功能很强大。

CAShapeLayer与UIBezierPath的关系:

CAShapeLayer中shape代表形状的意思,所以需要形状才能生效

贝塞尔曲线可以创建基于矢量的路径,而UIBezierPath类是对CGPathRef的封装

贝塞尔曲线给CAShapeLayer提供路径,CAShapeLayer在提供的路径中进行渲染。路径会闭环,所以绘制出了Shape

用于CAShapeLayer的贝塞尔曲线作为path,其path是一个首尾相接的闭环的曲线,即使该贝塞尔曲线不是一个闭环的曲线

例如设置圆角:

自定义视图

位图(Bitmap),又称点阵图,是使用像素阵列来表示的图像。位图的像素都分配有特定的位置和颜色值。每个像素的颜色信息由RGB组合或者灰度值表示。根据位深度可将位图分为1、4、8、16、24及32位图像等。每个像素使用的信息位数越多,可用的颜色就越多,颜色表现就越逼真,相应的数据量越大。例如,位深度为1的像素位图只有两个可能的值(黑色和白色),所以又称为二值位图。位深度为8的图像有2(即256)个可能的值。位深度为8的灰度模式图像有256个可能的灰色值。RGB图像由三个颜色通道组成。8位通道的RGB图像中的每个通道有256个可能的值,这意味着该图像有1600万个以上可能的颜色值。有时将带有8位通道(bpc)的RGB图像称作24位图像。通常将使用24位RGB组合数据位表示的的位图称为真彩色位图。

由上面的描述可知,我们可以将bitmap理解为一个点阵图或者是一个数组,其中的每个元素都是一个像素信息,假设对于一个32位RGBA图像来说,则每个元素包含着三个颜色组件(R,G,B)和一个Alpha组件,每一个组件占8位(8bite=1byte=32/4)。这些像素集合起来就可以表示出一张图片。

Bitmap的数据由CGImageRef封装。由以下几个函数可以创建CGImageRef对象。

如果要使用bitmap对图片进行各种处理,则需要先创建位图上下文。先看一下初始化方法的一个例子。

它是高级别的图形接口,它的API都是基于Objective-C的。它能够访问绘图、动画、字体、图片等内容。UIkit中坐标系的原点在左上角,而Quartz2D的坐标系的原点在左下角。

它是一个二维(二维即平面)绘图引擎(封装的一套用于绘图的函数库),同时支持iOS和Mac系统(可以跨平台开发)。API(应用程序界面)是纯C语言的,来自于CoreGraphics框架,其数据类型和函数基本都以CG作为前缀。

它是用来设置当前的layer在父控件当中的位置的,默认以父控件左上角的(0.0)点为它的坐标原点。

它决点CALayer身上哪一个点会在position属性所指的位置。anchorPoint是以当前的layer左上角为原点(0.0),取值范围是0~1,默认在中间也就是(0.5,0.5)的位置。

调用会重新绘制整个视图,此时系统会自动帮你调用drawRect方法。

重新绘制视图的部分区域。最好不要绘制视图的全部,以减少绘制带来开销。

标记为需要重新布局,会异步调用layoutIfNeeded刷新布局。不会立即刷新,而是在下一轮runloop结束前刷新,对于这一轮runloop之内的所有布局和UI上的更新只会刷新一次。

修改了当前视图的size、设置了不同的frame或者调用了addsubViews,都是会被系统自动给你标记为setNeedsLayout的,然后调用layoutSubviews进行重新布局。

如果发现有需要刷新的标记,立即调用layoutSubviews进行布局。如果想在当前runloop中立即刷新,调用顺序应该是:

将继承于UIView的子类进行布局更新来刷新视图。如果某个视图自身的bounds或者子视图的bounds发生改变,那么这个方法会在当前runloop结束的时候被调用。为什么不是立即调用呢?因为渲染毕竟比较消耗性能,特别是视图层级复杂的时候。在这种机制下任何UI控件布局上的变动不会立即生效,而是每次间隔一个周期,所有UI控件在布局上的变动统一生效再在视图上一起更新,苹果通过这种高性能的机制保障了视图渲染的流畅性。

runloop的observer回调=CoreAnimation渲染引擎一次事务的提交=CoreAnimation递归查询图层是否有布局上的更新=CALayerlayoutSublayers=UIViewlayoutSubviews。从这里调用的流程也可以看出UIView其实就是相当于CALayer的代理。

用四种方法的目的是说明绘制图形有很多种方法。绘制图形实际上就是设置path,底层的用的都是CGMutablePathRef。使用贝塞尔曲线画图的好处在于,每一个贝塞尔底层都有一个图形上下文,如果是用CGContextMoveToPoint画图,实际上就是一个图形上下文,不好去控制,所以建议多条线可以使用贝塞尔曲线。不推荐使用第4种方式,两个东西杂糅,不太好。

实现图片的水印、裁剪、截屏、压缩等效果,这里以压缩图片为例,其余步骤类似。

CAShapeLayer是CALayer的子类,多用于处理复杂的边缘涂层和边缘动画,虽然该对象也有frame属性,但其

THE END
1.办公软件绘图指南:轻松创建程序流程图在现代办公环境中,流程图是一种非常有用的工具,它可以帮助我们可视化地展示程序的流程、决策路径以及各种操作步骤。虽然专业的绘图软件如Visio提供了强大的流程图绘制功能,但许多用户更倾向于使用他们日常接触的办公软件来完成这项任务,比如Microsoft Office套件中的PowerPoint或Word。下面,我将介绍如何使用这些办公软件创建...https://www.kdocs.cn/article/BB9514D8B1.html
2.股票画图工具point理想股票技术论坛用于股票画图的工具,具备多种图表类型绘制功能,包括point图表,操作简单便捷,适合股票分析和交易决策。 ,理想股票技术论坛https://www.55188.com/tag-08730517.html
3.R画图学习13.3散点图曼哈顿图下面我们就可以用ggplot来画图了。 ggplot(gwasResults, aes(SNP1, -log10(P)))+ geom_point(aes(color = CHR), show.legend = FALSE) + scale_color_manual(values = rainbow(22)) + geom_hline(yintercept = c(-log10(1e-05), -log10(5e-08)), color = c('blue', 'red'), size = 0.3...https://www.jianshu.com/p/41effb13124c
4.计算机辅助设计绘图员:CAD中级考试考试题库(考试必看)104、单项选择题 用VPOINT命令,输入视点坐标值(-1,-1,1)后,结果同三维视图()。 A.东南等轴测视图 B.西南等轴测视图 C.东北等轴测视图 D.西北等轴测视图 点击查看答案 105、单项选择题 画切割体的正等轴测图,可先画其基本体的正等轴测图,然后用()逐一切割基本体。 A、剖切平面 B、断面 C、辅...http://www.91exam.org/exam/87-4042/4042552.html
1.在演示文稿期间在幻灯片上绘图显示演示文稿时,可以使用数字笔在屏幕上绘制,以强调点或显示连接。 (有关在创建演示文稿时使用墨迹绘图的详细信息,请切换到使用ink 进行绘图和书写一文。) 较新的 Windows 版本较新的 Mac 版本Web 打开触控笔并在幻灯片放映中绘图 在“幻灯片放映”选项卡上,确保打开“使用演示者视图”。 https://support.office.com/zh-cn/article/%E4%BB%A5%E5%85%B6%E4%BB%96%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E4%BF%9D%E5%AD%98%E6%BC%94%E7%A4%BA%E6%96%87%E7%A8%BF-80a78a11-cb5d-4dfc-a1ad-a26e877da770
2.PPT制作小技巧:如何绘制线段图(ppt如何线段图)在PPT中制作线段图,可以帮助我们直观地展示数据趋势和比较。以下是绘制线段图的具体步骤: 首先,打开PowerPoint,新建一个幻灯片,然后点击插入标签,选择图表。 在图表库中,你会看到多种图表类型。因为我们要制作线段图,所以选择“折线图”或者“线形图”类别下的任意一个图表样式。 http://ppt666.zaixianjisuan.com/question/pptzhi-zuo-xiao-ji-qiao-ru-he-hui-zhi-xian-duan-tu.html
3.gnuplot下画图以及设置点线基础gnuplot中点线怎么写gnuplot下画图以及设置点、线基础 在NS2的gnuplot绘图程序中对线型(linetype)、点型(pointtype)、线条宽度(linewidth)、点大小(pointsize)、图样(style)都有相应的设定值,具体设置如下: (1)线型(linetype )。在此类型中主要设置线条的颜色,具体对应如下:https://blog.csdn.net/lwb102063/article/details/50782696/
4.画图神器ggplot2之一:geompoint腾讯云开发者社区p <- ggplot(mtcars, aes(wt, mpg)) p + geom_point() # Add aesthetic mappings p + geom_point(aes(colour = qsec)) p + geom_point(aes(alpha = qsec)) p + geom_point(aes(colour = factor(cyl))) p + geom_point(aes(shape = factor(cyl))) p + geom_point(aes(size = qsec)) ...https://cloud.tencent.com/developer/article/1411766
5.designpoint是什么意思designpoint怎么翻译及发音two design point aircraft 双设计点飞机 by design adv.故意地 design to 打算,旨在 design for v. 设计来作 at the point of adv.靠近,接近 f the sword adv.在暴力威胁下 相似单词 design v. [T] 1.设计;构思;绘制 2.打算将...用作 3.计划;谋划 v. [I] 1.设计,画图样;当设计师 2...https://www.hujiang.com/ciku/design_point/
6.CAD中point怎么用point在CAD中 CAD中point CAD中point是什么 CAD point CAD命令point CAD命令point是什么 Word point怎么生成 Word怎么bullet point 为您找到1500条“CAD中point怎么用”相关问题CAD中怎么用图层来画图? 共2条回答 > Y: 模型上看是叠在一起的——我知道是用二次开发的软件画的,那种软件可以根据制图自动调整...https://www.3d66.com/answers_relation/relation_365051_23.html
7.考研英语作文怎么准备图画作文这样复习比较好!注:结尾段的结论只要合理且客观就可以接受,可以根据生活常理揣摩画图人的初衷,是为了告诉我们什么道理,这就是阅卷老师期待的结论。如果题目里包含两个或者两个以上的图画,一般结尾的结论就是通过图画之间的比较得出来的。 下面的攻略我是从 写作160篇 中总结出来的,从单词到句子到文章,慢慢教你写作文,最后用三步作...https://m.douban.com/note/689402435/
8.30ggplot作图入门R语言教程在前面的一个例图中, 在ggplot()函数中将color和fill映射到了continent变量, 使得不仅散点颜色代表了不同大洲, 还使得每个大洲单独拟合了曲线。 如果希望所有大洲拟合同一条曲线怎么办? 在必要时, 可以在geom_xxx()函数中用mapping = aes(<...>)单独指定变量映射。 例如, 下面的程序在geom_point()中将不同大...http://www.360doc.com/content/23/0303/13/1070271450_1070271450.shtml
9.北京大学R语言教程(李东风)第27章:ggplot作图入门geom_blank()不画图,可以按映射的变量设定坐标范围; geom_point()每个观测为一个散点; geom_hline(), geom_vline(), geom_abline()画线; geom_path()每个观测提供(x,y)坐标,在相邻观测之间连线; geom_ribbon()需要x和ymin, ymax维,在从小到大排序后的相邻观测之间连接阴影区域; geom_segment()需要x...https://www.9crx.com/79224.html
10.Visio2021专业版32/64位永久激活版下载百度云网盘安装包达牛...1、Visio画图文字不能修改怎么办? 答:1、首先查看选中的形状是否成组,即鼠标点一下结果好几个形状都被选中了。(或者选中后看右键菜单中的“形状-撤销组合”指令是否是答应操作的状况) 2、假如形状成组了,那么 (1)假如你想为选中的整个成组目标设置文字的话,键入F2即可录入文字。 https://www.dnbbn.com/2383.html
11.第七讲数据绘图TODO遇到困难的同学是吧非常好我们会今天会有一个小作业这个小作业就是大家敞开心扉的画图然后画什么样的图都行然后我们先请陈嘉杰同学来总结一下昨天的特别的小作业了这是昨天的那道题对吧大家做的感觉怎么样然后给大家讲讲数据是怎么出的数据首先先搜了这么一张然后我在上面取了一些点然后就变成了大家拿到的数据所以...https://hep.tsinghua.edu.cn/~orv/teaching/physics-data/l6.html
12.R语言数据可视化包ggplot2画图之散点图的基本画法R语言1 2 3 ggplot(data, aes(x=x, y=y)) + geom_point()+ theme_test() 总结 到此这篇关于R语言数据可视化包ggplot2画图之散点图的基本画法的文章就介绍到这了,更多相关R语言ggplot2散点图画法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 您可能感兴趣的文章: R语...https://www.jb51.net/article/266658.htm
13.CAXA制造工程师教程CAXACAM制造工程师CAM/加工制造2. caxa画图快捷键 尺寸标注快捷按钮在右边工具栏中可以找到,也可以拖动其按钮到左边 3. caxa制造工程师操作界面 电子图版的标注还是很智能化的,你可以点击标注图标,也可以使用快捷键D 然后你选择想要标注的图形: 如果是圆,选择后CAXA会自动出现圆的相关标注选项,如半径、弧长、圆心角、直径、圆周直径等; ...https://www.ruanfujia.com/10649966/