UIImage类
在 Swift 中,UIImage 是 UIKit 框架中用来表示图像的一个类,广泛用于 iOS 开发。UIImage 对象可以用于显示、修改和处理各种格式的图像(如 PNG 和 JPEG),并能直接显示在用户界面中的控件里,比如 UIImageView。
UIImage 的常用用途
1、本地或远程图片加载:
如果需要从应用的资源文件夹中加载图片,例如 UIImage(named: “imageName”),UIImage 是默认的首选。
对于从 URL 下载的网络图片,也通常使用 UIImage 将数据转化成可显示的图片,然后加载到视图中。
2、图像处理:
UIImage 提供了对图片的加工、编辑、裁剪等操作,特别是在涉及滤镜、缩放、旋转等自定义图像操作时。
自定义图片的应用场景包括相册管理应用、社交平台的图片编辑工具等。
3、高效缓存:
UIImage 通过其缓存机制,在需要多次显示同一张图片时减少内存消耗和加载时间。例如,当图片在多个视图中使用,UIImage 可以高效地进行图像数据管理。
4、内存管理与优化:
UIImage 可以帮助自动管理大图像的内存(例如通过 UIImage(contentsOfFile:) 等方式)。这对应用性能优化非常重要,特别是在显示大量图片(如照片浏览器或社交媒体 App 的场景)时。
5、将图片与 UIKit 配合使用:
UIImageView 和 UIImage 配合使用,能够使图像资源的加载、显示、动态更新更高效。UIImageView 的 image 属性直接接收 UIImage,适用于 UIKit 中的自定义界面开发。创建和使用 UIImage
从文件创建
let image = UIImage(named: "exampleImage")
UIImage(named:) 是 UIKit 中的一个初始化方法,专门用于通过文件名创建图像对象 UIImage,这个对象通常用于显示图片。
UIImage(named: "exampleImage")
named: 参数接收一个 String 类型的文件名,这个文件名应该与项目中某个图片资源的名字完全匹配(不包含文件扩展名)。
UIImage 会在主 bundle 中查找该文件,如果找到,返回一个 UIImage 实例,否则返回 nil。
具体来说:
当使用 UIImage(named:) 方法时,系统会:
1、首先在 Assets Catalog (Assets.xcassets) 中查找是否有对应名称的图片资源。
2、如果没有找到,就会在主 Bundle 中查找对应的图像文件(如 .png 或 .jpg)。
3、如果仍然找不到,返回 nil。
if let image = UIImage(named: "exampleImage") {
// 成功加载图片,可以在 UIImageView 中使用
imageView.image = image
} else {
print("图片未找到")
}
如果图片文件存在,代码会将 image 设置为 UIImage 对象。
如果图片文件不存在,UIImage(named:) 会返回 nil,避免程序崩溃。
从Data中创建
let img = """
/9j/4AAQSkZJRg
"""
if let data = Data(base64Encoded:img) {
if let image = UIImage(data:data) {
Image = image
}
}
使用Data(base64Encoded:)获取Base64格式的图片后,通过UIImage(data:)方法将二进制data转换为UIImage。
从 URL 数据创建
if let url = URL(string: "https://fangjunyu.com/wp-content/uploads/2024/03/my.png"),
let data = try? Data(contentsOf: url),
let image = UIImage(data: data) {
// 使用 image
}
创建一个URL对象并使用Data(contentOf:)方法,从URL中获取到图片的原始二进制数据,返回Data?类型。将下载的二进制data转换为UIImage对象,如果数据不符合图片格式或解析失败,则UIImage(data:)会返回nil。
转换为 Data 格式
if let imageData = image.jpegData(compressionQuality: 0.8) {
// 将图片数据用于上传等操作
}
这段代码将 UIImage 对象(即 image)转换为 JPEG 格式的二进制数据,以便用于上传或存储。
image.jpegData(compressionQuality: 0.8):
jpegData(compressionQuality:) 是 UIImage 的一个方法,用于将 UIImage 对象转化为 JPEG 格式的 Data 对象(即二进制数据)。
compressionQuality 参数决定了压缩质量,范围在 0.0 到 1.0 之间,0.0 表示最大压缩(最低质量),1.0 表示不压缩(最高质量)。
在这里,0.8 表示会进行一定程度的压缩,从而减小图片的大小,适合用于网络上传以减少流量消耗。
示例:上传图片数据
假设我们要将 imageData 上传到服务器,可以这样实现:
if let imageData = image.jpegData(compressionQuality: 0.8) {
var request = URLRequest(url: URL(string: "https://example.com/upload")!)
request.httpMethod = "POST"
request.setValue("image/jpeg", forHTTPHeaderField: "Content-Type")
request.httpBody = imageData
URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print("上传失败:\(error)")
return
}
print("上传成功")
}.resume()
}
这种方法适合在需要图像数据以特定格式(如 JPEG 或 PNG)传递时使用,JPEG 压缩可以在文件大小和图像质量之间取得平衡。
UIImage 与图像视图的关系
UIImage 只是图像数据的容器,要在 UI 中显示它通常使用 UIImageView:
let imageView = UIImageView(image: image)
这样,UIImage 对象可以在视图中直接显示出来。
UIImageView
UIImageView 是 UIKit 框架中的一个视图类,专门用于显示图像内容。它继承自 UIView,因此可以作为任何视图层级结构中的一部分。UIImageView 常用于显示静态图片(例如图标、照片)或序列帧动画。
主要功能和特性
显示图片:UIImageView 可以通过设置 image 属性来显示一张图片。例如,imageView.image = UIImage(named: “example”)。
显示动画:可以设置 animationImages 属性来实现序列帧动画,并使用 startAnimating() 和 stopAnimating() 方法控制动画的播放。
关键属性和方法
image:用于设置或获取 UIImageView 显示的单张图像。
animationImages:用于设置一组图像,按顺序显示来产生动画效果。
startAnimating() 和 stopAnimating():控制动画的播放和停止。
contentMode:控制图像的显示方式,如缩放、填充、居中等。
基本功能
1、显示静态图片:
你可以将一张 UIImage 分配给 UIImageView,来显示静态图像。
例如:
let imageView = UIImageView(image: UIImage(named: "exampleImage"))
2、图片内容模式:
UIImageView 支持多种内容模式(如缩放、居中、填充等),可以通过设置 contentMode 属性控制图片的显示方式。
常用的 contentMode 值包括:
.scaleAspectFit: 按比例缩放并适配视图,防止图片拉伸。
.scaleAspectFill: 使图片填满视图,但图片可能会被裁剪。
示例:
imageView.contentMode = .scaleAspectFit
3、动画图片序列:
UIImageView 还可以用于显示图片动画。可以通过设置 animationImages(一组图片数组),使其按顺序显示,从而达到动画效果。
示例:
imageView.animationImages = [UIImage(named: "frame1")!, UIImage(named: "frame2")!, UIImage(named: "frame3")!]
imageView.animationDuration = 1.0 // 动画的持续时间
imageView.startAnimating()
4、处理图像缓存:
在加载远程图片时,通常会使用第三方库(如 SDWebImage)来帮助缓存和加载图片,以优化性能并减少网络请求。
常见用法
通常,UIImageView 会被添加到视图控制器的视图层次结构中,例如:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 创建 UIImageView 并加载一张名为 "exampleImage" 的图片
let imageView = UIImageView(image: UIImage(named: "exampleImage"))
// 设置图片显示模式为 scaleAspectFit,使图片保持比例地适应视图
imageView.contentMode = .scaleAspectFit
// 设置图片视图的位置和大小(x: 50, y: 50, width: 200, height: 200)
imageView.frame = CGRect(x: 50, y: 50, width: 200, height: 200)
// 将 imageView 添加到当前视图控制器的视图层级中,使其显示在界面上
self.view.addSubview(imageView)
}
}
1、创建UIImageView
let imageView = UIImageView(image: UIImage(named: "exampleImage"))
UIImageView 是用于显示图片的视图组件。
UIImage(named: “exampleImage”) 会加载资源中名为 “exampleImage” 的图片文件。
该 UIImage 对象被赋给 UIImageView,这样 imageView 就可以显示此图片了。
2、设置图片的显示方式
imageView.contentMode = .scaleAspectFit
contentMode 设置图片的显示方式。
.scaleAspectFit 会保持图片的宽高比例,并在 UIImageView 的边界内缩放,使图片不会变形。
3、设置图片的位置和大小
imageView.frame = CGRect(x: 50, y: 50, width: 200, height: 200)
frame 定义了 imageView 的位置和大小。
这里将其设置为距离屏幕左边 50 点、顶部 50 点,宽度和高度均为 200 点。
4、添加到当前视图控制器的视图层级
self.view.addSubview(imageView)
将 imageView 添加到当前视图控制器的 view 中,使 imageView 成为该控制器的子视图,从而显示在屏幕上。
小结
UIImageView 是专门用于显示图片的视图,支持静态和动态图片的展示。
通过设置 contentMode、frame 等属性,可以控制图片在界面中的显示效果。
如果需要处理图片的加载和缓存(尤其是远程图片),通常会结合第三方库使用。
UIImage和Image区别
在功能上,UIImage 和 SwiftUI 的 Image(“”) 有一定相似性,但它们属于不同的框架,具有以下区别:
1、所属框架:UIImage属于UIKit,Image属于SwiftUI;
2、数据类型:UIImage 是 UIKit 的图像对象,Image 是 SwiftUI 的视图。
3、用法:UIImage用于 UIKit 的界面开发,Image用于 SwiftUI 的界面开发;
4、资源查找:UIImage支持从 Assets.xcassets 或主 Bundle 加载,Image默认从 Assets.xcassets 加载;
5、操作能力:UIImage提供更多底层操作和功能(如编辑、绘制),Image专注于显示,无法直接操作图像数据
6、多分辨率支持:UIImage自动加载合适的分辨率版本(@1x/@2x/@3x),Image同样支持多分辨率加载。
相似点
都支持从 Assets.xcassets 加载图片。
都可以根据设备分辨率自动选择适合的图像资源。
不同点
UIKit 的 UIImage 是底层的图像数据类型,可以操作和处理图像(如裁剪、调整大小)。
SwiftUI 的 Image(“”) 是一个声明式视图类型,专注于图像的显示,无法直接操作图像数据。
使用 Image(“”) 加载图片的机制
在 SwiftUI 中,Image(“”) 默认会从 Assets.xcassets 中查找图片。如果指定的图片资源不存在,视图可能会崩溃或不显示任何内容。
Image("example") // 从 Assets.xcassets 中查找名为 "example" 的图片
如果需要加载其他位置的图片:
通过 Image(uiImage:) 将 UIImage 转换为 SwiftUI 的 Image:
let uiImage = UIImage(named: "example")
Image(uiImage: uiImage!)
因此,Image更适合 SwiftUI,对于 SwiftUI 开发,Image(“”) 是首选,因为它与声明式视图紧密集成。如果需要更复杂的图像处理,可以结合 UIImage 使用。
总结
UIImage 和 UIImageView 是 iOS 开发中常用来处理和展示图片的两个重要类。它们各自的功能和用途不同,但通常配合使用来完成图片的展示和操作。
UIImage 负责图片的加载和管理,UIImageView 负责图片的展示。两者通常结合使用,将 UIImage 加载到 UIImageView 中来展示图片。