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相关的东西,这里将提供支持加载图片广告和视频广告的解决方案 思路: 我们知道在加载 ...
随机推荐
- 【C++】特殊字符“\0”,以及NULL相关
我们都知道,'\0'是字符串的结束标记.因此,执行这段代码: #include<bits/stdc++.h> using namespace std; int main(){ cout&l ...
- 哪5种IO模型?什么是select/poll/epoll?同步异步阻塞非阻塞有啥区别?全在这讲明白了!
系统中有哪5种IO模型?什么是 select/poll/epoll?同步异步阻塞非阻塞有啥区别? 本文地址http://yangjianyong.cn/?p=84转载无需经过作者本人授权 先解开第一个 ...
- Java基础系列(8)- 数据类型
数据类型 强类型语言 要求变量的使用合乎规定,所有的变量都必须先定义才能使用.Java是强类型语言. 弱类型语言 变量定义比较随意,比如"12"+3,可以是int型123,也可以是 ...
- gin 源码阅读(1) - gin 与 net/http 的关系
gin 是目前 Go 里面使用最广泛的框架之一了,弄清楚 gin 框架的原理,有助于我们更好的使用 gin. 这个系列 gin 源码阅读会逐步讲明白 gin 的原理. gin 概览 想弄清楚 gin, ...
- yapi 事件创建、修改等接口事件监听
使用的yapi作为接口文档平台.出于业务需求需要对接口创建.修改.删除等事件进行监听. yapi已经实现并预留了这个口子,但是没有找到实现的文档.这里进行简单描述下使用的方式. 一.yapi创建.修改 ...
- java中的swing设计界面时怎么加上背景图片。而不覆盖其他控件?
通过以下方式设置下背景就可以了: import java.awt.Container; import javax.swing.ImageIcon; import javax.swing.JFrame; ...
- phpQuery
以下资料均来自官方文档,官方文档地址:https://code.google.com/archive/p/phpquery/wikis 基础 示例 phpQuery::newDocumentFileX ...
- 最小化安装centos7心得
在虚拟机里最小化安装了centos7,只有字符界面,发现网卡不通,解决方法: 调整网卡配置文件: cd /etc/sysconfig/network-scripts/ 有两个ifcfg文件,一个ifc ...
- NOI.AC#2139-选择【斜率优化dp,树状数组】
正题 题目链接:http://noi.ac/problem/2139 题目大意 给出\(n\)个数字的序列\(a_i\).然后选出一个不降子序列最大化子序列的\(a_i\)和减去没有任何一个数被选中的 ...
- 通用脱敏工具类和判断URL
通用脱敏工具类 public class DesensitizationUtil { private static final int SIZE = 6; private static final S ...