# 🛠️ 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) } } ``` ---