氛围灯动态屏保取色方案二

news/2025/10/22 11:23:34/文章来源:https://www.cnblogs.com/LiuZhen/p/19157538

hue查找:整体偏差不会很大,但是对于亮度较高存在误差,精准度不够

lab查找:整体一般,但是精准度较好,不过算法复杂,增加耗时

hue色相查找存在误差,在有限的256色中,匹配的规则需要调整

这里使用lab算法提高精准度

RGB转Lab

fun rGBToLab(r: Int, g: Int, b: Int): DoubleArray {// 处理负值(如-2563864)val labR = if (r < 0) 0f else r / 255fval labG = if (g < 0) 0f else g / 255fval labB = if (b < 0) 0f else b / 255f// 线性化处理(sRGB转换)val rLin = if (labR <= 0.04045) labR / 12.92 else ((labR + 0.055) / 1.055).pow(2.4)val gLin = if (labG <= 0.04045) labG / 12.92 else ((labG + 0.055) / 1.055).pow(2.4)val bLin = if (labB <= 0.04045) labB / 12.92 else ((labB + 0.055) / 1.055).pow(2.4)// XYZ转换(D65标准光源)val x = 0.4124564 * rLin + 0.3575761 * gLin + 0.1804375 * bLinval y = 0.2126729 * rLin + 0.7151522 * gLin + 0.0721750 * bLinval z = 0.0193339 * rLin + 0.1191920 * gLin + 0.9503041 * bLin// Lab转换val xn = 0.95047fval yn = 1.0fval zn = 1.08883fval fX = x / xnval fY = y / ynval fZ = z / znval l = 116f * fY.pow(1 / 3.0) - 16val a = 500f * (fX.pow(1 / 3.0) - fY.pow(1 / 3.0))val b = 200f * (fY.pow(1 / 3.0) - fZ.pow(1 / 3.0))return doubleArrayOf(l, a, b)}
View Code

对rgb进行转换,这里是简化版,如果需要精确要求极高,需要完善

处理流程跟方案一一样,使用集合缓存

接着使用 ΔE76色差公式 查找色值(另外还有ΔEab欧式距离算法,CIEDE2000色差公式,CIE76)

fun deltaE76(lab1: DoubleArray, lab2: DoubleArray): Double {val (l1, a1, b1) = lab1val (l2, a2, b2) = lab2// 计算中间变量val c1 = sqrt(a1.pow(2) + b1.pow(2))val c2 = sqrt(a2.pow(2) + b2.pow(2))val cAvg = (c1 + c2) / 2val g = 0.5 * (1 - sqrt(cAvg.pow(7) / (cAvg.pow(7) + 25f.pow(7))))val a1p = a1 * (1 + g)val a2p = a2 * (1 + g)val c1p = sqrt(a1p.pow(2) + b1.pow(2))val c2p = sqrt(a2p.pow(2) + b2.pow(2))val h1p = Math.toDegrees(kotlin.math.atan2(b1, a1p)).let { if (it < 0) it + 360 else it }val h2p = Math.toDegrees(kotlin.math.atan2(b2, a2p)).let { if (it < 0) it + 360 else it }// 色差计算val deltaLp = l2 - l1val deltaCp = c2p - c1pval deltaHp = when {c1p * c2p == 0.0 -> 0.0abs(h2p - h1p) <= 180 -> h2p - h1ph2p <= h1p -> h2p - h1p + 360else -> h2p - h1p - 360}val deltaHpS = 2 * sqrt(c1p * c2p) * sin(Math.toRadians(deltaHp) / 2)// 加权计算val lAvg = (l1 + l2) / 2val cpAvg = (c1p + c2p) / 2val hpAvg = when {c1p * c2p == 0.0 -> h1p + h2pabs(h1p - h2p) > 180 -> (h1p + h2p + 360) / 2else -> (h1p + h2p) / 2}.let { if (it >= 360) it - 360 else it }val t = 1 - 0.17 * cos(Math.toRadians(hpAvg - 30)) +0.24 * cos(Math.toRadians(2 * hpAvg)) +0.32 * cos(Math.toRadians(3 * hpAvg + 6)) -0.20 * cos(Math.toRadians(4 * hpAvg - 63))val sl = 1 + (0.015 * (lAvg - 50).pow(2)) / sqrt(20 + (lAvg - 50).pow(2))val sc = 1 + 0.045 * cpAvgval sh = 1 + 0.015 * cpAvg * tval deltaTheta = 30 * exp(-((hpAvg - 275) / 25).pow(2))val rc = 2 * sqrt(cpAvg.pow(7) / (cpAvg.pow(7) + 25f.pow(7)))val rt = -rc * sin(2 * Math.toRadians(deltaTheta))return sqrt((deltaLp / sl).pow(2) +(deltaCp / sc).pow(2) +(deltaHpS / sh).pow(2) +rt * (deltaCp / sc) * (deltaHpS / sh))}
View Code
var minIndex = 0var minDistance = Double.MAX_VALUEvar minLab = doubleArrayOf()tableLabPalette.forEachIndexed { index, lab ->val distance = ColorEabLabUtils.deltaE76(lab, list)if (distance < minDistance) {minDistance = distanceminLab = labminIndex = index}}
View Code

image

从上面图中结果可以明显看到,大部分图片中,hue原方案精准度对比lab查找,是有差距的

但是缺点也明显,在某些图片上表现不好,可以看到原方案hue更精准

image

经过大量调整算法,优化算法,测试下来发现,如果在不通过底层显示屏直接转换色值情况下,都存在误差

而刚好这两种查找结果有一定互补作用,那是否可以取各自的优势,结合结果,达到一个平衡

private fun findLabColor(list: DoubleArray, hue: Float): Int {// 寻找最近颜色(简化版)var minIndex = 0var minDistance = Double.MAX_VALUEvar minLab = doubleArrayOf()tableLabPalette.forEachIndexed { index, lab ->val distance = ColorEabLabUtils.deltaE76(lab, list)if (distance < minDistance) {minDistance = distanceminLab = labminIndex = index}}return if (minDistance < 26) {tableColorList[minIndex]} else {findColor(hue).colorTip}}
View Code

在lab精度不够时,可能结果偏差较大,但是hue偏差不会很大,hue只是精度不够,所以这里兼容两种方案

在lab误差较大时,直接采用hue方案计算结果,这样直接弥补了自身的缺点,比如图一中误差小,采用lab方案,提高了精准度,而在图二精度不够时,采用hue,避免误差偏差较大

image

最终方案是融合方案,不过精度任然存在误差,但本身转换过程结果只有256色,所以不可能达到完美,相比原图取色结果精度是较高

import android.graphics.Bitmap
import android.graphics.Color
import androidx.palette.graphics.Palette
import androidx.palette.graphics.Palette.Swatch
import java.lang.Math.toDegrees
import java.lang.Math.toRadians
import kotlin.math.abs
import kotlin.math.atan2
import kotlin.math.cos
import kotlin.math.exp
import kotlin.math.pow
import kotlin.math.sin
import kotlin.math.sqrtobject ColorEabLabUtils {fun getPerceptuallyDominantColor(bitmap: Bitmap): Int {val palette = Palette.from(bitmap).maximumColorCount(24).clearFilters().generate()val swatches = palette.swatchesif (swatches.isEmpty()) return Color.WHITEvar bestSwatch: Swatch? = nullvar maxScore = 0ffor (swatch in swatches) {val hsl = swatch.getHsl()val saturation = hsl[1] // 饱和度 (0-1)val luminance = hsl[2] // 亮度 (0-1)val population = swatch.population// 评分公式:人口占比 * 饱和度 * 亮度因子// 亮度因子确保避免过暗或过亮的颜色(0.1-0.9为理想范围)val luminanceFactor = 1f - abs(luminance - 0.5f) * 1.8fval score = population * saturation * luminanceFactorif (score > maxScore) {maxScore = scorebestSwatch = swatch}}return bestSwatch?.rgb ?: palette.getDominantColor(Color.WHITE)}// RGB转Lab *********
    fun rGBToLab(r: Int, g: Int, b: Int): DoubleArray {// 处理负值(如-2563864)val labR = if (r < 0) 0f else r / 255fval labG = if (g < 0) 0f else g / 255fval labB = if (b < 0) 0f else b / 255f// 线性化处理(sRGB转换)val rLin = if (labR <= 0.04045) labR / 12.92 else ((labR + 0.055) / 1.055).pow(2.4)val gLin = if (labG <= 0.04045) labG / 12.92 else ((labG + 0.055) / 1.055).pow(2.4)val bLin = if (labB <= 0.04045) labB / 12.92 else ((labB + 0.055) / 1.055).pow(2.4)// XYZ转换(D65标准光源)val x = 0.4124564 * rLin + 0.3575761 * gLin + 0.1804375 * bLinval y = 0.2126729 * rLin + 0.7151522 * gLin + 0.0721750 * bLinval z = 0.0193339 * rLin + 0.1191920 * gLin + 0.9503041 * bLin// Lab转换val xn = 0.95047fval yn = 1.0fval zn = 1.08883fval fX = x / xnval fY = y / ynval fZ = z / znval l = 116f * fY.pow(1 / 3.0) - 16val a = 500f * (fX.pow(1 / 3.0) - fY.pow(1 / 3.0))val b = 200f * (fY.pow(1 / 3.0) - fZ.pow(1 / 3.0))return doubleArrayOf(l, a, b)}// ΔEab算法
    fun deltaEab(lab1: DoubleArray, lab2: DoubleArray): Double {val dL = lab1[0] - lab2[0]val da = lab1[1] - lab2[1]val db = lab1[2] - lab2[2]return sqrt(dL.pow(2) + da.pow(2) + db.pow(2))}// 改进的RGB转Lab(包含伽马校正和D65白点)
    fun rgbToLab(r: Int, g: Int, b: Int): DoubleArray {// 处理负值(如-2563864)val labR = if (r < 0) 0f else r / 255fval labG = if (g < 0) 0f else g / 255fval labB = if (b < 0) 0f else b / 255f// sRGB伽马校正val rLin = if (labR <= 0.04045) labR / 12.92 else ((labR + 0.055) / 1.055).pow(2.4)val gLin = if (labG <= 0.04045) labG / 12.92 else ((labG + 0.055) / 1.055).pow(2.4)val bLin = if (labB <= 0.04045) labB / 12.92 else ((labB + 0.055) / 1.055).pow(2.4)// D65标准光源XYZ转换val x = 0.4124564 * rLin + 0.3575761 * gLin + 0.1804375 * bLinval y = 0.2126729 * rLin + 0.7151522 * gLin + 0.0721750 * bLinval z = 0.0193339 * rLin + 0.1191920 * gLin + 0.9503041 * bLin// Lab转换(包含阈值处理)val xn = 0.95047val yn = 1.0val zn = 1.08883val fX = x / xnval fY = y / ynval fZ = z / znval l = if (fY > 0.008856) 116 * fY.pow(1 / 3.0) - 16 else 903.3 * fYval a = 500 * (fX.pow(1 / 3.0) - fY.pow(1 / 3.0))val b = 200 * (fY.pow(1 / 3.0) - fZ.pow(1 / 3.0))return doubleArrayOf(l, a, b)}// 改进的ΔE76色差公式(包含亮度权重)  *********
    fun deltaE76(lab1: DoubleArray, lab2: DoubleArray): Double {val (l1, a1, b1) = lab1val (l2, a2, b2) = lab2// 计算中间变量val c1 = sqrt(a1.pow(2) + b1.pow(2))val c2 = sqrt(a2.pow(2) + b2.pow(2))val cAvg = (c1 + c2) / 2val g = 0.5 * (1 - sqrt(cAvg.pow(7) / (cAvg.pow(7) + 25f.pow(7))))val a1p = a1 * (1 + g)val a2p = a2 * (1 + g)val c1p = sqrt(a1p.pow(2) + b1.pow(2))val c2p = sqrt(a2p.pow(2) + b2.pow(2))val h1p = Math.toDegrees(kotlin.math.atan2(b1, a1p)).let { if (it < 0) it + 360 else it }val h2p = Math.toDegrees(kotlin.math.atan2(b2, a2p)).let { if (it < 0) it + 360 else it }// 色差计算val deltaLp = l2 - l1val deltaCp = c2p - c1pval deltaHp = when {c1p * c2p == 0.0 -> 0.0abs(h2p - h1p) <= 180 -> h2p - h1ph2p <= h1p -> h2p - h1p + 360else -> h2p - h1p - 360}val deltaHpS = 2 * sqrt(c1p * c2p) * sin(Math.toRadians(deltaHp) / 2)// 加权计算val lAvg = (l1 + l2) / 2val cpAvg = (c1p + c2p) / 2val hpAvg = when {c1p * c2p == 0.0 -> h1p + h2pabs(h1p - h2p) > 180 -> (h1p + h2p + 360) / 2else -> (h1p + h2p) / 2}.let { if (it >= 360) it - 360 else it }val t = 1 - 0.17 * cos(Math.toRadians(hpAvg - 30)) +0.24 * cos(Math.toRadians(2 * hpAvg)) +0.32 * cos(Math.toRadians(3 * hpAvg + 6)) -0.20 * cos(Math.toRadians(4 * hpAvg - 63))val sl = 1 + (0.015 * (lAvg - 50).pow(2)) / sqrt(20 + (lAvg - 50).pow(2))val sc = 1 + 0.045 * cpAvgval sh = 1 + 0.015 * cpAvg * tval deltaTheta = 30 * exp(-((hpAvg - 275) / 25).pow(2))val rc = 2 * sqrt(cpAvg.pow(7) / (cpAvg.pow(7) + 25f.pow(7)))val rt = -rc * sin(2 * Math.toRadians(deltaTheta))return sqrt((deltaLp / sl).pow(2) +(deltaCp / sc).pow(2) +(deltaHpS / sh).pow(2) +rt * (deltaCp / sc) * (deltaHpS / sh))}/*** CIEDE2000色差公式实现* 更符合人眼感知的颜色差异计算* @param lab1 第一个颜色的Lab值* @param lab2 第二个颜色的Lab值* @return Double 色差值(ΔE越小颜色越接近)*/fun deltaE2000(lab1: DoubleArray, lab2: DoubleArray): Double {val (l1, a1, b1) = lab1val (l2, a2, b2) = lab2// 步骤1:计算色度val c1 = sqrt(a1.pow(2) + b1.pow(2))val c2 = sqrt(a2.pow(2) + b2.pow(2))val cAvg = (c1 + c2) / 2.0// 步骤2:计算补偿因子val g = 0.5 * (1.0 - sqrt(cAvg.pow(7) / (cAvg.pow(7) + 25.0.pow(7))))val a1Prime = a1 * (1.0 + g)val a2Prime = a2 * (1.0 + g)val c1Prime = sqrt(a1Prime.pow(2) + b1.pow(2))val c2Prime = sqrt(a2Prime.pow(2) + b2.pow(2))val cBarPrime = (c1Prime + c2Prime) / 2.0// 步骤3:计算色调角val h1Prime = toDegrees(atan2(b1, a1Prime)).let { if (it < 0) it + 360.0 else it }val h2Prime = toDegrees(atan2(b2, a2Prime)).let { if (it < 0) it + 360.0 else it }// 步骤4:计算基本差异val deltaLPrime = l2 - l1val deltaCPrime = c2Prime - c1Prime// 步骤5:计算色调差var deltaHPrime = 0.0if (c1Prime * c2Prime != 0.0) {val deltaHPrimeRaw = when {abs(h2Prime - h1Prime) <= 180.0 -> h2Prime - h1Primeh2Prime <= h1Prime -> h2Prime - h1Prime + 360.0else -> h2Prime - h1Prime - 360.0}deltaHPrime = 2.0 * sqrt(c1Prime * c2Prime) * sin(toRadians(deltaHPrimeRaw) / 2.0)}// 步骤6:计算加权平均值val lBar = (l1 + l2) / 2.0val cBar = (c1 + c2) / 2.0// 步骤7:计算色调平均值val hBarPrime = when {abs(h1Prime - h2Prime) > 180.0 -> (h1Prime + h2Prime + 360.0) / 2.0else -> (h1Prime + h2Prime) / 2.0}// 步骤8:计算补偿项val t = 1.0 - 0.17 * cos(toRadians(hBarPrime - 30.0)) +0.24 * cos(toRadians(2.0 * hBarPrime)) +0.32 * cos(toRadians(3.0 * hBarPrime + 6.0)) -0.20 * cos(toRadians(4.0 * hBarPrime - 63.0))// 步骤9:计算旋转项val deltaTheta = 30.0 * exp(-((hBarPrime - 275.0) / 25.0).pow(2))val rc = 2.0 * sqrt(cBarPrime.pow(7) / (cBarPrime.pow(7) + 25.0.pow(7)))val rt = -rc * sin(2.0 * toRadians(deltaTheta))// 步骤10:计算权重因子val sl = 1.0 + (0.015 * (lBar - 50.0).pow(2) / sqrt(20.0 + (lBar - 50.0).pow(2)))val sc = 1.0 + 0.045 * cBarPrimeval sh = 1.0 + 0.015 * cBarPrime * t// 步骤11:最终色差计算val term1 = (deltaLPrime / sl).pow(2)val term2 = (deltaCPrime / sc).pow(2)val term3 = (deltaHPrime / sh).pow(2)val term4 = rt * (deltaCPrime / sc) * (deltaHPrime / sh)return sqrt(term1 + term2 + term3 + term4)}// 优化的伽马校正函数fun preciseGammaExpand(c: Double) = if (c <= 0.04045) {c / 12.92} else {((c + 0.055) / 1.055).pow(2.4)}// 优化的Lab转换函数fun preciseF(t: Double) = if (t > 0.008856) {t.pow(1.0 / 3.0)} else {(7.787 * t) + (16.0 / 116.0)}/*** 优化的RGB转Lab转换方法* 使用更精确的浮点数计算和标准化处理*/fun rgbToLabOptimized(r: Int, g: Int, b: Int): DoubleArray {// 使用更精确的归一化val rNormalized = r / 255.0val gNormalized = g / 255.0val bNormalized = b / 255.0// 应用伽马校正val rLinear = preciseGammaExpand(rNormalized)val gLinear = preciseGammaExpand(gNormalized)val bLinear = preciseGammaExpand(bNormalized)// 使用D65标准光源的精确XYZ转换矩阵val x = 0.4124564 * rLinear + 0.3575761 * gLinear + 0.1804375 * bLinearval y = 0.2126729 * rLinear + 0.7151522 * gLinear + 0.0721750 * bLinearval z = 0.0193339 * rLinear + 0.1191920 * gLinear + 0.9503041 * bLinear// 使用CIE标准参考白点val refX = 0.95047val refY = 1.00000val refZ = 1.08883// 计算相对值val xRelative = x / refXval yRelative = y / refYval zRelative = z / refZval fx = preciseF(xRelative)val fy = preciseF(yRelative)val fz = preciseF(zRelative)// 计算Lab值val l = (116.0 * fy) - 16.0val a = 500.0 * (fx - fy)val bLab = 200.0 * (fy - fz)return doubleArrayOf(l, a, bLab)}/*** 完整的CIEDE2000色差公式实现* 包含所有补偿项和旋转项*/fun deltaE2000Complete(lab1: DoubleArray, lab2: DoubleArray): Double {val (l1, a1, b1) = lab1val (l2, a2, b2) = lab2// 步骤1:计算色度值val c1 = sqrt(a1.pow(2) + b1.pow(2))val c2 = sqrt(a2.pow(2) + b2.pow(2))// 步骤2:计算平均值val lBar = (l1 + l2) / 2.0val cBar = (c1 + c2) / 2.0// 步骤3:计算补偿因子val g = 0.5 * (1.0 - sqrt(cBar.pow(7) / (cBar.pow(7) + 25.0.pow(7))))// 步骤4:计算调整后的a'值val a1Prime = a1 * (1.0 + g)val a2Prime = a2 * (1.0 + g)// 步骤5:计算调整后的色度值val c1Prime = sqrt(a1Prime.pow(2) + b1.pow(2))val c2Prime = sqrt(a2Prime.pow(2) + b2.pow(2))val cBarPrime = (c1Prime + c2Prime) / 2.0// 步骤6:计算色调角val h1Prime = toDegrees(atan2(b1, a1Prime)).let {if (it < 0) it + 360.0 else it}val h2Prime = toDegrees(atan2(b2, a2Prime)).let {if (it < 0) it + 360.0 else it}// 步骤7:计算基本差异val deltaLPrime = l2 - l1val deltaCPrime = c2Prime - c1Prime// 步骤8:计算色调差var deltaHPrime = 0.0if (c1Prime != 0.0 && c2Prime != 0.0) {val deltaHPrimeRaw = when {abs(h2Prime - h1Prime) <= 180.0 -> h2Prime - h1Primeh2Prime <= h1Prime -> h2Prime - h1Prime + 360.0else -> h2Prime - h1Prime - 360.0}deltaHPrime = 2.0 * sqrt(c1Prime * c2Prime) * sin(toRadians(deltaHPrimeRaw) / 2.0)}// 步骤9:计算色调平均值val hBarPrime = when {abs(h1Prime - h2Prime) > 180.0 -> (h1Prime + h2Prime + 360.0) / 2.0else -> (h1Prime + h2Prime) / 2.0}// 步骤10:计算补偿项val t = 1.0 - 0.17 * cos(toRadians(hBarPrime - 30.0)) +0.24 * cos(toRadians(2.0 * hBarPrime)) +0.32 * cos(toRadians(3.0 * hBarPrime + 6.0)) -0.20 * cos(toRadians(4.0 * hBarPrime - 63.0))// 步骤11:计算旋转项val deltaTheta = 30.0 * exp(-((hBarPrime - 275.0) / 25.0).pow(2))val rc = 2.0 * sqrt(cBarPrime.pow(7) / (cBarPrime.pow(7) + 25.0.pow(7)))val rt = -rc * sin(2.0 * toRadians(deltaTheta))// 步骤12:计算权重因子val sl = 1.0 + (0.015 * (lBar - 50.0).pow(2) / sqrt(20.0 + (lBar - 50.0).pow(2)))val sc = 1.0 + 0.045 * cBarPrimeval sh = 1.0 + 0.015 * cBarPrime * t// 步骤13:最终色差计算val term1 = (deltaLPrime / sl).pow(2)val term2 = (deltaCPrime / sc).pow(2)val term3 = (deltaHPrime / sh).pow(2)val term4 = rt * (deltaCPrime / sc) * (deltaHPrime / sh)return sqrt(term1 + term2 + term3 + term4)}}
View Code
{"list": [{"r": 0,"g": 84,"b": 255},{"r": 18,"g": 92,"b": 255},{"r": 65,"g": 82,"b": 255},{"r": 90,"g": 81,"b": 255},{"r": 110,"g": 80,"b": 255},{"r": 127,"g": 78,"b": 255},{"r": 142,"g": 77,"b": 255},{"r": 157,"g": 76,"b": 255},{"r": 170,"g": 74,"b": 255},{"r": 197,"g": 70,"b": 255},{"r": 209,"g": 68,"b": 255},{"r": 237,"g": 62,"b": 255},{"r": 255,"g": 51,"b": 244},{"r": 255,"g": 35,"b": 219},{"r": 255,"g": 11,"b": 196},{"r": 255,"g": 0,"b": 176},{"r": 255,"g": 48,"b": 158},{"r": 255,"g": 19,"b": 142},{"r": 255,"g": 15,"b": 122},{"r": 255,"g": 0,"b": 99},{"r": 255,"g": 6,"b": 75},{"r": 255,"g": 9,"b": 55},{"r": 255,"g": 6,"b": 0},{"r": 255,"g": 28,"b": 0},{"r": 255,"g": 62,"b": 0},{"r": 255,"g": 85,"b": 0},{"r": 255,"g": 105,"b": 0},{"r": 255,"g": 125,"b": 0},{"r": 255,"g": 155,"b": 5},{"r": 255,"g": 171,"b": 41},{"r": 255,"g": 180,"b": 15},{"r": 255,"g": 192,"b": 19},{"r": 255,"g": 206,"b": 45},{"r": 255,"g": 218,"b": 27},{"r": 255,"g": 231,"b": 30},{"r": 255,"g": 244,"b": 34},{"r": 251,"g": 255,"b": 37},{"r": 235,"g": 255,"b": 38},{"r": 219,"g": 255,"b": 39},{"r": 203,"g": 255,"b": 40},{"r": 185,"g": 255,"b": 41},{"r": 165,"g": 255,"b": 42},{"r": 142,"g": 255,"b": 42},{"r": 109,"g": 255,"b": 29},{"r": 69,"g": 255,"b": 44},{"r": 24,"g": 255,"b": 46},{"r": 22,"g": 255,"b": 32},{"r": 0,"g": 255,"b": 102},{"r": 0,"g": 255,"b": 136},{"r": 6,"g": 209,"b": 128},{"r": 0,"g": 255,"b": 189},{"r": 0,"g": 255,"b": 212},{"r": 0,"g": 255,"b": 234},{"r": 0,"g": 254,"b": 255},{"r": 0,"g": 234,"b": 255},{"r": 0,"g": 200,"b": 255},{"r": 0,"g": 186,"b": 255},{"r": 0,"g": 173,"b": 255},{"r": 72,"g": 164,"b": 237},{"r": 2,"g": 146,"b": 255},{"r": 0,"g": 138,"b": 255},{"r": 0,"g": 127,"b": 255},{"r": 0,"g": 106,"b": 255},{"r": 255,"g": 255,"b": 255},{"r": 78,"g": 85,"b": 255},{"r": 100,"g": 150,"b": 255},{"r": 98,"g": 204,"b": 255},{"r": 103,"g": 172,"b": 156},{"r": 84,"g": 255,"b": 167},{"r": 58,"g": 255,"b": 112},{"r": 52,"g": 255,"b": 88},{"r": 149,"g": 95,"b": 255},{"r": 162,"g": 152,"b": 255},{"r": 171,"g": 228,"b": 255},{"r": 159,"g": 255,"b": 201},{"r": 130,"g": 255,"b": 142},{"r": 108,"g": 255,"b": 99},{"r": 97,"g": 255,"b": 74},{"r": 79,"g": 255,"b": 41},{"r": 236,"g": 101,"b": 254},{"r": 254,"g": 169,"b": 255},{"r": 225,"g": 255,"b": 170},{"r": 184,"g": 255,"b": 155},{"r": 155,"g": 255,"b": 75},{"r": 133,"g": 255,"b": 45},{"r": 255,"g": 86,"b": 196},{"r": 255,"g": 130,"b": 171},{"r": 255,"g": 175,"b": 146},{"r": 255,"g": 221,"b": 119},{"r": 235,"g": 255,"b": 95},{"r": 203,"g": 255,"b": 51},{"r": 255,"g": 68,"b": 138},{"r": 255,"g": 104,"b": 117},{"r": 255,"g": 140,"b": 95},{"r": 255,"g": 187,"b": 85},{"r": 255,"g": 217,"b": 49},{"r": 255,"g": 25,"b": 115},{"r": 255,"g": 40,"b": 96},{"r": 255,"g": 85,"b": 78},{"r": 255,"g": 116,"b": 59},{"r": 255,"g": 148,"b": 40},{"r": 255,"g": 45,"b": 62},{"r": 255,"g": 81,"b": 54},{"r": 255,"g": 98,"b": 33},{"r": 255,"g": 22,"b": 36},{"r": 255,"g": 49,"b": 35},{"r": 255,"g": 32,"b": 23},{"r": 35,"g": 55,"b": 255},{"r": 35,"g": 73,"b": 255},{"r": 35,"g": 94,"b": 255},{"r": 35,"g": 116,"b": 255},{"r": 65,"g": 145,"b": 255},{"r": 35,"g": 182,"b": 255},{"r": 35,"g": 214,"b": 255},{"r": 2,"g": 251,"b": 255},{"r": 0,"g": 255,"b": 223},{"r": 0,"g": 255,"b": 203},{"r": 22,"g": 255,"b": 168},{"r": 54,"g": 255,"b": 144},{"r": 58,"g": 55,"b": 255},{"r": 59,"g": 86,"b": 255},{"r": 61,"g": 120,"b": 255},{"r": 64,"g": 175,"b": 255},{"r": 66,"g": 225,"b": 255},{"r": 65,"g": 255,"b": 246},{"r": 83,"g": 255,"b": 211},{"r": 51,"g": 255,"b": 181},{"r": 46,"g": 255,"b": 156},{"r": 41,"g": 255,"b": 134},{"r": 37,"g": 255,"b": 115},{"r": 83,"g": 56,"b": 255},{"r": 84,"g": 67,"b": 255},{"r": 85,"g": 77,"b": 255},{"r": 86,"g": 104,"b": 255},{"r": 89,"g": 113,"b": 255},{"r": 90,"g": 126,"b": 255},{"r": 94,"g": 170,"b": 255},{"r": 102,"g": 242,"b": 255},{"r": 84,"g": 255,"b": 193},{"r": 68,"g": 255,"b": 140},{"r": 56,"g": 255,"b": 101},{"r": 110,"g": 58,"b": 255},{"r": 112,"g": 68,"b": 255},{"r": 116,"g": 91,"b": 255},{"r": 120,"g": 117,"b": 255},{"r": 124,"g": 145,"b": 255},{"r": 130,"g": 176,"b": 255},{"r": 149,"g": 222,"b": 255},{"r": 142,"g": 253,"b": 255},{"r": 127,"g": 255,"b": 216},{"r": 114,"g": 255,"b": 183},{"r": 103,"g": 255,"b": 156},{"r": 94,"g": 255,"b": 132},{"r": 86,"g": 255,"b": 111},{"r": 78,"g": 255,"b": 93},{"r": 72,"g": 255,"b": 77},{"r": 87,"g": 255,"b": 71},{"r": 62,"g": 255,"b": 51},{"r": 143,"g": 70,"b": 255},{"r": 140,"g": 112,"b": 255},{"r": 170,"g": 186,"b": 255},{"r": 178,"g": 255,"b": 240},{"r": 143,"g": 255,"b": 169},{"r": 118,"g": 255,"b": 119},{"r": 100,"g": 255,"b": 82},{"r": 85,"g": 255,"b": 53},{"r": 74,"g": 255,"b": 30},{"r": 178,"g": 72,"b": 255},{"r": 192,"g": 105,"b": 255},{"r": 195,"g": 127,"b": 255},{"r": 205,"g": 160,"b": 255},{"r": 216,"g": 198,"b": 255},{"r": 191,"g": 255,"b": 186},{"r": 173,"g": 255,"b": 155},{"r": 162,"g": 255,"b": 125},{"r": 143,"g": 255,"b": 106},{"r": 130,"g": 255,"b": 91},{"r": 121,"g": 255,"b": 71},{"r": 112,"g": 255,"b": 56},{"r": 104,"g": 255,"b": 43},{"r": 93,"g": 255,"b": 37},{"r": 217,"g": 74,"b": 255},{"r": 242,"g": 140,"b": 255},{"r": 255,"g": 199,"b": 240},{"r": 203,"g": 255,"b": 140},{"r": 169,"g": 255,"b": 94},{"r": 143,"g": 255,"b": 59},{"r": 124,"g": 255,"b": 33},{"r": 255,"g": 84,"b": 255},{"r": 255,"g": 112,"b": 255},{"r": 255,"g": 123,"b": 222},{"r": 255,"g": 148,"b": 208},{"r": 255,"g": 166,"b": 205},{"r": 255,"g": 194,"b": 204},{"r": 255,"g": 224,"b": 166},{"r": 255,"g": 251,"b": 151},{"r": 233,"g": 255,"b": 125},{"r": 210,"g": 255,"b": 91},{"r": 194,"g": 255,"b": 81},{"r": 179,"g": 255,"b": 63},{"r": 154,"g": 255,"b": 32},{"r": 158,"g": 255,"b": 37},{"r": 255,"g": 65,"b": 208},{"r": 255,"g": 108,"b": 184},{"r": 255,"g": 152,"b": 159},{"r": 255,"g": 198,"b": 133},{"r": 255,"g": 253,"b": 95},{"r": 220,"g": 255,"b": 67},{"r": 188,"g": 255,"b": 36},{"r": 255,"g": 57,"b": 176},{"r": 255,"g": 76,"b": 164},{"r": 255,"g": 96,"b": 153},{"r": 255,"g": 125,"b": 150},{"r": 255,"g": 136,"b": 130},{"r": 255,"g": 166,"b": 126},{"r": 255,"g": 176,"b": 106},{"r": 255,"g": 197,"b": 94},{"r": 255,"g": 223,"b": 88},{"r": 255,"g": 240,"b": 69},{"r": 248,"g": 255,"b": 56},{"r": 228,"g": 255,"b": 38},{"r": 255,"g": 36,"b": 167},{"r": 255,"g": 88,"b": 134},{"r": 255,"g": 122,"b": 106},{"r": 255,"g": 160,"b": 77},{"r": 255,"g": 207,"b": 86},{"r": 255,"g": 237,"b": 37},{"r": 255,"g": 41,"b": 143},{"r": 255,"g": 61,"b": 116},{"r": 255,"g": 84,"b": 111},{"r": 255,"g": 94,"b": 96},{"r": 255,"g": 110,"b": 86},{"r": 255,"g": 127,"b": 76},{"r": 255,"g": 144,"b": 65},{"r": 255,"g": 162,"b": 55},{"r": 255,"g": 179,"b": 44},{"r": 255,"g": 197,"b": 33},{"r": 255,"g": 70,"b": 88},{"r": 254,"g": 107,"b": 64},{"r": 255,"g": 132,"b": 50},{"r": 255,"g": 164,"b": 30},{"r": 255,"g": 22,"b": 98},{"r": 255,"g": 50,"b": 80},{"r": 254,"g": 89,"b": 64},{"r": 255,"g": 92,"b": 54},{"r": 255,"g": 121,"b": 36},{"r": 255,"g": 138,"b": 37},{"r": 255,"g": 111,"b": 25},{"r": 255,"g": 41,"b": 54},{"r": 255,"g": 53,"b": 46},{"r": 255,"g": 78,"b": 30},{"r": 255,"g": 61,"b": 28},{"r": 255,"g": 39,"b": 37},{"r": 255,"g": 57,"b": 18},{"r": 255,"g": 29,"b": 15},{"r": 255,"g": 14,"b": 8}]
}
color_rgb_256.json

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/943208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完整教程:Oracle/MySQL/SqlServer/PostgreSQL等数据库的数据类型映射以及各版本数据类型情况说明

完整教程:Oracle/MySQL/SqlServer/PostgreSQL等数据库的数据类型映射以及各版本数据类型情况说明2025-10-22 11:20 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !i…

老弟第一次学 Redis,被坑惨了!小白可懂的保姆级 Redis 教程

这天,产品经理找到你:阿巴阿巴,用户吐槽咱们网站首页加载太慢,快优化!你是小阿巴,刚入职的程序员。 这天,产品经理找到你:阿巴阿巴,用户吐槽咱们网站首页加载太慢,快优化! 你打开监控一看,好家伙!每秒有…

中小企业如何低成本部署电话呼叫软件网页版?一步步教你做

对于许多中小企业而言,电话沟通依然是销售、客服、售后等场景中最直接、最高效的方式。但当业务量增长、员工分布分散后,传统电话模式的问题也随之暴露:号码分散难管理、通话费用高、数据无法留存、外呼行为缺乏监管…

别再手写过滤器!SpringCloud Gateway 内置30 个,少写 80% 重复代码

大家好,我是小富~ 我发现公司的网关项目里有很多的轮子,几乎每个人接手这个项目开发,都会自定义过滤器,导致有非常非常多的过滤器,修改其中一个,指不定就会影响其他的人功能,非常的恼火。 其实在 Spring Cloud…

PCB库文档处理工具

PCB库文档处理工具封装库文档图元清理工具

完整教程:如何更改 SQLserver 数据库存储的位置 想从C盘换到D盘

完整教程:如何更改 SQLserver 数据库存储的位置 想从C盘换到D盘pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…

实用指南:Linux 如何创建和计数套接字

实用指南:Linux 如何创建和计数套接字pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

(web cad drawing)Web CAD SDK Integration Method

Preface We have created an online CAD project based on mxcad, which includes various CAD functions such as previewing, editing drawings, and operating the drawing database. After user integration, it s…

记一次 .NET 某药品缺陷高速检测系统 卡慢分析

一:背景 1. 讲故事 上个月有位朋友找到我,说他们公司的程序当内存达到一定阈值(2g+)之后,业务逻辑明显变慢导致下位机超时报警,想让我看下到底怎么回事,这种问题其实抓dump比较难搞,但朋友也说了有一个增长阈值,…

0254-CLAP-参数默认值

环境Time 2022-12-02 WSL-Ubuntu 22.04 CLAP 4.0.29前言 说明 参考:https://docs.rs/clap/latest/clap/index.html 目标 如果没有提供参数,使用默认值。 Cargo.toml [package] edition = "2021" name = &q…

得物火山引擎:Data Agent驱动财务管理智能升级

作为新一代品质生活购物社区,得物 App 以正品电商和品质生活社区作为两大核心服务,成立十年来,得物 App 始终致力于帮助用户得到美好生活,90后用户占比超9成,已成为年轻用户重要的品质生活购物平台。随着 AI 时代…

WPF/C#:使用Stylet中的IWindowManager用于显示等待窗体、对话框与消息框

前言 显示等待框意义 在创建WPF应用的时候,如果我们要执行一个耗时的操作,那么给用户显示一个等待窗体是很常见的需求,通过显示一个等待窗体让用户明白运行的这个软件并没有崩溃,能有效消除用户的焦虑与不确定性,…

2025年钢花钢管厂家最新行业资讯推荐,注浆钢管/超前小导钢管/袖阀钢管/地质钢管/管棚钢管/岩心钢管/基建与矿业升级驱动需求,高品质钢管如何选?最新实力厂商推荐榜发布

随着国家在基础设施建设、能源勘探及矿山开发等领域的持续投入,2025年市场对高品质、高规格钢管的需求预计将进一步提升。尤其在隧道支护、地质加固、精密设备制造等场景中,钢管的材质、精度与耐久性直接关系到工程安…

训练常用

1 利用 Screen 保持 VSCode 连接远程任务持续运行 1.1 远程连接 在 Linux 上使用 screen 是一种保持进程持续运行的便捷方式,即使用户断开 SSH 连接,进程也不会中断。连接远程服务器 首先使用 VSCode 或者 PyCharm 连…

《Vuejs设计与实现》第 18 章(同构渲染)(上) - 详解

《Vuejs设计与实现》第 18 章(同构渲染)(上) - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

配置git

1 从项目中去掉现有的 Git 信息,并重新建立新的 Git 仓库 删除原有的 Git 信息:打开命令行工具,进入项目所在的目录。 执行以下命令以删除 .git 文件夹,这将移除所有的 Git 版本控制信息:对于 Linux 和 macOS: rm…

0253-CLAP-统计参数出现次数

环境Time 2022-12-02 WSL-Ubuntu 22.04 CLAP 4.0.29前言 说明 参考:https://docs.rs/clap/latest/clap/index.html 目标 统计参数出现的次数。 Cargo.toml [package] edition = "2021" name = "game&q…

什么情况下有必要使用抽象基类ABC?

在面向对象编程中,抽象基类(Abstract Base Class,简称ABC) 是一种不能被实例化的特殊类,其主要作用是定义一组子类必须实现的接口(方法或属性),从而强制子类遵循统一的规范。 抽象基类的核心特点:不能实例化:…

实用指南:TensorFlow2 Python深度学习 - 深度学习概述

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

HTTP/2协议漏洞引发史上最大DDoS攻击——Rapid Reset技术深度解析

本文深度解析基于HTTP/2协议CVE-2023-44487漏洞的Rapid Reset DDoS攻击技术细节。该攻击峰值达每秒3.98亿请求,仅用2万台机器就打破历史记录,文章还探讨了TCP连接终止等防御方案。史上最大DDoS攻击:Rapid Reset技术…