将 CMYK 转换为 RGB 时如何匹配 PDF-lib 颜色?

问题描述 投票:0回答:1

我尝试使用以下公式将 CMYK 转换为 RGB:

R = 255 × (1-C) × (1-K)
G = 255 × (1-M) × (1-K)
B = 255 × (1-Y) × (1-K)

CMYK(0, 100, 100, 80)
转换为 RGB,得到结果
RGB(51, 0, 0)

当我使用PDF-lib绘制一个带有

CMYK(0, 1.0, 1.0, 0.8)
颜色的矩形,然后生成pdf时。我发现 RGB 颜色是
RGB(59, 8, 3)
,视觉效果比
RGB(51, 0, 0)
更好。

问题:
我正在寻找将

cmyk(0, 100, 100, 80)
转换为
rgb(59, 8, 3)
的公式。
我很好奇 PDF-lib 是如何做到的。 PDF-lib 似乎不使用任何 ICC 配置文件。由 pdf-lib 创建时,pdf 文件没有嵌入的 ICC 配置文件。

我也尝试了很多颜色系统,RGB(59,8,3)更适合打印。

我不知道将 CMYK(0, 100, 100, 80) 转换为 RGB(59, 8, 3)。
你能给我建议吗?

async generatePDF() {
    // pdf-lib
    const pdfDoc = await PDFDocument.create();
    const page = pdfDoc.addPage([600, 400]);
    const { width, height } = page.getSize();

    // draw a rectangle
    page.drawRectangle({
        x: 50,
        y: height - 150,
        width: 200,
        height: 100,
        borderColor: rgb(0, 0, 0),
        borderWidth: 2,
        color: cmyk(0.0, 1.0, 1.0, 0.8),
    });
    ...
    ...
}
typescript colors rgb cmyk pdf-lib.js
1个回答
0
投票

“我尝试使用pdf-lib用CMYK(0,1.0,1.0,0.8)颜色绘制矩形并生成pdf。
我发现RGB颜色是RGB(

59, 8, 3
)并且比RGB(
51, 0, 0
)更好。

我需要以下想法:如何将 CMYK(0, 100, 100, 80) 转换为 RGB(59, 8, 3)。”

您必须在打印时创建自己的秘密配方,以获得“更好的 RGB 颜色”

我从快速研究中得到的一些线索是,YCbCr 或 Rec.609 系数可能与 PDF 色调有关。我用您输入的 CMYK 尝试了 Rec.601 和 Rec.709 数字:

CMYK: 0, 100, 100, 80
--> Rec.601(每个系数除以 10):给出
R: 59, G: 8, B: 3

CMYK: 0, 100, 100, 80
--> Rec.709(每个系数除以 10):给出
R: 57, G: 10, B: 2

下面的实验算法代码是在问题中提供的一个 CMYK 值上进行测试的。
最好的情况下,它会匹配您所有其他预期的颜色,或者最坏的情况下,它只会在打印时提供比原始 CMYK 转换器更令人愉悦的红色(它提供了

RGB(51, 0, 0)

let r = 0; let g = 0; let b = 0;

//# input CMYK testing values ... range: 0.0 --> 1.0
let c = 0.0;
let m = 1.0;
let y = 1.0;
let k = 0.8;

c = c * (1 - k) + k; m = m * (1 - k) + k; y = y * (1 - k) + k;

//## Convert into RGB values

//# Try Ver 1: using Rec.601 coefficients divided by 10
r = (1 + 0.0299) - c;
g = (1 + 0.0587 - m) / 2;
b = (1 + 0.0114) - y;

/*
//# Try Ver 2: using Rec.709 coefficients divided by 10
r = 1 + (0.02126) - c;
g = (1 + 0.07152 - m) / 2;
b = 1 + (0.00722) - y;
*/

//# Final quantization ...
r = Math.ceil(255 * r); g = Math.ceil(255 * g); b = Math.ceil(255 * b);

//# Check output ...
console.log( "CMYK -> RGB (using Rec.601) : " );
console.log( "R: " + r + ", G: " + g + ", B: " + b );
© www.soinside.com 2019 - 2024. All rights reserved.