ios 中间 图片缩放_在 iOS 开发中如何优雅地进行图片缩放?

对于图片拉伸是移动开发中很常见的需求,在前一阵子做项目中需要做一个类似于QQ聊天气泡,这个气泡会根据文字的多少而变化,当时有了三种方案:

重写drawRect方法,使用贝赛尔曲线画一个气泡

用一个大图作为背景,管它怎么拉伸,肯定不会变形

使用图片,同时使用系统提供的API对图片进行局部拉伸

来分析一下这三种做法利弊:

第一种:劳民伤财,drawRect的使用带来离屏渲染,如果滑动聊天界面将使内存急剧增加,同时我也不会使用贝赛尔曲线,呜呜!

第二种:大图的话,显然所占空间会比较大,这样导致最后的安装包较大,尺寸不合适的图片加载也会对性能有所影响

第三种:显然这是一种划算的做法,对于怎么进行局部拉伸也是这篇博客的重点

代码实现图片缩放

至于 iOS 5 之类的方法,这里就不再谈了。在 iOS 6 的时候,系统为我们提供了这样一个方法

public func resizableImageWithCapInsets(capInsets: UIEdgeInsets, resizingMode: UIImageResizingMode) -> UIImage

对于拉伸的方式,有以下两种:

IUIImageResizingModeStretch:拉伸模式,通过拉伸UIEdgeInsets指定的矩形区域是我们要保护的区域,也就是不被拉伸的区域

UIImageResizingModeTile:平铺模式,通过重复显示UIEdgeInsets指定的矩形区域是要保护的区域,也就是不被重复显示的区域

拉伸模式

来做四个测试,假如我们的原始图像尺寸为60*128当我们设置capInsets为以下四种值的时候有什么样子的效果:

1:capInsets参数为UIEdgeInsetsMake(0, 0, 0, 0)

2:capInsets参数为UIEdgeInsetsMake(42, 0, 0, 0)

3:capInsets参数为UIEdgeInsetsMake(0, 20, 0, 0)

4:capInsets参数为UIEdgeInsetsMake(42, 20, 42, 20)

在一个180*384的窗口进行测试图像,对于实践的结果,可以在这个地址中看到。

四种测试结果是:

1: 原始图像拉伸,比例放大

2: 我们对图片上面的区域进行了保护,其他区域进行了拉伸,保护区域在Y轴保持了原比例,但是X轴方向进行了拉伸

3: 我们对图片的左侧区域进行了保护,其他区域进行了拉伸,保护区域在X轴保持了原比例,但是在Y轴方向进行了拉伸

4: 我们对除了中心区域的位置进行了保护,中心区域进行了拉伸,四个角进行了双层保护,其余被保护区域在X、Y轴的拉伸与第2、3种情况下相同,效果图如下:

效果图4

平铺模式

与上面的场景相同,只不过不再拉伸,改为平铺的方式,来尝试以下四种情况:

1:capInsets参数为UIEdgeInsetsMake(0, 0, 0, 0)

2:capInsets参数为UIEdgeInsetsMake(42, 0, 0, 0)

3:capInsets参数为UIEdgeInsetsMake(0, 20, 0, 0)

4:capInsets参数为UIEdgeInsetsMake(42, 20, 42, 20)

在一个180*384的窗口进行测试图像,对于实践的结果,可以在这个地址中看到。

结论就是:

1: 按比例平铺

2: 我们对图片上面的区域进行了保护,其他区域按比例平铺,保护区域在Y轴保持了原比例,但是X轴方向进行了平铺填充

3: 我们对图片的左侧区域进行了保护,其他区域按比例平铺,保护区域在X轴保持了原比例,但是在Y轴方向进行了平铺填充

4: 我们对除了中心区域的位置进行了保护,中心区域按比例平铺,四个角进行了双层保护,其余被保护区域在X、Y轴的平铺与第2、3种情况下相同,效果图如下:

效果5

注: 以上的代码测试来自SketchK七爷

Image Slicing 可视化缩放

何为Image Slicing呢?,其实就相当于一个可视化的resizableImageWithCapInsets,可以用于指定在图片缩放时用来填充的像素。我们可以在Xcode的Assets.xcassets目录中选择要slicing的图片,点击图片界面右下方的Show Slicing按钮,在想要设定切片的图片上点击Start Slicing,将出现左中右(或者上中下)三条可以拖动的指示线,通过拖动它们来设定实际的缩放范围。

