88 lines
3.9 KiB
Markdown
88 lines
3.9 KiB
Markdown
|
|
|
|
# 🛠️ KẾ HOẠCH SỬA LỖI ĐỒ HỌA: CHUẨN HÓA THUẬT TOÁN ĐỔI MÀU THEO KÊNH
|
|
|
|
Mục tiêu: Quy hoạch lại công thức toán học tính toán 4 chỉ số `alpha`, `r`, `g`, `b` để đảm bảo:
|
|
|
|
* **Brightness:** Phải tăng/giảm đều cả 3 kênh R, G, B (độ sáng tổng thể).
|
|
* **Temperature:** Chỉ dịch chuyển cân bằng giữa kênh R (Ấm) và kênh B (Lạnh).
|
|
* **Tint:** Chỉ dịch chuyển cân bằng kênh G (Xanh lá) và tổ hợp R+B (Hồng dâu).
|
|
* **Alpha (Độ đậm bộ lọc):** Được điều tiết một cách thông minh bằng Saturation, Vibrance, Contrast, Clarity và Dehaze để tăng giảm độ dày của lớp phủ màu Instax.
|
|
|
|
---
|
|
|
|
## 💻 1. Cấu Trúc Mã Nguồn Sau Khi Sửa Đổi (Kotlin)
|
|
|
|
Hãy thay thế toàn bộ đoạn tính toán màu ARGB cũ bằng khối thuật toán chuẩn hóa và loại bỏ hoàn toàn các dòng khai báo trùng lặp:
|
|
|
|
```kotlin
|
|
val color = if (preset.isEditable) {
|
|
// 1. ALPHA (Độ đậm/Mờ của lớp filter): Được quyết định bởi Saturation, Vibrance và hiệu ứng nâng cao
|
|
// Quy đổi dải từ -1.0 -> 1.0 sang mức độ trong suốt hợp lý (từ 15 đến 140 trong hệ 255)
|
|
val baseAlpha = 60f
|
|
val saturationImpact = (preset.basic.saturation + preset.basic.vibrance) * 25f
|
|
val contrastImpact = preset.basic.contrast * 15f
|
|
val alpha = (baseAlpha + saturationImpact + contrastImpact).toInt().coerceIn(15, 140)
|
|
|
|
// 2. BASE COLOR (Màu nền mặc định ban đầu trước khi tinh chỉnh)
|
|
// Bắt đầu từ một màu trung tính hoặc lấy màu gốc của Theme nếu có
|
|
var baseR = 140f
|
|
var baseG = 130f
|
|
var baseB = 120f
|
|
|
|
// 3. BRIGHTNESS (Độ sáng): Bắt buộc phải cộng/trừ ĐỀU vào cả 3 kênh R, G, B để dịch chuyển Exposure
|
|
val brightnessOffset = preset.basic.brightness * 80f // Nhân hệ số để biên độ thay đổi từ -100 đến +100 rõ rệt
|
|
baseR += brightnessOffset
|
|
baseG += brightnessOffset
|
|
baseB += brightnessOffset
|
|
|
|
// 4. TEMPERATURE (Nhiệt màu): + là Ấm (Tăng Đỏ, Giảm Lam), - là Lạnh (Giảm Đỏ, Tăng Lam)
|
|
val tempOffset = preset.basic.temperature * 50f
|
|
baseR += tempOffset
|
|
baseB -= tempOffset
|
|
|
|
// 5. TINT (Sắc độ): + là Ám hồng (Tăng Đỏ & Lam, Giảm Lục), - là Ám xanh (Giảm Đỏ & Lam, Tăng Lục)
|
|
val tintOffset = preset.basic.tint * 40f
|
|
baseG -= tintOffset
|
|
baseR += (tintOffset * 0.5f)
|
|
baseB += (tintOffset * 0.5f)
|
|
|
|
// 6. TONE CURVE & SHADOWS TINT (Ám màu vùng tối đặc trưng của Instax)
|
|
baseR += (preset.toneCurve.shadowsTintR * 35f)
|
|
baseG += (preset.toneCurve.shadowsTintG * 35f)
|
|
baseB += (preset.toneCurve.shadowsTintB * 35f)
|
|
|
|
// Nâng đáy màu đen (Faded Black) tạo độ sờn ảnh
|
|
val fadeOffset = preset.toneCurve.fadedBlackLevel * 30f
|
|
baseR += fadeOffset
|
|
baseG += fadeOffset
|
|
baseB += fadeOffset
|
|
|
|
// 7. CLARITY & DEHAZE (Điều tiết thêm độ tương phản cục bộ của màu)
|
|
val advancedOffset = (preset.advanced.clarity - preset.advanced.dehaze) * 20f
|
|
baseR += advancedOffset
|
|
baseG += advancedOffset
|
|
baseB += advancedOffset
|
|
|
|
// 8. ÉP BIÊN ĐỘ (COERCE) để đảm bảo giá trị RGB luôn nằm trong giới hạn vật lý 0 -> 255
|
|
val r = baseR.toInt().coerceIn(0, 255)
|
|
val g = baseG.toInt().coerceIn(0, 255)
|
|
val b = baseB.toInt().coerceIn(0, 255)
|
|
|
|
android.graphics.Color.argb(alpha, r, g, b)
|
|
} else {
|
|
// Khối xử lý cho các mẫu mặc định cố định không sửa đổi
|
|
when (preset.id) {
|
|
"instax_faded_warm_01" -> android.graphics.Color.argb(55, 255, 152, 0)
|
|
"instax_bw_cool" -> android.graphics.Color.argb(80, 128, 128, 128)
|
|
"instax_cool_summer" -> android.graphics.Color.argb(45, 0, 188, 212)
|
|
else -> android.graphics.Color.argb(0, 0, 0, 0)
|
|
}
|
|
}
|
|
|
|
```
|
|
|
|
---
|
|
|
|
|