利用Python与Scribus构建RGB色彩立方体模型

今天早睡
今天早睡
发布时间:2026-10-13| 6人浏览过
原创

本文介绍如何使用Scribus的Python脚本接口,通过编写代码生成RGB色彩空间的3D立方体模型。文章详细讲解了从2D平面到展开立方体的绘制逻辑,包括颜色值间隔设置、坐标轴映射及打印折叠技巧,并提供了前后半部分的完整Python脚本供参考。

RGB立方体模型概述

利用Scribus内置的Python脚本编写功能,可以开发出一个展示RGB色谱的3D立方体模型。

今年夏天,我计划进行一些色彩相关的趣味实验。通常,色彩是在色轮上进行描绘的,这种方式主要基于色素混合,而非光线叠加,因此往往难以直观体现颜色的亮度或光度变化。

为了克服色轮的局限性,我尝试在立方体表面使用一系列图形来展示RGB频谱。这些色彩的RGB数值将在具有X、Y、Z轴的三维坐标系中呈现。例如,设定一个平面保持B(蓝色)分量为0,其余坐标轴则展示当R(红色)和G(绿色)的值从0变化到255时所产生的色彩效果。

2D平面绘制逻辑

事实证明,借助Scribus及其Python脚本功能实现这一目标并不复杂。我可以创建RGB颜色对象,使矩形显示对应的颜色,并以2D格式进行排列。我设定颜色值的间隔为5,并让矩形以5个点(pt)为单位进行绘制。因此,每个2D图形大约包含250种颜色,立方体的一条边由250个点(pt)组成,对应实际长度约为3.5英寸。

Python脚本实现

我使用了以下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坐标处开始绘制图形,该位置大约位于美国信件大小纸张的水平中心,垂直方向上距离顶部约三分之一处;此处作为图像的原点,随后沿X轴(绿色值)水平构建图形,接着回到Y轴,向上移动5个点,再绘制下一条矩形线。

红-绿平面图

展开立方体的构建

这看起来十分简单;只需调整部分数值即可绘制立方体的另一面。但这不仅仅是再画两个图(一个是蓝-绿色,另一个是红-蓝色)的问题。我的目标是创建一个展开的立方体,以便打印、裁剪并折叠成一个RGB 3D视图。因此,下一部分(页面下方)的原点(黑色角落)需要位于左上角,其水平方向代表绿色,垂直方向代表蓝色。

所谓的“调整数字”最终演变为大量的试错过程,以得到我期望的效果。在创建第二个图之后,我需要第三个图,即红-蓝色图,其原点位于左上角,红色向左递增,蓝色向下递增。

以下是最终效果图:

RGB立方体前半部分

当然,这仅仅是立方体的前半部分。我需要制作一个类似的形状,但原点应为白色(而非黑色)以表示高值。这是我希望自己更聪明的时候之一,因为我不仅要制作一个类似的整体形状,还需要以镜像方式与第一个形状进行交互(这是我当时的想法)。有时候,试错法是你唯一的选择。

最终结果如下;我使用了单独的脚本,因为在美国信件大小的页面上没有足够的空间同时容纳这两个图案。

RGB立方体后半部分

打印与物理制作

现在,轮到打印机登场了!在这里,你可以直观地了解彩色打印机如何处理RGB颜色到CMYK颜色的转换,以及打印时的颜色密集空间表现。

接下来,朋友们,是剪切粘贴的时间!我可以使用胶带,但我不想改变表面的外观,所以在切割时我在两边留出了余量,以便将边缘粘在内部。根据我的经验,在复印纸上打印会产生一些不需要的皱纹,因此在完成复印纸原型后,我将立方体打印在更厚的哑光纸上。

RGB立方体成品

请记住,这仅仅是RGB空间边界的一个视图;更准确地说,你必须制作一个可以在中间切片的实心立方体。例如,这是一个实心RGB立方体在蓝色=120处的切片。

RGB立方体切片

完整脚本资源

最后,我享受了这个项目的制作过程。如果您也想参与其中,这里提供了两个脚本。

前半部分的代码:


#!/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。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。