3.9 KiB
3.9 KiB
🛠️ 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:
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)
}
}