- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否有一些约定将 HSL 色环划分为度数范围以定义基本颜色?
例如,80-150 度将被视为绿色,210-280 度将被视为蓝色,依此类推。
我想自动检测属于某个“颜色组”的像素颜色,发现 HSL 可以很好地确定色调。就我的目的而言,定义红色、橙色、黄色、绿色、青色、蓝色、洋红色、粉色的边界就足够了。
这种划分是否已经有解决方案?
编辑
在悬赏之前,我会添加更多推理和示例...
我的最终想法是通过主色来索引我们图像的库存,因此我可以将颜色作为一个查询参数。
我已经定义了一些边界如何划分 HSL 色轮:
1-15 red
16-50 orange
51-72 yellow
73-155 green
156-185 cyan
186-268 blue
269-310 magenta
311-344 pink
345-359 red
我有一个函数来确定像素的颜色:
function getPixelTone(pixel) {
let [ hue, sat, light ] = rgbToHsl( ...pixel );
sat = parseInt(sat);
light = parseInt(light);
if ( light < 3 || sat < 50 && light < 5 ) {
return 'black';
}
if ( light > 96 ) {
return 'white';
}
if ( hue === 0 || isPixelGray(pixel) ) {
return 'gray';
}
if ( (hue > 0 && hue < 16 ) || (hue > 344 && hue < 360 ) ) {
if ( light > 55 ) {
return 'pink';
}
if ( light < 34 || ( sat < 30 && light < 80 ) ) {
return 'brown';
}
return 'red';
}
if ( hue > 15 && hue < 51 ) {
if ( light < 34 ) {
return 'brown';
}
return 'orange';
}
if ( hue > 50 && hue < 73 ) {
return 'yellow';
}
if ( hue > 72 && hue < 156 ) {
return 'green';
}
if ( hue > 155 && hue < 186 ) {
return 'cyan';
}
if ( hue > 185 && hue < 269 ) {
return 'blue';
}
if ( hue > 268 && hue < 311 ) {
return 'magenta';
}
if ( hue > 310 && hue < 345 ) {
return 'pink';
}
return 'color';
}
功能
rgbToHsl
来自模块
rgb-to-hsl , 功能
isPixelGray
定义如下:
function isPixelGray(pixel) {
if ( Math.max(pixel) - Math.min(pixel) < 3 ) {
return true;
}
return false;
}
所以我的问题的所有目的是将像素量化为最简单的感知颜色之一。我认为这些颜色是:
红色、橙色、黄色、绿色、青色、蓝色、品红色、粉色、棕色、黑色 , 和
白色 , 它还可以包括
米色 如果它可以很容易地确定。
最佳答案
在这里,您有一个色轮,当您将其悬停时,它会从像素中确定最简单的颜色,它由纯 组成。 JS .在函数 getColorFromWheel()
你会得到 rba
值,然后将其转换为 hsl
.当它转换为 hsl
函数getColorNameFromHsl()
决定什么颜色 它是,然后它只显示 <div>
中的值.如果您想要更精确的颜色,您可以找到更精确的 rba
列表。或 hsl
颜色来命名数组并使其发挥作用。
这是一个可以转换 rba
的库颜色到名称:Name that color
希望这个解决方案对您有所帮助。
function newEl(tag){return document.createElement(tag)}
window.addEventListener('load', onDocLoaded, false);
function onDocLoaded(evt)
{
var wheel = makeColorWheel(256);
wheel.addEventListener('mousemove', getColorFromWheel);
document.body.appendChild( wheel );
}
var convertToHsl = function convertToHsl(rgbArr) {
var r1 = Number(rgbArr[0]) / 255, g1 = Number(rgbArr[1]) / 255, b1 = Number(rgbArr[2]) / 255;
var maxColor = Math.max(r1,g1,b1), minColor = Math.min(r1,g1,b1);
var L = (maxColor + minColor) / 2 , S = 0, H = 0;
if(maxColor != minColor){
if(L < 0.5){
S = (maxColor - minColor) / (maxColor + minColor);
}else{
S = (maxColor - minColor) / (2.0 - maxColor - minColor);
}
if(r1 == maxColor){
H = (g1-b1) / (maxColor - minColor);
}else if(g1 == maxColor){
H = 2.0 + (b1 - r1) / (maxColor - minColor);
}else{
H = 4.0 + (r1 - g1) / (maxColor - minColor);
}
}
L = L * 100;
S = S * 100;
H = H * 60;
if(H<0){
H += 360;
}
return {h:H, s:S, l:L};
}
var getColorNameFromHsl = function (hsl) {
var l = Math.floor(hsl.l), s = Math.floor(hsl.s), h = Math.floor(hsl.h);
if (s <= 10 && l >= 90) {
return ("White")
} else if ((s <= 10 && l <= 70) || s === 0) {
return ("Gray")
} else if (l <= 15) {
return ("Black")
} else if ((h >= 0 && h <= 15) || h >= 346) {
return ("Red");
} else if (h >= 16 && h <= 35) {
if (s < 90) {
return ("Brown");
} else {
return ("Orange");
}
} else if (h >= 36 && h <= 54) {
if (s < 90) {
return ("Brown");
} else {
return ("Yellow");
}
} else if (h >= 55 && h <= 165) {
return ("Green");
} else if (h >= 166 && h <= 260) {
return ("Blue")
} else if (h >= 261 && h <= 290) {
return ("Purple")
} else if (h >= 291 && h <= 345) {
return ("Pink")
}
}
var hsv2rgb = function(hsv) {
var h = hsv.hue, s = hsv.sat, v = hsv.val;
var rgb, i, data = [];
if (s === 0) {
rgb = [v,v,v];
} else {
h = h / 60;
i = Math.floor(h);
data = [v*(1-s), v*(1-s*(h-i)), v*(1-s*(1-(h-i)))];
switch(i) {
case 0:
rgb = [v, data[2], data[0]];
break;
case 1:
rgb = [data[1], v, data[0]];
break;
case 2:
rgb = [data[0], v, data[2]];
break;
case 3:
rgb = [data[0], data[1], v];
break;
case 4:
rgb = [data[2], data[0], v];
break;
default:
rgb = [v, data[0], data[1]];
break;
}
}
return rgb;
};
function clamp(min, max, val)
{
if (val < min) return min;
if (val > max) return max;
return val;
}
function makeColorWheel(diameter)
{
var can = newEl('canvas');
var ctx = can.getContext('2d');
can.width = diameter;
can.height = diameter;
var imgData = ctx.getImageData(0,0,diameter,diameter);
var maxRange = diameter / 2;
for (var y=0; y<diameter; y++)
{
for (var x=0; x<diameter; x++)
{
var xPos = x - (diameter/2);
var yPos = (diameter-y) - (diameter/2);
var polar = pos2polar( {x:xPos, y:yPos} );
var sat = clamp(0,1,polar.len / ((maxRange/2)));
var val = clamp(0,1, (maxRange-polar.len) / (maxRange/2) );
var rgb = hsv2rgb( {hue:polar.ang, sat:sat, val:val} );
var index = 4 * (x + y*diameter);
imgData.data[index + 0] = rgb[0]*255;
imgData.data[index + 1] = rgb[1]*255;
imgData.data[index + 2] = rgb[2]*255;
imgData.data[index + 3] = 255;
}
}
ctx.putImageData(imgData, 0,0);
return can;
}
function deg2rad(deg)
{
return (deg / 360) * ( 2 * Math.PI );
}
function rad2deg(rad)
{
return (rad / (Math.PI * 2)) * 360;
}
function pos2polar(inPos)
{
var vecLen = Math.sqrt( inPos.x*inPos.x + inPos.y*inPos.y );
var something = Math.atan2(inPos.y,inPos.x);
while (something < 0)
something += 2*Math.PI;
return { ang: rad2deg(something), len: vecLen };
}
function getColorFromWheel(event)
{
var can = this;
var ctx = can.getContext('2d');
var color = document.getElementById('color');
var x = event.layerX;
var y = event.layerY;
var pixel = ctx.getImageData(x, y, 1, 1);
var data = pixel.data;
var rgba = 'rgba(' + data[0] + ',' + data[1] +
',' + data[2] + ',' + (data[3] / 255) + ')';
colorName.style.background = rgba;
var rgbArray = [data[0], data[1], data[2]];
var color = getColorNameFromHsl(convertToHsl(rgbArray));
colorName.textContent = color;
}
div {
width: 200px;
height: 100px;
float: right;
border-radius: 25px;
text-align: center;
vertical-align: middle;
line-height: 100px;
}
<div id="colorName" ></div>
关于javascript - 如何确定像素的颜色或色调对应于某种颜色的度数范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66762405/
我正在使用 Selenium Web 驱动程序 3.0,并且想要从打开的两个对话框(一个在后台,第二个在前台)的 Activity 对话框中单击“确定”按钮。如何从 html 下面的父 div 单击前
actions: [ FlatButton( onPressed: () {
我有一个问题有点超出我的范围(我真的很高兴我是 Beta)涉及重复项(所以 GROUP BY, HAVING, COUNT),通过将解决方案保留在 SQLite 附带的标准函数中而变得更加复杂。我正在
使用DBI是否可以确定SELECT语句的已执行语句句柄是否返回任何行而不从中获取行? IE。就像是: use DBI; ... my $sth = $dbh->prepare("SELECT ..."
是否可以为“确定”和“关闭”按钮指定回调函数? 如果是JQuery Modal,则可以在初始化时使用按钮字典指定回调函数。 Semantic-ui模态是否提供类似的功能?按下确定后,我该如何寻求其他逻
我想阅读警报中的消息。 示例:如果警报显示“错误的电子邮件地址”。怎么读呢?意味着我想将该消息存储在字符串中。 如何在“警报”中单击“确定”...?? 如何使用 Selenium 来做到这一点? 最佳
我有一个删除按钮: 我试图首先查明是否已选择一个网站,如果已选择一个网站,我需要确定是否已选择一个或多个列表项,如果是,则继续删除这些项目。 我的 if 语句不断返回“您必须首先选择您的列表”,即使它
部分出于好奇——我们想知道在我们的应用程序中发生了什么——部分是因为我们需要在我们的代码中找到一些潜在的问题,我喜欢在我们的网络应用程序运行时跟踪一些一般值。这尤其包括某些对象图的分配内存。 我们的应
我将 SweetAlert 与 Symfony 结合使用,我希望用户在完成删除操作之前进行确认。 发生的情况是,当用户单击删除按钮时,SweetAlert 会弹出,然后立即消失,并且该项目被删除。 在
我们有一个应用程序可以生成不包括字母 O 的随机基数 35 [0-9A-Z]。我正在寻找一种解决方案来查找包含任何淫秽英语单词的代码,而无需搜索包含 10,000 个条目的列表每个生成的代码。每秒生成
这是我做的: #include #include int betweenArray(int a, int b){ int *arr,i,range; range = b - a +
我知道如何创建 警报和确认框,但我不知道如何做的是实际单击“确定”。我有一个弹出确认框的页面。 我想使用 Java Script 插件单击“确定”。基本上,我希望我的代码单击页面上的链接,然后在出现提
代码: swal('Your ORDER has been placed Successfully!!!'); window.location="index.php"; 甜蜜警报工
>>> import re >>> s = "These are the words in a sentence" >>> regex = re.compile('are|words') >>> [m
使用确定的理想散列函数给出随机期望线性时间算法两个数组 A[1..n] 和 B[1..n] 是否不相交,即 A 的元素是否也是 B 的元素。 谁能告诉我如何做到这一点,甚至如何开始考虑它? 最佳答案
我在计算机科学课上有这段代码: int input=15; while (input < n ) { input = input *3;} 这段代码有 log3(n/15) 次循环的上限。我们怎样才能
我有一个允许 2 位玩家玩 TicTacToe 的程序。在每个玩家移动之后,它应该在那个点显示棋盘并返回一个名为 Status 的枚举,显示玩家是否应该继续,如果玩家赢了,还是平局。但是,该算法要么返
给定一个 y 值数组,例如 [-3400, -1000, 500, 1200, 3790],我如何确定“好的”Y 轴标签并将它们放置在网格上? ^ ---(6,000)-|---
假设我有一个检查用户登录的 SQL 语句: SELECT * FROM users WHERE username='test@example.com', password='abc123', expi
teradata中有返回表中哪一列被定义为主索引的命令吗?我没有制作一些我正在处理的表,也没有尝试优化我对这些表的连接。谢谢! 最佳答案 有dbc.IndicesV,其中IndexNumber=1表示
我是一名优秀的程序员,十分优秀!