为要分层以获得最大色域的颜色选择 alpha
selecting alpha for a color to be layered for largest gamut
a 是灰度颜色的 alpha 值:
rgba(0,0,0,a)
我想在白色 rgb 背景上最多堆叠此颜色 z 次。
给定 z,我如何确定 a 将创建最广泛的灰度值色域?
我天真地认为我可以用 255/z 解决,但这导致我的最暗灰度值远不及 255。这里有三层 (z = 3),我在其中设置 a = 85。唉!它得到的最暗是 180,所以我可以增加 a
并最终得到更宽的色域。但是怎么办?
https://codepen.io/jedierikb/pen/JjRebjB?editors=1010
const $c = document.getElementById( 'c' );
$c.width = 200;
$c.height = 200;
const ctx = $c.getContext( '2d' );
const numLayers = 3;
const alpha = Math.round(255/numLayers);
ctx.fillStyle = '#000000' + intToHex( alpha );
for (var i=0; i<numLayers; ++i) {
ctx.fillRect( i*10, i*10, 100, 100 );
}
//let's get a pixel
var id = ctx.getImageData(numLayers*10, numLayers*10, 1, 1).data;
console.log( 'for ' + numLayers + ' layers, using alpha ' + alpha );
console.log( 'resulting in darkest alpha being', id[3] );
在您的示例(图像和 CodePen)中,alpha 为 0.33
。
最浅的颜色是170
,即255
中的67%
。因此,第一层黑色移除了等于其 alpha (0.33 = 33%
) 的亮度测量值。
现在,当应用第二层时,不是从白色而是从第一层减去亮度。它的亮度为 67%,因此第二层的亮度为 67% * (1 - 0.33) = ~44%
,在 RGB 中为 255 * 44% = ~112
,等于第二层的颜色。
第三层的亮度为 44% * (1 - 0.33) = ~30%
,在 RGB 中为 255 * 30% = ~75
,等于第三层的颜色。
因此,如果您将带有 alpha a
的黑色应用到白色背景 z
次,第 z
种颜色将为
255 * (1 - a)^z
可以使用以下方法计算值的范围:
range = 255 * (1 - a) - 255 * (1 - a)^z
first color - last color
通过绘制此函数的图形,您可以看出,例如,对于 z = 3
,局部最大值位于 0.4226
。您还可以求解多项式或作弊,以 0.05
为增量计算 a
的值,然后选择最高的结果。
function greatestGamutAlpha(layers, precision = 5) {
let maxRangeAlpha,
maxRange = 0;
for (let a = 0; a < 100; a += precision) {
const alpha = a / 100,
range = 255 * (1 - alpha) - 255 * (1 - alpha) ** layers;
if (range > maxRange) {
maxRange = range;
maxRangeAlpha = alpha;
}
}
return maxRangeAlpha;
}
a 是灰度颜色的 alpha 值:
rgba(0,0,0,a)
我想在白色 rgb 背景上最多堆叠此颜色 z 次。
给定 z,我如何确定 a 将创建最广泛的灰度值色域?
我天真地认为我可以用 255/z 解决,但这导致我的最暗灰度值远不及 255。这里有三层 (z = 3),我在其中设置 a = 85。唉!它得到的最暗是 180,所以我可以增加 a
并最终得到更宽的色域。但是怎么办?
https://codepen.io/jedierikb/pen/JjRebjB?editors=1010
const $c = document.getElementById( 'c' );
$c.width = 200;
$c.height = 200;
const ctx = $c.getContext( '2d' );
const numLayers = 3;
const alpha = Math.round(255/numLayers);
ctx.fillStyle = '#000000' + intToHex( alpha );
for (var i=0; i<numLayers; ++i) {
ctx.fillRect( i*10, i*10, 100, 100 );
}
//let's get a pixel
var id = ctx.getImageData(numLayers*10, numLayers*10, 1, 1).data;
console.log( 'for ' + numLayers + ' layers, using alpha ' + alpha );
console.log( 'resulting in darkest alpha being', id[3] );
在您的示例(图像和 CodePen)中,alpha 为 0.33
。
最浅的颜色是170
,即255
中的67%
。因此,第一层黑色移除了等于其 alpha (0.33 = 33%
) 的亮度测量值。
现在,当应用第二层时,不是从白色而是从第一层减去亮度。它的亮度为 67%,因此第二层的亮度为 67% * (1 - 0.33) = ~44%
,在 RGB 中为 255 * 44% = ~112
,等于第二层的颜色。
第三层的亮度为 44% * (1 - 0.33) = ~30%
,在 RGB 中为 255 * 30% = ~75
,等于第三层的颜色。
因此,如果您将带有 alpha a
的黑色应用到白色背景 z
次,第 z
种颜色将为
255 * (1 - a)^z
可以使用以下方法计算值的范围:
range = 255 * (1 - a) - 255 * (1 - a)^z
first color - last color
通过绘制此函数的图形,您可以看出,例如,对于 z = 3
,局部最大值位于 0.4226
。您还可以求解多项式或作弊,以 0.05
为增量计算 a
的值,然后选择最高的结果。
function greatestGamutAlpha(layers, precision = 5) {
let maxRangeAlpha,
maxRange = 0;
for (let a = 0; a < 100; a += precision) {
const alpha = a / 100,
range = 255 * (1 - alpha) - 255 * (1 - alpha) ** layers;
if (range > maxRange) {
maxRange = range;
maxRangeAlpha = alpha;
}
}
return maxRangeAlpha;
}