ios开发Swift实现图片(UIImage)的水平翻转(镜像),垂直翻转

有时候我们需要对图片(UIImage)进行垂直翻转(上下翻转),或者水平翻转处理(即镜像处理)。如下图:

   开发Swift实现图片(UIImage)的水平翻转(镜像),垂直翻转-swift uiimageview">      

通常有两种方式。

方法一,更改图片方向

1,实现原理

UIImage 有个属性叫 imageOrientation,它是一个枚举变量。主要作用是控制image的绘制方向,共有以下8种方向:

enum UIImageOrientation : Int {
    case Up //0:默认方向
    case Down //1:180°旋转
    case Left //2:逆时针旋转90°
    case Right //3:顺时针旋转90°
    case UpMirrored //4:水平翻转
    case DownMirrored //5:水平翻转
    case LeftMirrored //6:垂直翻转
    case RightMirrored //7:垂直翻转
}
那么我们只需要通过改变 UIImage 的 orientation,这样图片显示出来的时候,图片容器会根据新的这个 orientation 属性进行显示。从而实现水平翻转或者垂直翻转。

2,水平翻转(即左右镜像)

//原始图片
let srcImage = UIImage(named: "hangge.png")!
 
//翻转图片的方向
let flipImageOrientation = (srcImage.imageOrientation.rawValue + 4) % 8
//翻转图片
let flipImage =  UIImage(CGImage:srcImage.CGImage!,
    scale:srcImage.scale,
    orientation:UIImageOrientation(rawValue: flipImageOrientation)!
)
 
//图片显示
imageView.image = flipImage

3,垂直翻转

//原始图片
let srcImage = UIImage(named: "hangge.png")!
 
//翻转图片的方向
var flipImageOrientation = (srcImage.imageOrientation.rawValue + 4) % 8
flipImageOrientation += flipImageOrientation%2==0 ? 1 : -1
//翻转图片
let flipImage =  UIImage(CGImage:srcImage.CGImage!,
    scale:srcImage.scale,
    orientation:UIImageOrientation(rawValue: flipImageOrientation)!
)
 
//图片显示
imageView.image = flipImage

方法二,通过Quartz重绘图片,改变原始图片数据

1,实现原理

方法1是通过改变 UIImage 的 orientation 实现翻转的,也就是说它只是改变了一个标记而已。
它内部的图片数据其实还是原始的数据,如果翻转图片不是用来显示,而是需要用于图像识别、图像处理等操作那上面那个方法就不适合了。
本方法是将 UIImage 的图片原始数据数组进行重排,从而实现翻转。其实现的关键点是在Core Graphics(Quartz)层面上重绘图片。

2,水平翻转(即左右镜像)

由于Core Graphics(Quartz) 与 UIKit 的y轴坐标系是相反的,先绕原点旋转180度,再平移一下就好了

//原始图片
let srcImage = UIImage(named: "hangge.png")!
 
//Quartz重绘图片
let rect =  CGRectMake(0, 0, srcImage.size.width , srcImage.size.height);//创建矩形框
//根据size大小创建一个基于位图的图形上下文
UIGraphicsBeginImageContextWithOptions(rect.size, false, 2)
let currentContext =  UIGraphicsGetCurrentContext();//获取当前quartz 2d绘图环境
CGContextClipToRect(currentContext, rect);//设置当前绘图环境到矩形框
CGContextRotateCTM(currentContext, CGFloat(M_PI)); //旋转180度
//平移, 这里是平移坐标系,跟平移图形是一个道理
CGContextTranslateCTM(currentContext, -rect.size.width, -rect.size.height);
CGContextDrawImage(currentContext, rect, srcImage.CGImage);//绘图
 
//翻转图片
let drawImage =  UIGraphicsGetImageFromCurrentImageContext();//获得图片
let flipImage =  UIImage(CGImage:drawImage.CGImage!,
    scale:srcImage.scale,
    orientation:srcImage.imageOrientation  //图片方向不用改
)
 
//图片显示
imageView.image = flipImage

3,垂直翻转

垂直翻转更简单了。由于 Core Graphics(Quartz) 与 UIKit 的y轴坐标系是相反的,UIKit是y轴向下,Quartz是y轴向上。直接绘制就是垂直翻转的。

//原始图片
let srcImage = UIImage(named: "hangge.png")!
 
//Quartz重绘图片
let rect =  CGRectMake(0, 0, srcImage.size.width , srcImage.size.height);//创建矩形框
//根据size大小创建一个基于位图的图形上下文
UIGraphicsBeginImageContextWithOptions(rect.size, false, 2)
let currentContext =  UIGraphicsGetCurrentContext();//获取当前quartz 2d绘图环境
CGContextClipToRect(currentContext, rect);//设置当前绘图环境到矩形框
CGContextDrawImage(currentContext, rect, srcImage.CGImage);//绘图
 
//翻转图片
let drawImage =  UIGraphicsGetImageFromCurrentImageContext();//获得图片
let flipImage =  UIImage(CGImage:drawImage.CGImage!,
    scale:srcImage.scale,
    orientation:srcImage.imageOrientation  //图片方向不用改
)
 
//图片显示
imageView.image = flipImage

