Swift UIImage和UIImageView类
Swift UIImage和UIImageView类

Swift UIImage和UIImageView类

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 中来展示图片。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注