使用 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 处启动图形结构,这大约是美国 Letter 尺寸页面水平方向的中间,并且可能从顶部向下三分之一的位置;这是图形的原点。然后它沿 X 轴(绿色值)水平构建图形,然后返回到 Y 轴,在页面上向上跳 5 个点,并制作另一行矩形。

Red-Green graph

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

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

就在这里

First half of RGB cube

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

这就是结果;我使用了单独的脚本,因为美国 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。

© . All rights reserved.