12/08/2018, 16:29

UIImage, CIImage và CGImage

Bắt đầu học IOS đúng là rất khó. Điều này đi kèm với những khái niệm khá rối và không được tách biệt cho lắm. Trong phần này mình sẽ làm rõ hơn về 3 kiểu dữ liệu ảnh rất phổ biến trong IOS: UIImage, CIImage và CGImage. UIImage Với đa số mọi người mới học hay đã từng làm việc với IOS hay UIKit ...

Bắt đầu học IOS đúng là rất khó. Điều này đi kèm với những khái niệm khá rối và không được tách biệt cho lắm. Trong phần này mình sẽ làm rõ hơn về 3 kiểu dữ liệu ảnh rất phổ biến trong IOS: UIImage, CIImage và CGImage.

UIImage

Với đa số mọi người mới học hay đã từng làm việc với IOS hay UIKit thì UIImage hẳn sẽ rất phổ biến. Theo Apple UIImage được định nghĩa như là một object high-level để hiển thị dữ liệu hình ảnh. Bạn có thể tạo một image từ file: let newImage = UIImage(data: myData), từ Quartz image: let newQuartzImage = UIImage(cgImage: CGImage). UIImage là immutable nên mọi thuộc tính của chúng đều phải được xác định trong lúc khởi tạo. Điều nay cũng đồng nghĩa UIImage Object an toàn khi sử dụng trọng mọi thread, giá trị của nó không bị thay đổi. Thông thường khi sử dụng, bạn có thể lấy một Data để chứa dữ liệu của ảnh: PNG, JEPG... sau đó covert sang một UIImage để sử dụng. Một ví dụ khi khởi tạo chúng.

// data input from API 
var newUIImage = UIImage(data: data)

CIImage

CIImage là immutable object đại diện cho một image. Điều này đồng nghĩa nó cũng có những ưu điểm giống với UIImage: an toàn khi sử dụng trong nhiều thread và các thuộc tính của nó cũng phải xác định khi khởi tạo. Nhưng nó không phải một Image. Nó chỉ là dữ liệu ảnh liên quan đến nó. Nó có đầy đủ thông tin cần thiết để tạo ra một Image. Thông thường bạn sử dụng CIImage trong việc kết hợp với các core Image khác như: CIFilter, CIContext, CIColor and CIVector. Bạn có thể tạo một CIImage với ngồn data đa dạng như: Quartz 2D images, Core Videos image, ... Trường hợp multipe thread có thể sử dụng cùng một GPU hoặc CPU CIContext object để render ra CIImage object. Tuy nhiên điều này không dành cho CIFilter object, nó là mutable, điều này đồng nghĩa nó sẽ không an toàn trong trường hợp multiple thread. Nếu app của bạn đa luồng, mỗi thread phải tạo một CIFilter cho riêng nó. CIImage cũng cung cấp các method phân tích một image, các thiếu sót phổ biến và trả về một filter để cải thiện các lỗi đó. Nhưng Filters này được setting sẵn các giá trị để thay đổi các thiếu sót của một image như tông màu, độ bão hoà, tương phản, bóng, hoặc các hiệu ứng lỗi do đèn flash tạo ra. Khởi tạo một CIImage từ UIImage.

// input is UIImage
var newCIImage = CIImage(image: image)

CGImage

Khác với 2 loại trên CGImage chỉ thể hiện các bitmaps. Nếu bạn muốn truy cập hoặc chỉnh sửa một bitmap cụ thể có thể dùng CGImage. Cũng có thể convert sang NSBitmapImageReps. Khi thao tác trong CoreCoreGraphics, sử dụng các tính năng như blend modes, masking require cần sử dụng CGImageRefs. Bạn cũng có thể create một UIImage từ một CGImage

  var aNewUIImage = UIImage(CGImage: imageRef)
  //where imageRef is a CGImage

Tổng Kết

Đây là phần tổng hợp của cá nhân, có thể còn nhiều thiếu sót. Tuy nhiên hy vọng bà post sẽ giúp ích cho nhưng ai đang băn khoăn trong các khai niệm rất giống nhau này. Còn việc sử dụng tuỳ từng case trong porject.

0