Điều chỉnh độ sáng và lọc màu hình ảnh với Android LightingColorFilter

Dễ dàng điều chỉnh độ sáng của hình ảnh và lọc màu bằng Android LightingColorFilter

Đưa ra một hình ảnh, làm thế nào chúng ta có thể làm cho nó sáng hơn hoặc tối hơn trong Android? Có thể nghĩ đến việc sử dụng một lớp màu khác, nhưng đó không phải là cách tốt nhất.

Thật may, Android cung cấp cho chúng ta class LightningColorFilter giúp chúng ta dễ dàng điều chỉnh độ sáng của hình ảnh.

image_background.colorFilter = LightingColorFilter(mul, add)

Giải thích nhẹ Mul và Add

Ví dụ Mã màu duới dạng hex

0 x 00     00    00     00
    alpha  red   green  blue

4 byte được sử dụng, một cho Alpha, một cho Red, một cho Green, một cho Blue. Phạm vi từ 0 đến FF (0 đến 255)

Trong mô tả API được cung cấp, lời giải thích không rõ ràng lắm.

Một bộ lọc màu có thể được sử dụng để mô phỏng các hiệu ứng ánh sáng đơn giản.

LightingColorFilter đưuọc xác định bởi hai tham số, một được dùng để nhân màu nguồn(được gọi là mul), một được dùng để thêm vào màu nguồn(được gọi là add). Bộ lọc chỉ ảnh hưởng đến các giá trị Red, Green và Blue, còn Alpha sẽ không bị ảnh hưởng.

Cho màu RGB nguồn, màu R'G'B' được tính như sau:

R' = R * mulR + addR

G' = G * mulG + addG

B' = B * mulB + addB

Tạo một colorfilter(bộ lọc màu) với việc nhân các RGB channel với một màu và sau đó thêm vào màu thứ hai. Các phần alpha của mull và add sẽ bị bỏ qua. :-?

Ví dụ nếu bạn muốn bỏ đi phần màu Red của màu nguồn thì giá trị mul và add sẽ là mul: 0xFF00FFFFadd: 0x00000000

Theo công thức trên thì các giá trị lần lượt là

  • mulR = 0x00, addR = 0x00
  • mulG = 0xFF, addG = 0x00
  • mulB = 0xFF, addB = 0x00

Giải thích kỹ hơn công thức

Dưới đây là mô tả về mặt toán học (vì có các phép nhân và cộng).

Với mỗi pixel của màu nguồn, chúng ta sẽ biến nó thành màu mới với công thức ở dưới đây. Điều này áp dụng cho từng màu R G B, trừ Alpha

newColor = mul/255 * (originalColor) + add

Có thể đoán rằng giá trị mặc định của mul là 255(0xFF) và add là 0(0x00).

Sử dụng thực tế

Mô tả ở trên vẫn là quá lý thuyết, cái chúng ta cần bây giờ là ví dụ cụ thể.

  • Giá trị mul chỉ đơn giản là làm cho hình ảnh tối hơn (khi mul = 0) và đúng với màu gốc của nó (khi mul = 255), như hiển thị bên dưới.

  • Khi mul = 255, add chỉ đơn giản làm cho hình ảnh sáng hơn từ ảnh gốc (khi add = 0) cho đến khi nó cuối cùng toàn màu trắng (khi add = 255), như hiển thị bên dưới.

  • Tuy nhiên, khi mul = 0, đó là hình ảnh màu đen. Khi add tăng, nó sẽ từ từ chuyển sang màu trắng hoàn toàn, như bên dưới. Ảnh gốc hoàn toàn không hiển thị dưới dạng mul = 0.

Đồ thị mul và add

Nếu chúng ta vẽ đồ thị theo 2 chiều, nó sẽ trông như bên dưới, trong đó, khi mul = 0, hình ảnh sẽ có màu đơn giản, từ đen sang trắng, tùy thuộc vào giá trị của add , khi add = 255 tất cả hình ảnh là màu trắng.

Ở tất cả các giá trị khác, hình ảnh thực tế sẽ hiển thị, sau đó, ở một mức độ nào đó, khi mul = 255 và add = 0, màu gốc của hình ảnh được hiển thị.

Lọc màu sắc cụ thể bằng LightingColorFilter

Ngoài việc điều chỉnh độ sáng, LightingColorFilter cũng có thể được sử dụng để lọc đi các màu cụ thể.

Nếu chúng ta muốn có màu chính (Red, Green hoặc Blue) của hình ảnh, chúng ta chỉ cần đặt Mul cụ thể của màu đó ở mức tối đa:

Nếu chúng ta chỉ trộn hai màu, nó sẽ giống như lọc đi một màu, như bên dưới:

Lưu ý: Điều này sẽ không tạo ra màu thứ cấp, chẳng hạn như màu lục lam, đỏ tươi hoặc vàng, vì nó là sự tồn tại của hai màu của hình ảnh và không phải là sự pha trộn của hai màu.

Nếu chúng ta muốn hiển thị màu thứ cấp, theo kết hợp bên dưới, chúng ta sẽ cần sử dụng biến add

Tương tự, nếu bạn muốn hiển thị hai trong số các màu thứ cấp, chỉ cần sử dụng ngược lại với màu thứ cấp tương ứng, như được hiển thị bên dưới.

Kết luận

Nói tóm lại, LightingColorFilter là một phương tiện để tăng cường hoặc giảm bớt màu sắc ban đầu của hình ảnh.

Tài liệu

Bài viết này được dịch từ bài viết Android Image Lighting Control and Color Filtering của tác giả Elye.

Link github demo của tác giả: https://github.com/elye/demo_android_lightingcolorfilter

(thankyou) 😄