使用 Python 和 Scribus 制作 RGB 立方体

使用 Scribus 的 Python 脚本功能创建一个展示 RGB 色谱的 3D 立方体。
182 位读者喜欢这篇文章。
cubes coming together to create a larger cube

Opensource.com

今年夏天,当我决定要玩转色彩时,我想到了颜色通常在色轮上描绘的事实。这通常是颜料的颜色而不是光,并且你会失去对颜色亮度或光度的变化的感知。

作为色轮的替代方案,我想到了使用一系列图形在立方体表面上显示 RGB 光谱的想法。RGB 值将用三维图形表示,带有 X、Y 和 Z 轴。例如,一个表面将 B(或蓝色)保持为 0,其余轴将显示当我将 R(红色)和 G(绿色)的值作为颜色从 0 到 255 绘制时会发生什么。

事实证明,使用 Scribus 及其 Python Scripter 功能来完成这项工作并不难。我可以创建 RGB 颜色,制作显示颜色的矩形,并将它们排列成 2D 格式。我决定颜色的值跳跃为 5,并将矩形尺寸设置为边长 5 点。因此,对于每个 2D 图形,我将制作大约 250 种颜色,并且立方体的边长将为 250 点,即 3.5 英寸。

我使用了这段 Python 代码来完成绿色-红色图表的任务

x = 300
y = 300
r = 0
g = 0
b = 0

if scribus.newDoc(scribus.PAPER_LETTER, (0,0,0,0),scribus.PORTRAIT, 1,          	scribus.UNIT_POINTS, scribus.NOFACINGPAGES, scribus.FIRSTPAGERIGHT):
    while r < 256:
        while g < 256:
            newcolor = str(r) + '_' + str(g) + '_' + str(b)
            if newcolor == '0_0_0':
                newcolor = 'Black'
            scribus.defineColorRGB(newcolor,r, g, b)
            rect = scribus.createRect(x + g, y, 5, 5)
            scribus.setFillColor(newcolor, rect)
            scribus.setLineColor(newcolor, rect)
            g = g + 5
        g = 0
        r = r + 5
        y = y – 5

此脚本在 300, 300 处启动图形结构,这大约是 US Letter 尺寸页面水平方向的中间位置,可能在从顶部向下三分之一的位置;这是图形的原点。然后,它沿着 X 轴(绿色值)水平构建图形,然后返回到 Y 轴,在页面上向上跳 5 点,并制作另一行矩形。

Red-Green graph

这看起来很容易;我只需调整数字并制作其他面。但这不仅仅是制作另外两个图形的问题,一个带有蓝色-绿色,另一个带有红色-蓝色。我打算创建一个展开的立方体,以便我可以打印、切割、折叠它,并创建 RGB 的 3D 视图。因此,下一部分(向下翻页)需要将原点(黑色角)放在左上角,绿色水平方向,蓝色垂直方向向下递增。

“调整数字”最终或多或少变成了反复试验,以获得我想要的结果。在创建第二个图形之后,我需要第三个图形,即红色-蓝色,使其原点位于左上角,红色向左递增,蓝色向下递增。

这就是它

First half of RGB cube

当然,这只是这个立方体的前半部分。我需要制作一个类似的形状,只是原点应该是白色(而不是黑色)来表示高值。这是我希望自己更聪明的时候之一,因为我不仅需要制作一个类似的整体形状,还需要以镜像的方式(我想)与第一个形状对接。有时,反复试验是你唯一的盟友。

这就是结果;我使用了单独的脚本,因为 US Letter 尺寸的页面上没有足够的空间容纳它们。

Second half of RGB cube

现在,开始打印吧!在这里,您可以了解您的彩色打印机在 RGB 到 CMYK 转换以及打印颜色密集空间的其他方面的表现如何。

接下来,孩子们,是剪切和粘贴时间!我可以使用胶带,但我不希望改变表面的外观,所以在切割时我在侧面留下了一些标签,以便我可以将它们粘在里面。根据经验,我可以说在复印纸上打印会出现一些不希望有的皱纹,所以在我的复印纸原型之后,我在较重的哑光纸上打印了立方体。

RGB cubes

请记住,这只是 RGB 空间边界的视图;要更准确,您必须制作一个实心立方体,您可以将其在中间切片。例如,这将是穿过一个实心 RGB 立方体的切片,其中蓝色 = 120

RGB cube slice

最后,我很高兴完成这个项目。如果您想加入,这里有两个脚本。这些脚本需要 Scribus 1.5.x,它提供了 defineColorRGB() 函数。

这是前半部分

#!/usr/bin/env python
# black2rgb.py
"""
Creates one-half of RGB cube with Black at origin
"""

import scribus

x = 300
y = 300
r = 0
g = 0
b = 0

