Swift-技巧(一)缩放并填充图片
摘要
直接操作图片来实现它的缩放或者填充多余空间,首选
UIGraphicsBeginImageContext
函数来实现,它就相当于一个画布,你甚至可以用它来涂鸦。
最近有一个需求,就是将图片先等比例缩放到指定大小,然后将空余出来空间填充为黑色,返回指定大小的图片。
这种直接操作图片的需求,就要考虑使用 UIGraphicsBeginImageContext
函数实现。它可以理解为一个画布,我们只需要把图片放在画布的对应位置,把画布的多余地方全部涂成黑色就完成。
实现
先看代码,然后再分析:
func rescaleAndPading(_ image: UIImage, targetSize: CGSize) -> UIImage? {
let max = max(image.width, image.height)
let ratio = Float(targetSize.width) / Float(max)
let (newWidth, newHeight) = (
Int(Float(image.width) * ratio),
Int(Float(image.height) * ratio)
)
let (tarWidth, tarHeight) = (
Int(targetSize.width),
Int(targetSize.height)
)
let deltaW = tarWidth - newWidth
let deltaH = tarHeight - newHeight
let (y, x) = (
deltaH / 2,
deltaW / 2
)
// 创建绘图上下文环境
UIGraphicsBeginImageContext(targetSize)
let context = UIGraphicsGetCurrentContext()
// 黄色背景
context?.setFillColor(UIColor.yellow.cgColor)
context?.fill(CGRect(x: 0, y: 0, width: tarWidth, height: tarHeight))
image.draw(in: CGRect(x: x, y: y, width: newWidth, height: newHeight))
// 获取上下文里的内容,将视图写入到新的图像对象
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
看代码,总结出逻辑很简单,就是首先根据目标的 size 来计算出需要缩放的比例(按照最大边来处理),计算出图片在画布中的对应位置和缩放后的宽高。
最后就是重头戏,调用 UIGraphicsBeginImageContext
来绘画。这里要留意几个参数的设置:
UIGraphicsBeginImageContext(targetSize)
中的targetSize
是设置画布的大小。image.draw(in:)
是图片在画布中的 rect 。context
是画布的对象context?.setFillColor(_)
是设置画布的颜色,若不设置,默认为 black(黑色)context?.fill()
是设置画布填充的 rect。
重点
如果是前面留意逻辑时,会发现逻辑中是先放置图片,然后填充空余空间,但是代码中是先填充全部空间,然后再放置图片,这是为什么?
经过测试后发现,后绘制的区域会覆盖掉先前已经绘制的区域,所以代码中的处理就是防止填充区域覆盖图片区域。
另外
时间仓促,说的东西可能不全面,在你实现过程中遇到什么问题,评论区给我留言,我会尽快回复。
Swift-技巧(一)缩放并填充图片的更多相关文章
- vc++ mfc 里保存缩放的bmp图片 不失真
void CSaveView::OnFileSave() { BITMAP info;//原始图片 m_bitmap.GetBitmap(&info); CDC DC1; DC1.Create ...
- Android 手势检测实战 打造支持缩放平移的图片预览效果(下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39480503,本文出自:[张鸿洋的博客] 上一篇已经带大家实现了自由的放大缩小图 ...
- ImageMagick: DrawImage(Image*,DrawInfo*) 绘制填充图片时卡住的原因分析
今天傍晚在测试的时候无意发现有两个动画会卡住,正常情况下,20秒就完成的操作,突然卡住. CPU:95%+,经过30 - 50秒左右后,程序又能正常的向下执行,结果是对的. 这种情况不是每次都发生,有 ...
- Swift - UITableView展开缩放动画
Swift - UITableView展开缩放动画 效果 源码 https://github.com/YouXianMing/Swift-Animations // // HeaderViewTapA ...
- PHP的图片处理类(缩放、加图片水印和剪裁)
<!--test.php文件内容--> <?php //包含这个类image.class.php include "image.class.php"; $img ...
- Flex 绘制圆形并填充图片
注意:Ellipse 绘制椭圆,当width = height 时 则绘制圆形. BitmapFill:填充图片 <s:Group id="gpimgUser" width= ...
- css技术之用最高和最宽的限制“max-height和max-width”做图片同比例缩放,达到图片不变形目的,做出批量打印图片功能,页面打印“window.print()”
一.简介 他们是为流而生的,像width/height这种定死的砖头式布局,min-width/max-width就没有存在的意义 ,min-width/max-width一定是自适应布局或流体布局中 ...
- swift 点击button改变其内填充图片,达到选中的效果
先看下效果: 点击后: 实现:在页面拖一个button,然后在所在页面声明其变量和一个点击事件 声明: @IBOutlet weak var BtnZiDong: UIButton! 点击事件函数: ...
- iOS swift 启动页加载广告(图片广告+视频广告)
一般app在启动的时候都会有广告页,广告页用来加载自己的或者第三方的广告,广告的展示形式也多种多样,最近在看swift相关的东西,这里将提供支持加载图片广告和视频广告的解决方案 思路: 我们知道在加载 ...
随机推荐
- 重学VUE——vue 常用指令有哪些?
一.什么是指令? 在 vue 中,指令以 v- 开头,是一种特殊的自定义行间属性.指令属性的预期值是一个表达式,指令的职责就是:表达式的值改变时,相应地将某些行为应用到DOM上.只有v-for是一个类 ...
- Hystrix配置实战及feign超时配置失效
一.feign超时配置失效 最近项目上遇见feign超时配置总是失效.导致feign调用超过2s之后就会超时,会进行自动重试,重复调用两次服务,并且还是指定接口.这就更加奇怪.最后通过观察以及源码调试 ...
- ❤️【Android精进之路-03】创建第一个Android应用程序竟然如此简单❤️
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 本文会重点介绍如何创建第一个Android应用,以及如何使用Android Studio进行调试 干货满满,建议收藏,需要用到时常看看.小伙伴们如 ...
- 深入浅出WPF-10.Resource(资源)
资源 对象级资源:每个WPF的界面元素都有一个名为Resources的属性,这个属性继承自FrameworkElement类,其类型为ResourceDictionary,采用键值对的形式存储资源,当 ...
- Windows 10、Windows Server 定时任务(定时关机)
前言 在测试过程中,有些测试机每天都需要关机,一台台很麻烦,于是想起了Windows的任务计划程序,想着试一试,就将具体过程记录一下. 过程 Windows 搜索任务计划程序 创建任务(不要选错了) ...
- LeetCode352 将数据流变为多个不相交区间
LeetCode352 将数据流变为多个不相交区间 1 题目 给你一个由非负整数 a1, a2, ..., an 组成的数据流输入,请你将到目前为止看到的数字总结为不相交的区间列表. 实现 Summa ...
- NX9.0和NX10.0做自定义操作可以用的函数
NX9.0:LIBUFUNX.DLL int UF_OPER_ask_check_geom(void *,int *,unsigned int * *) int UF_OPER_ask_first_o ...
- vue 2.0源码学习笔记—new Vue ( Vue 初始化过程 )
new Vue(Vue 初始化) 一个vue实例化到底经历了什么?已下是博主自己的总结,不正确的地方请指出,谢谢~ 一.简述 从使用角度来看,挂载的顺序如下 1. $slots 2. $scopedS ...
- 整数划分为k份
题目 将整数n分成k份,且每份不能为空,任意两个方案不能相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法. 输入 ...
- 周末愉快--css画大熊猫
周末找了点轻松的话题,css画大熊猫. 先上效果图 欢迎竞猜大熊猫到底说了什么?? 再上源码 <!DOCTYPE html> <html lang="en"> ...