我们刚才说,他就是可视化的resizableImageWithCapInsets,那么它的capInsets在哪里呢?打开图片对应的.json文件,代码如下:

{

"images" : [

{

"resizing" : {

"mode" : "9-part",

"center" : {

"mode" : "tile",

"width" : 42,

"height" : 92

},

"cap-insets" : {

"bottom" : 0,

"top" : 95,

"right" : 41,

"left" : 0

}

},

从文件可以看出来top、left、bottom、right对应的就是上左下右的指示线,看到mode为tile,就知道Image Slicing默认为平铺缩放,对于width与Height是做什么的呢?Width代表的是左侧线(或者上方线)和中间线之间的区域,Height代表的是上侧线和中间线之间的区域。

看一下刚才图片运行起来的效果

测试结果

很神奇呀!灰色区域都会被隐藏,我们发现灰色区域位于右侧线与中间线或者下方线与中间线之间。来分析一下各个数字的平铺:

3位与右侧线的右侧,不会发生变化

1位与左侧线与中间线之间,Y轴保持比例不变,X轴平铺

6位与右侧线的右侧,但是也位与上方线与中间线之间,所以会保持X轴不变,Y轴平铺

4位与左侧线与中间线之间,同时也位与上方线与中间线之间,会填充其他所有的空余区域。

好绕啊!还是可视化比较简单,只要手动调试一下,就可以比较直观的看到效果,希望可以帮到你,Demo可以进行下载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305416.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker安装jenkins并用docker部署net

1. 部署jenkins1.1 创建jenkins的工作目录//创建工作目录 mkdir /var/jenkins_home //赋予权限 chown -R 1000 /var/jenkins_home1.2 通过docker部署1.2.1 拉取镜像docker pull jenkinsci/blueocean1.2.2 生成容器#注意:切换一行执行命令 docker run -u root -d…

页面验证

例子:仅供测试 注册帐号 密码 重新输入密码 身份证号码 银行存款 拥有几家世界500强企业 出生日期 下辈子出生日期 对输入内容进行验证 //这是把JS文件全放在了html里面 可以把里面的JS内容分出2个JS来 另外 身份证的验证 在另一文章里面//http://www.cnb…

python导入文件列行_python读写csv文件并增加行列的实例代码

python读写csv文件并增加行列,具体代码如下所示: # -*- coding: utf-8 -*- """ Created on Thu Aug 17 11:28:17 2017 author: Shawn Yuen """ import csv d list(range(38685)) with open(./kinetics_test.csv) as f1: …

ie插件获取dom_读书笔记《DOM编程艺术》DOM

DOM的理解1.1 D:当创建了一个网页并把它加载到Web浏览器中时,DOM就生成了,它将我们编写的网页文档转换成一个文档对象。1.2 O:“对象”是一种自足的数据集合,相关联的变量称为这个对象的属性,只能通过这个对…

针对Fluent-Bit采集容器日志的补充

hello,之前我写过《一套标准的ASP.NET Core容器化应用日志收集分析方案》,在公司团队、微信公众号、Github上反映良好。其中配置Fluent-bit使用Forward协议收集容器日志,需要在Docker-Compose App配置Loging DriverFluentd实践中,…

Oracle结构设计技巧(访问数据库象访问内存一样 快)

尽管Oracle系统本身已经提供了若干种对系统性能进行调节的技术,但是,假如数据库设计本身就有问题特别是在结构上设计得尤其糟糕,那你纵有天大的本事又能奈何?因此,Oracle数据库的设计者完全有必要弄清楚(从项目着手设计开始)该如…

js template换行_JavaScript字符串换行符?

小编典典我刚刚使用了一些愚蠢的JavaScript测试了一些浏览器:function log_newline(msg, test_value) {if (!test_value) {test_value document.getElementById(test).value;}console.log(msg : (test_value.match(/\r/) ? CR : ) (test_value.match(/\n/) …

在每个运行中运行多个查询_在Kubernetes中运行OpenEBS

什么是OpenEBS?现在,OpenEBS是kubernetes下与容器原生和容器附加存储类型相关通用的领先开源项目之一。 通过为每个工作负载指定专用的存储控制器,OpenEBS遵循容器附加存储或CAS的脚步。 为了向用户提供更多功能,OpenEBS具有精细的…

如何在 C# 8 中使用默认接口方法

C# 8 中新增了一个非常有趣的特性,叫做 默认接口方法 (又称虚拟扩展方法),这篇文章将会讨论 C# 8 中的默认接口方法以及如何使用。在 C# 8 之前,接口不能包含方法定义,只能在接口中定义方法签名,还有一个就是接口的成员…

.Net下二进制形式的文件(图片)的存储与读取 [ZT]

.Net下图片的常见存储与读取凡是有以下几种:存储图片:以二进制的形式存储图片时,要把数据库中的字段设置为Image数据类型(SQL Server),存储的数据是Byte[].1.参数是图片路径:返回Byte[]类型: publicbyte[] GetPictureData(stringimagepath) { /**…

c++tcp接收文件缓存多大合适_网易面经:深剖TCP协议的流量控制和拥塞控制,你懂了吗?...

1.自我介绍项目2.RPC框架和普通http有什么区别和优势? 基于Tcp封装还是http封装的3.rpc是长连接吗?如果要传输一个特别大的文件 底层还是基于流吗? Nio是一个什么IO模型?4.github了的watch star fork5.异常和error的区别&#xff…

cmd看excel有多少个子表_Excel中多个工作簿(工作表)如何合并为1个工作簿(工作表)?...

看到Excel多表合并,其实常见的有2种场景场景一:多个Excel文件需要合并为1个Excel文件(多个工作簿合并为1个工作簿)场景二:1个Excel文件种有多个工作表,需要合并为1个工作表首先来看下,场景一(多个Excel文件合并为1个文…

如何在 ASP.Net Core 中使用 LoggerMessage

ASP.NET Core 是一个开源的、跨平台的、轻量级模块化框架,可用于构建高性能、可伸缩的web应用程序,你也许不知道 ASP.NET Core 中有一个藏得很深,而且非常强大的特性,那就是 LoggerMessage,与内建的 Logger 相比&#…

希望不要T我~~哈哈...

不在学校,上网不便,账号未登入时间期限若到~还望别T,呵呵....我喜欢这里~多谢老大!!!!技术成就梦想!!!!!转载于:https://blog.51cto.c…

模拟器显示空白图片_Kawaks街机模拟器,还是小时候的味道!

APP菜园打造属于我们自己的APP帝国1.打开支付宝app,首页搜索 “8221050” 然后点击快捷功能,天天领红包。2.软件领取流程:1.认真阅读下软件介绍;2.找到图片下方的“获取链接”复制;3.打开手机上的浏览器粘贴链接搜索(…

7段均衡器最佳参数_介绍一下十段均衡器的设置和参数

介绍一下十段均衡器的设置和参数【第一章.EQ的基本定义】EQ是Equalizer的缩写,大陆称为均衡器,港台称为等化器。作用是调整各频段信号的增益值。10段均衡器表示有10个可调节节点。节点越多,便可以调节出更精确的曲线,同时难度更大…

ASP.NET Core 查看应用状态和统计

在日常开发中,我们需要关注 .NET 应用的资源使用情况,方便排查问题和扩容。通过 Ajax 请求获取统计信息,展示成图表,如下图:CLRStats 插件,一个统计 .NET 应用资源使用情况的插件,包含&#xff…

circle后面是什么意思 python_Ape circle Python操作-第2-01章-列表操作,小猿圈,作业

# 写代码,有如下列表,按照要求实现每一个功能li [alex, eric, rain]# 计算列表长度并输出length len(li)print(f1-li的长度是:{length})# 列表中追加元素“seven”,并输出添加后的列表li.append(seven)print(2-追加元素后的li是…

python插入排序_python 插入排序,选择排序

插入排序: def insert_sort(lst): for i in range(1,len(lst)): xlst[i] #x是一个临时变量,表示当前轮到的数字 ji #临时变量 j ,为后续的排序提供方便 while j>0 and lst[j-1]>x: #当j 小于0,说明已经数字比较到了第一位,说…

【Vscode】调试DotNet Core代码

Visual Studio作为宇宙第一的IDE,开发调试.net core app,无一能出其右,我们还需要去了解Visual Studio Code吗?答案是肯定。杀鸡焉用牛刀:就一个hello world的Console App,还需要打开Visual Studio吗&#…