if scribus.newDoc(scribus.PAPER_LETTER, (0,0,0,0),scribus.PORTRAIT, 1, scribus.UNIT_POINTS, scribus.NOFACINGPAGES, scribus.FIRSTPAGERIGHT):
    while r < 256:
        while g < 256:
            newcolor = str(r) + '_' + str(g) + '_' + str(b)
            if newcolor == '0_0_0':
                newcolor = 'Black'
            scribus.defineColorRGB(newcolor,r, g, b)
            rect = scribus.createRect(x + g, y, 5, 5)
            scribus.setFillColor(newcolor, rect)
            scribus.setLineColor(newcolor, rect)
            g = g + 5
        g = 0
        r = r + 5
        y = y - 5
        
    r = 0
    g = 0
    y = 305

    while b < 256:
        while g < 256:
            newcolor = str(r) + '_' + str(g) + '_' + str(b)
            if newcolor == '0_0_0':
                newcolor = 'Black'
            scribus.defineColorRGB(newcolor,r, g, b)
            rect = scribus.createRect(x + g, y, 5, 5)
            scribus.setFillColor(newcolor, rect)
            scribus.setLineColor(newcolor, rect)
            g = g + 5
        g = 0
        b = b + 5
        y = y + 5
        
    r = 255
    g = 0
    y = 305
    x = 39
    b = 0

    while b < 256:
        while r >= 0:
            newcolor = str(r) + '_' + str(g) + '_' + str(b)
            if newcolor == '0_0_0':
                newcolor = 'Black'
            scribus.defineColorRGB(newcolor,r, g, b)
            rect = scribus.createRect(x, y, 5, 5)
            scribus.setFillColor(newcolor, rect)
            scribus.setLineColor(newcolor, rect)
            r = r - 5
            x = x+5
        b = b + 5
        x = 39.5
        r = 255
        y = y + 5
        
scribus.setRedraw(True)
scribus.redrawAll()

现在是后半部分

#!/usr/bin/env python
# white2rgb.py
"""
Creates one-half of RGB cube with White at origin
"""

import scribus

x = 300
y = 300
r = 255
g = 255
b = 255

if scribus.newDoc(scribus.PAPER_LETTER, (0,0,0,0),scribus.PORTRAIT, 1, scribus.UNIT_POINTS, scribus.NOFACINGPAGES, scribus.FIRSTPAGERIGHT):
    while g >= 0:
        while r >= 0:
            newcolor = str(r) + '_' + str(g) + '_' + str(b)
            if newcolor == '255_255_255':
                newcolor = 'White'
            scribus.defineColorRGB(newcolor,r, g, b)
            rect = scribus.createRect(x + 255 - r, y, 5, 5)
            scribus.setFillColor(newcolor, rect)
            scribus.setLineColor(newcolor, rect)
            r = r - 5
        r = 255
        g = g - 5
        y = y - 5
        
    r = 255
    g = 255
    y = 305

    while b >= 0:
        while r >= 0:
            newcolor = str(r) + '_' + str(g) + '_' + str(b)
            if newcolor == '255_255_255':
                newcolor = 'White'
            scribus.defineColorRGB(newcolor,r, g, b)
            rect = scribus.createRect(x + 255 - r, y, 5, 5)
            scribus.setFillColor(newcolor, rect)
            scribus.setLineColor(newcolor, rect)
            r = r - 5
        r = 255
        b = b - 5
        y = y + 5
        
    r = 255
    g = 0
    y = 305
    x = 39
    b = 255

    while b >= 0:
        while g < 256:
            newcolor = str(r) + '_' + str(g) + '_' + str(b)
            if newcolor == '255_255_255':
                newcolor = 'White'
            scribus.defineColorRGB(newcolor,r, g, b)
            rect = scribus.createRect(x + g, y, 5, 5)
            scribus.setFillColor(newcolor, rect)
            scribus.setLineColor(newcolor, rect)
            g = g + 5
        g = 0
        b = b - 5
        y = y + 5
        
scribus.setRedraw(True)
scribus.redrawAll()

由于我创建了大量的颜色,因此我并不惊讶地看到 Scribus 文件比我从中制作的 PDF 文件大得多。例如,我的 Scribus SLA 文件为 3.0MB,而我从中生成的 PDF 文件仅为 70KB。

Greg Pittman
Greg 是肯塔基州路易斯维尔的一位退休神经科医生,长期以来对计算机和编程感兴趣,从 1960 年代的 Fortran IV 开始。当 Linux 和开源软件出现时,它激发了学习更多知识并最终做出贡献的热情。他是 Scribus 团队的成员。

2 条评论

我应该补充一点,由于需要 defineColorRGB() 命令,Python 脚本仅适用于 1.5.x 版本的 Scribus。

Creative Commons License本作品根据 Creative Commons 许可协议共享,版本为署名-相同方式共享 4.0 国际许可协议。
© . All rights reserved.