12/08/2018, 10:09
Xử lý ảnh dễ dàng trong swift (Phần 1)
Nguồn tham khảo tại: http://qiita.com/koher/items/7dc1aa10755b79102539#comment-43b117556004978e65f8 Xử lý ảnh trong Swift không phải là một điều dễ dàng. Thông thường chúng ta thường sử dụng API CoreGraphics có sẵn trong xcode, tuy nhiên API này được viết bằng C khá cũ, format phức tạp, đồng ...
Nguồn tham khảo tại: http://qiita.com/koher/items/7dc1aa10755b79102539#comment-43b117556004978e65f8
Xử lý ảnh trong Swift không phải là một điều dễ dàng. Thông thường chúng ta thường sử dụng API CoreGraphics có sẵn trong xcode, tuy nhiên API này được viết bằng C khá cũ, format phức tạp, đồng thời việc quản lý bộ nhớ cũng đòi hỏi phải có một nền tảng kiến thức vững. Trong khi đôi khi chúng ta chỉ muốn xử lý một chút, thao tác đơn giản với pixel ảnh mà thôi.
Chính vì vậy bài viết này, với mục đích đơn giản hoá việc xử lý ảnh trong Swift, tác giả đã viết thư viện EasyImagy để giới thiệu đến bạn đọc.
**1. Các tính năng của thư viện EasyImagy **
Chúng ta lấy bức ảnh này làm mẫu cho các ví dụ xử lý ảnh của thư viện (honho)
**1.1 Đọc ảnh từ file **
Nếu ảnh đã được add vào project (main bundle) thì chỉ cần gọi tên ảnh là có thể tạo được một image instance
let image = Image(named: "ImageName")
Đương nhiên là chúng ta vẫn đọc được file ảnh từ đường dẫn rồi ạ (lay2)
let image = Image(contentsOfFile: "path/to/file")
Ảnh đọc từ thư viện đều theo chuẩn RGBA nên các pixel đều có thể được biểu diễn theo cấu trúc cơ bản
struct Pixel { var red: UInt8 var green: UInt8 var blue: UInt8 var alpha: UInt8 }
**1.2 Chuyển đổi qua lại với UIImage **
Dù thao tác với image có dễ dàng, đơn giản tới đâu mà cuối cùng không chuyển về được UIImage thì thư viện cũng không mang nhiều ý nghĩa. Chính vì vậy, thư viện cũng support việc chuyển đổi một các dễ dàng
let image = Image(UIImage: imageView.image!) imageView.image = image.UIImage
**1.3 Access to pixel **
Sử dụng Subscript ([ ]) chúng ta có thể access to pixel theo mẫu code như sau
if let pixel = image[y][x] { // `image[x, y]` cũng ok println(pixel.red) println(pixel.green) println(pixel.blue) println(pixel.alpha) println(pixel.gray) // (red + green + blue) / 3 println(pixel) // format sẽ hiển thị kiểu như thế này"#FF0000FF" } else { println("Out of bounds") }
Tác giả cũng viết thêm một số property tiện dụng cho việc sử dụng pixel (như thuộc tính "gray" như ở VD trên) (hehe)
Image là một dạng cấu trúc, vì vậy sử dụng var để khai báo và sử dụng Subscript như trên chúng ta có thể update pixel
image[y][x] = Pixel(red: 255, green: 0, blue: 0, alpha: 255) image[y][x]?.alpha = 127
1.4 Iteration
Vì Image là một tập hợp các Pixel liên tục , do đó sử dụng mẫu code sau có thể dễ dàng truy xuất vào các pixel ở trong ảnh
for pixel in image { ... }
Hoặc sử dụng thêm biến toạ độ để truy xuất
for (x, y, pixel) in image.enumerate() { ... }
** 1.5 Rotate**
Sử dụng hàm rotate mặc định không tham số, ảnh sẽ xoay theo chiều kim đồng hồ một góc 90 độ
let result = image.rotate()
Khi đưa tham số vào , ta thể quay theo các góc như -90 độ , 180, 270
let result = image.rotate( -1) // ngược kim đồng hồ 90
let result = image.rotate(2) // quay 180 độ
1.6 Đảo ngược ảnh
Sử dụng hàm flipX và flipY để đảo ngược ảnh theo chiều chúng ta muốn (x - chiều ngang, y - chiều dọc )
let result = image.flipX() // đảo theo chiều ngang
let result = image.flipY() // đảo theo chiều thẳng đứng