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 **

original.jpeg

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**

rotate90.jpeg

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

rotate-90.jpeg

let result = image.rotate( -1)   // ngược kim đồng hồ 90

rotate180.jpeg

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 )

flipx.jpeg

let result = image.flipX() // đảo theo chiều ngang

flipY.jpeg

let result = image.flipY() // đảo theo chiều thẳng đứng

Còn nữa, mình sẽ viết tiếp sau nhá (lay2)

0