Files
photobooth-app/12_FIX_SLIDE.md
T

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)
    }
}