- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找从图像中获取颜色托盘。
我可以从图像中获取RGB数据
getRgbData() {
this.canvas = window.document.createElement('canvas')
this.context = this.canvas.getContext('2d')
this.width = this.canvas.width = image.width || image.naturalWidth
this.height = this.canvas.height = image.height || image.naturalHeight
this.context.drawImage(image, 0, 0, this.width, this.height)
return this.context.getImageData(0, 0, this.width, this.height)
}
并将RGB值转换为HSV模型(从https://gist.github.com/mjackson/5311256#file-color-conversion-algorithms-js-L1编写的rgbToHsv方法)
getHsvData() {
const { data, width, height } = this.getRgbData()
const pixcel = width * height
const q = 1
const array = []
for (var i = 0, r, g, b, offset; i < pixcel; i = i + q) {
offset = i * 4
r = data[offset + 0]
g = data[offset + 1]
b = data[offset + 2]
array.push({ r, g, b })
}
return array.map(l => this.rgbToHsv(l.r, l.g, l.b))
}
结果是这样的(它是从 RGB 24 位转换的数据)
[
{h: 0.6862745098039215, s: 0.7727272727272727, v: 0.17254901960784313},
{h: 0.676470588235294, s: 0.723404255319149, v: 0.1843137254901961},
.....
]
color-thief和 vibrant.js是从 RGB 模型中获取主色,但我想从转换后的 HSV 模型中获取主色。(我听说从HSV中提取颜色更适合人眼,是吗?)
如何从 HSV 模型中提取颜色......?
最佳答案
我们需要做的第一件事是获取图像的平均颜色。我们可以通过单独添加每个颜色 channel 然后除以 Canvas 的高度和宽度来做到这一点。
function channelAverages(data, width, height) {
let r = 0, g = 0, b = 0
let totalPixels = width * height
for (let i = 0, l = data.data.length; i < l; i += 4) {
r += data.data[i]
g += data.data[i + 1]
b += data.data[i + 2]
}
return {
r: Math.floor(r / totalPixels),
g: Math.floor(g / totalPixels),
b: Math.floor(b / totalPixels)
}
}
接下来,我们要将返回的颜色平均值转换为 HSL,我们可以使用此函数(您也可以链接到上面的函数)来完成此操作。
function rgbToHsl(r, g, b) {
r /= 255, g /= 255, b /= 255;
var max = Math.max(r, g, b), min = Math.min(r, g, b);
var h, s, l = (max + min) / 2;
if (max == min) {
h = s = 0; // achromatic
} else {
var d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch (max) {
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
case g: h = (b - r) / d + 2; break;
case b: h = (r - g) / d + 4; break;
}
h /= 6;
}
return [h, s, l];
}
因此,为了获得输出,我们可以这样做:
let data = ctx.getImageData(0, 0, canvas.width, canvas.height)
let avg = channelAverages(data, width, height)
console.log(rgbToHsl(avg.r, avg.g, avg.b))
如果我们想要可以在编辑器(例如 PhotoShop 或 Gimp)中使用的数字来验证我们的结果,我们只需将每个数字相乘即可:
h = h * 360
Example: 0.08 * 360 = 28.8
s = s * 100
Example: 0.85 * 100 = 85
l = l * 100
Example: 0.32 * 100 = 32
关于javascript - 从 HSV 模型中提取 'dominant' 颜色? (不是来自 RGB 模型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49311877/
我正在寻找一个单一的元函数(例如 std::less_equal),它可以被使用或组合以表达支配关系,定义如下。 序列 A 支配另一个序列 B(两者具有相同的长度)如果: A的每个元素均不小于对应的元
关闭。这个问题需要更多 focused .它目前不接受答案。 想要改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭3年前。 Improve this que
使用 llvm pass 插入指令时出现以下错误: Instruction does not dominate all uses! %add = add nsw i32 10, 2 %cmp3 = i
使用 llvm pass 插入指令时出现以下错误: Instruction does not dominate all uses! %add = add nsw i32 10, 2 %cmp3 = i
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 3年前关闭。 Improve thi
这是我的 csv 文件中的一个示例(假设 xxxx.img 实际上是 http://my.website.me/xxxx.img ) LHS_itemname,LHS_img, LHS_color,
我已经解决了更通用的 N Queens 问题,但现在我正在寻找一种算法来解决 N Queens Domination 问题。 "Given an n×n board, find the dominat
我正在做一个项目,我需要分析一页文本和几页文本的集合以确定主导词。我想知道是否有一个库(更喜欢 c# 或 java)可以为我处理繁重的工作。如果没有,是否有一种或多种算法可以实现我的以下目标。 我想要
我已经使用 Dominate 库创建了表,但现在我想更改我的表类。有人可以帮我做吗? doc1 = dominate.document(title='Dominate your HTML')
我正在尝试根据 vector 中的坐标是否被其他坐标包围或支配来对它们进行排序。例如,坐标 [1 , 2 , 1 , 1] 被 [4, 2 , 1 , 2] 包围或控制,即使两者的第二个和第三个值坐标
在 Android Studio 中转储堆并查看创建的快照后,有一个名为“支配大小”的字段。它代表什么? 最佳答案 这是该对象的大小加上它通过直接或间接引用保持 Activity 状态的所有内容。 我
编辑:为了清晰起见,更改了示例 df 我有一个数据框,类似于下面给出的数据框(除了真实的数据框有几千行和几千列,并且值是 float ): df = pd.DataFrame([[6,5,4,3,8]
编辑:为了清晰起见,更改了示例 df 我有一个数据框,类似于下面给出的数据框(除了真实的数据框有几千行和几千列,并且值是 float ): df = pd.DataFrame([[6,5,4,3,8]
我喜欢中心元素占据所有视口(viewport)空间,当屏幕最小化时,拖到一半。 (两边的两个元素只是美学)在 CSS 或 Jquery 中是否有任何属性可以实现这一点? 最佳答案 使用媒体查询。查看答
通常,交叉规则意味着它在某处被其他规则覆盖,但在开发工具中,我时不时地看到一个主要的 CSS 规则被划掉,这让我感到困惑。见上图。请注意,更改交叉线中的颜色实际上会影响页面上的元素。这是为什么? 最佳
我一直在从事一个研究项目。我有一个维基百科描述的大量实体的数据库,包括运动员、政治家、 Actor 等。目的是使用描述来确定实体的类型。我可以访问一些具有预测实体类型的数据,该数据非常准确。 这将是我
我正在使用 googlemock在我的单元测试中模拟一个 std::fstream 对象,像这样: TEST_F(SomeTest, SomethingIsDoneCorrectly) { c
当我使用基于 Java 的工具包 Batik 将 svg 转换为 pdf 时,为什么 dominant-baseline 不起作用。当我在浏览器中显示 svg 时,一切正常并且可以正常工作。 最佳答案
我正在寻找从图像中获取颜色托盘。 我可以从图像中获取RGB数据 getRgbData() { this.canvas = window.document.createElement('canv
我正在尝试使用Python 中的主导包生成HTML。对于格式,我必须在中添加一个简短的CSS内容。标签。但是,我能找到的唯一文档是 GitHub 页面,该页面没有任何与添加 相关的功能。 . PS:
我是一名优秀的程序员,十分优秀!