猫史档案馆


【cdil3】如何根据颜色,找到最近似的方块?

用户:86135clc86135clc查看:1 回复:11 评论:1 创建时间:2021-08-07T17:24:32


注:为了方便,此处使用RGB 255。

第一步

当然是枚举所有纯色方块及其颜色。。。

代码:

var color={cadet_blue:[0x37,0x62,0x9c],sky_blue:[0x58,0xaa,0xe7],powder_blue:[0xc1,0xec,0xf8],dark_gray:[0x42,0x42,0x42],light_gray:[0xae,0xae,0xae],olive_green:[0x75,0x8f,0x38],yellow_green:[0xb0,0xcc,0x4c],pale_green:[0xd2,0xe0,0x89],red:[0xf5,0x0e,0x0e],dark_red:[0x9e,0x19,0x06],brick_red:[0xde,0x4a,0x4a],medium_gray:[0x71,0x71,0x71],dark_slate_blue:[0x28,0x35,0x73],pink:[0xff,0x7d,0x9c],sakura_pink:[0xff,0xbf,0xe2],orange:[0xff,0x94,0x0e],lemon:[0xff,0xf7,0x4c],black:[0,0,0],white:[255,255,255],blue:[0,0,255],turquoise:[0x4d,0xd0,0xe1],dark_orchid:[0x7b,0x1f,0xa2],medium_orchid:[0xba,0x68,0xc8],medium_purple:[0x8b,0x8c,0xde],medium_violet_red:[0xdd,0x34,0x8d],manoon:[0x83,0x31,0],coffee_gray:[0x79,0x55,0x48],peru:[0xbb,0x75,0x47],dark_salmon:[0xdb,0xa4,0x63],navajo_white:[0xfb,0xdf,0x9b],orange_red:[0xe6,0x51,0],medium_yellow:[0xff,0xd5,0x41],sienna:[0x84,0x6b,0x29],mint_green:[0xb7,0xff,0xa4],medium_spring_green:[0x37,0xff,0xc1]}
var c_name=[];for(i in color){c_name.push(i)}//为了方便,创建了两个数组
var c_value=[];for(i in color){c_value.push(color[i])}

第二步

实现计算两个颜色之间的差距。

偷懒emotion_doge,在网上找了个公式喵cmetric.htm

反正我也不懂那个公式的原理。。。

代码:

function colordiff(c1,c2){r=(c1[0]+c2[0])/2;dr=c1[0]-c2[0];dg=c1[1]-c2[1];db=c1[2]-c2[2];
return Math.pow((2+r/256)*Math.pow(dr,2)+4*Math.pow(dg,2)+(2+(255-r)/256)*Math.pow(db,2),0.5);}

第三步

在所有纯色方块中,找出最近似的方块。

代码:

function choose(c){
a=[];for(i of c_value)a.push(Math.abs(colordiff(c,i)));min=9999;min_=-1;
for(i=0;i<a.length;++i){if(a[i]<min){min=a[i];min_=i;}}
return c_name[min_];}

接下来,调用choose([r,g,b]),它会根据颜色找到最近似的方块。

例子:

choose([255,0,0])
"red"
choose([0,255,0])
"olive_green"
choose([0,0,255])
"blue"
choose([255,0,255])
"medium_violet_red"
choose([255,255,0])
"lemon"
choose([0,255,255])
"medium_spring_green"

 


回复

上一页1 页 / 共 1下一页
86135clc86135clc

sofa

点赞0


评论


七式草莓七式草莓

完整版:

var color = {
    cadet_blue: [0x37, 0x62, 0x9c],
    sky_blue: [0x58, 0xaa, 0xe7],
    powder_blue: [0xc1, 0xec, 0xf8],
    dark_gray: [0x42, 0x42, 0x42],
    light_gray: [0xae, 0xae, 0xae],
    olive_green: [0x75, 0x8f, 0x38],
    yellow_green: [0xb0, 0xcc, 0x4c],
    pale_green: [0xd2, 0xe0, 0x89],
    red: [0xf5, 0x0e, 0x0e],
    dark_red: [0x9e, 0x19, 0x06],
    brick_red: [0xde, 0x4a, 0x4a],
    medium_gray: [0x71, 0x71, 0x71],
    dark_slate_blue: [0x28, 0x35, 0x73],
    pink: [0xff, 0x7d, 0x9c],
    sakura_pink: [0xff, 0xbf, 0xe2],
    orange: [0xff, 0x94, 0x0e],
    lemon: [0xff, 0xf7, 0x4c],
    black: [0, 0, 0],
    white: [255, 255, 255],
    blue: [0, 0, 255],
    turquoise: [0x4d, 0xd0, 0xe1],
    dark_orchid: [0x7b, 0x1f, 0xa2],
    medium_orchid: [0xba, 0x68, 0xc8],
    medium_purple: [0x8b, 0x8c, 0xde],
    medium_violet_red: [0x喵, 0x34, 0x8d],
    manoon: [0x83, 0x31, 0],
    coffee_gray: [0x79, 0x55, 0x48],
    peru: [0xbb, 0x75, 0x47],
    dark_salmon: [0xdb, 0xa4, 0x63],
    navajo_white: [0xfb, 0xdf, 0x9b],
    orange_red: [0xe6, 0x51, 0],
    medium_yellow: [0xff, 0xd5, 0x41],
    sienna: [0x84, 0x6b, 0x29],
    mint_green: [0xb7, 0xff, 0xa4],
    medium_spring_green: [0x37, 0xff, 0xc1]
},
    c_name = [], c_value = [];
