1

我目前正在使用 PHP 和 Javascript 开发一个 AJAX 应用程序,它允许人们上传将打印在箔纸上的图像。由于我将使用标准 CMYK 打印机,它不会打印任何白色部分,而只是将这些点留空——这通常不会在白纸上产生影响,但在这里它确实如此,因为我正在打印在箔上。当你考虑到一个灰点会变成半透明的黑色时,它会变得更加复杂,我什至还没有谈论颜色。

然而,我想创建一个带有 alpha 通道的 PNG 文件来模拟打印过程,这样我就可以预览打印的箔在不同背景下的外观。

现在我确实了解减色和加色模型以及 RGBA 和 CMYK 的基本理论,但话又说回来,这只是基础知识,在这里我有点不知道如何进行。我猜理论上您会将每个像素转换为 CMYK 并将每个通道解释为从透明到彩色的比例,而不是从白色到彩色的比例,但是您如何将其转换回 RGBA?

当然,最好的事情是 ImageMagick 是否会提供这样的功能……是这样,还是我必须手动循环遍历像素?如果是后者,我将如何进行计算?

我不知道这是不是以前的问题。我在 Stackoverflow 或 Google 上都找不到任何东西,但也许我只是错过了正确的关键字。任何进一步阅读、深思熟虑或带有注释的超链接“我们讨论了这一百万次,白痴!” 将受到热烈欢迎。

谢谢

4

1 回答 1

2

您基本上想要的是为上传的图像添加一个 alpha 通道并创建一个 PNG 文件。

Alpha 通道应该代表打印颜色的不透明度。要生成它,您有几个选项:

  1. 获取图像的副本,将其转换为灰度,将其反转并用作 Alpha 通道。

  2. 创建一个 alpha 通道,计算从原始图像派生的每个像素的 alpha 值:alpha = 1.0 - min(red, green, blue)(使用 255 而不是 1.0,具体取决于您使用的是整数还是浮点数)。

  3. 将原始图像转换为 CMYK(使用颜色配置文件,而不是您在互联网上找到的糟糕的公式)并将其用作为原始 RGB 图像创建 alpha 通道的基础:alpha = max(cyan, magenta, yellow,黑色)

  4. 想出一个更好的公式来计算每个像素的透明度,例如:alpha = min(0.2 * cyan + 0.5 * magenta + 0.1 * yellow + 0.7 * black, 1.0)

最后一个只是对每种颜色的相对不透明度的猜测。你当然可以改进它。

于 2013-06-04T11:15:04.443 回答