iOS教程:iOS开发进行图片缩放

  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为以下四种值的时候有什么样子的效果:

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

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

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

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

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

  四种测试结果是:

  原始图像拉伸,比例放大

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

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

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

  达内培训

  平铺模式

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

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

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

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

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

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

  结论就是:

  按比例平铺

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

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

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

  达内培训

  注: 以上的代码测试来自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可以进行下载。

  成都IT培训中心,专注于C++培训,3G培训,android培训,嵌入式培训等高端IT培训,顶级师资授课,真实项目实战,零首付,低押金,名企高薪就业

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31382915/viewspace-2127209/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31382915/viewspace-2127209/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值