注:如何防止由于图片重绘造成显示模糊
由于使用视网膜屏,我的原始图片是 hangge@2x.png。如果使用第二方法,即通过重绘来实现图片翻转并显示出来。那么在创建图形上下文的时候就需要设置好放大倍数。而不能简单地直接 UIGraphicsBeginImageContext(rect.size) 来创建。

//根据size大小创建一个基于位图的图形上下文
UIGraphicsBeginImageContextWithOptions(rect.size, false, 2)

时间: 2024-08-02 18:55:12

ios开发Swift实现图片(UIImage)的水平翻转(镜像),垂直翻转的相关文章

iOS开发Swift篇(01) 变量&常量&元组

说明: 1)终于要写一写swift了.其实早在14年就已经写了swift的部分博客,无奈时过境迁,此时早已不同往昔了.另外,对于14年部分iOS开发Swift篇专题的博文也不再做任何的校正和更新,特此说明. 2)该博文对应代码可以在https://github.com/HanGangAndHanMeimei/Code获得. 一.变量和常量 01 变量和常量的定义 在swift中变量使用var来修饰,常量使用let来修饰,变量可以修改而常量不能被修改. 变量:var 常量:let 格式:修饰符(v

ios开发Swift修改导航栏“返回”按钮文字,图标

项目中常常会使用 UINavigationController 对各个页面进行导航,导航栏左侧的返回按钮默认标题文字是上级页面的title. 但如果上级页面的标题很长,那么这个返回按钮字很多就会很丑:    开发Swift修改导航栏"返回"按钮文字,图标-swift 导航栏返回按钮">      当文字极其长时返回文字就会变成"back":         一,要修改"返回按钮"的文字,有如下两种方式: 1,在父页面中设置 将na

iOS开发Swift篇—简单介绍

一.简介 Swift是苹果于2014年WWDC(苹果开发者大会)发布的全新编程语言 Swift在天朝译为"雨燕",是它的LOGO 是一只燕子,跟Objective-C一样,可以用于开发iOS.Mac应用程序 苹果从2010年7月开始设计Swift语言,耗时4年打造 Swift的语法特点 从它的语法中能看到Objective-C.JavaScript.Python等语言的影子 语法简单.代码简洁.使用方便 可与Objective-C混合使用(相互调用) 为什么要设计Swift语言? 让应

iOS开发swift版异步加载网络图片(带缓存和缺省图片)

iOS开发之swift版异步加载网络图片     与SDWebImage异步加载网络图片的功能相似,只是代码比较简单,功能没有SD的完善与强大,支持缺省添加图片,支持本地缓存.      异步加载图片的核心代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 5

iOS开发之多图片无缝滚动组件封装与使用

经常有园友会问"博主,有没有图片无限滚动的Demo呀?", 正儿八经的图片滚动的Demo我这儿还真没有,今天呢就封装一个可以在项目中直接使用的图片轮播.没看过其他iOS图片无限轮播的代码,也不了解他们的原理,我今天封装这个图片无限轮播是借鉴Web前端中的做法,因为之前写Web前端的时候,实现幻灯片就是这么做的,今天就在iPhone上搞搞.下面的东西是自己写的了,关于轮播的东西这个开源项目也是相当不错的https://github.com/nicklockwood/iCarousel ,

iOS开发Swift篇(02) NSThread线程相关简单说明

一 说明 1)关于多线程部分的理论知识和OC实现,在之前的博文中已经写明,所以这里不再说明. 2)该文仅仅简单讲解NSThread在swift语境中的一些使用和注意点,别他. 3)本文涉及代码可以从https://github.com/HanGangAndHanMeimei/Code地址获得. 二 NSThread的基本使用和创建 1)基本用法(主线程|当前线程) 1 //1.获得执行该方法的当前线程 2 let currentThread = NSThread.currentThread()

IOS开发UIButton(左边图片右边文字效果)_IOS

在使用UIButton的时候,需要实现UIButton左边图片,图片后面紧跟文字效果比较麻烦,简单实现方法具体代码如下: (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = RGB(235, 235, 240); UIButton *oneButton = [[UIButton alloc] initWithFrame:CGRectMake(0, kHeaderHeight + 8, kScreenWidth,

iOS开发Swift篇—(二)变量和常量

一.语言的性能 (1)根据WWDC的展示 在进行复杂对象排序时Objective-C的性能是Python的2.8倍,Swift的性能是Python的3.9倍 在实现 RC4加密算法时Objective-C的的性能是Python的127倍,Swift的性能是Python的220倍 有持怀疑态度的国外程序员,也对Objective-C和Swift的性能进行了测试 http://www.splasmata.com/?p=2798 (2)说明 目前的性能不是开发者最需要担心的问题 苹果已经全盘掌握了这个

ios开发SWIFT多线程安全锁例子

Lock 无并发,不编码.而只要一说到多线程或者并发的代码,我们可能就很难绕开对于锁的讨论.简单来说,为了在不同线程中安全地访问同一个资源,我们需要这些访问顺序进行.Cocoa 和 Objective-C 中加锁的方式有很多,但是其中在日常开发中最常用的应该是 @synchronized,这个关键字可以用来修饰一个变量,并为其自动加上和解除互斥锁.这样,可以保证变量在作用范围内不会被其他线程改变.举个例子,如果我们有一个方法接受参数,需要这个方法是线程安全的话,就需要在参数上加锁: - (voi