for (i in color) {
    c_name.push(i);
    c_value.push(color[i]);
};
function colordiff(c1, c2) {
    r = (c1[0] + c2[0]) / 2;
    dr = c1[0] - c2[0];
    dg = c1[1] - c2[1];
    db = c1[2] - c2[2];
    return Math.pow(
        (2 + r / 256) *
        Math.pow(dr, 2) +
        4 *
        Math.pow(dg, 2) +
        (2 + (255 - r) / 256) *
        Math.pow(db, 2),
        0.5
    );
};
function choose(c) {
    a = [];
    for (i of c_value) a.push(Math.abs(colordiff(c, i)));
    min = 9999;
    min_ = -1;
    for (i = 0; i < a.length; ++i) {
        if (a[i] < min) {
            min = a[i];
            min_ = i;
        }
    };
    return c_name[min_];
};

点赞0


评论


86135clc86135clc

挖坟

点赞0


评论


不知道该叫啥的一只萌新不知道该叫啥的一只萌新

ddd

点赞0


评论


TobylaiTobylai

emotion_good

点赞1


评论


86135clc86135clc

考古

点赞0


评论


86135clc86135clc

考古

点赞0


评论


指令者指令者

emotion_good

点赞0


评论


86135clc86135clc

挖坟

点赞0


评论


86135clc86135clc

color={"cadet_blue":[0x37,0x62,0x9c],"sky_blue":[0x58,0xaa,0xe7],"powder_blue":[0xc1,0xec,0xf8],"dark_gray":[0x42,0x42,0x42],"light_gray":[0xae,0xae,0xae],"olive_green":[0x75,0x8f,0x38],"yellow_green":[0xb0,0xcc,0x4c],"pale_green":[0xd2,0xe0,0x89],"red":[0xf5,0x0e,0x0e],"dark_red":[0x9e,0x19,0x06],"brick_red":[0xde,0x4a,0x4a],"medium_gray":[0x71,0x71,0x71],"dark_slate_blue":[0x28,0x35,0x73],"pink":[0xff,0x7d,0x9c],"sakura_pink":[0xff,0xbf,0xe2],"orange":[0xff,0x94,0x0e],"lemon":[0xff,0xf7,0x4c],"black":[0,0,0],"white":[255,255,255],"blue":[0,0,255],"turquoise":[0x4d,0xd0,0xe1],"dark_orchid":[0x7b,0x1f,0xa2],"medium_orchid":[0xba,0x68,0xc8],"medium_purple":[0x8b,0x8c,0xde],"medium_violet_red":[0xdd,0x34,0x8d],"manoon":[0x83,0x31,0],"coffee_gray":[0x79,0x55,0x48],"peru":[0xbb,0x75,0x47],"dark_salmon":[0xdb,0xa4,0x63],"navajo_white":[0xfb,0xdf,0x9b],"orange_red":[0xe6,0x51,0],"medium_yellow":[0xff,0xd5,0x41],"sienna":[0x84,0x6b,0x29],"mint_green":[0xb7,0xff,0xa4],"medium_spring_green":[0x37,0xff,0xc1]}
name=list(color.keys())
value=list(color.values())
def colordiff(c1,c2):
	r=(c1[0]+c2[0])/2
	R=c1[0]-c2[0]
	G=c1[1]-c2[1]
	B=c1[2]-c2[2]
	return pow((2+r/256)*pow(R,2)+4*pow(G,2)+(2+((255-r)/256))*pow(B,2),0.5)
def choose(c):
	a=[]
	for i in value:
		a.append(abs(colordiff(c,i)))
	min_=9999
	_min=-1
	for i in range(len(a)):
		if(a[i]<min_):
			min_=a[i]
			_min=i
	return name[_min]

点赞0


评论


86135clc86135clc

挖坟

点赞0


评论