前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Python和Scribus制作RGB立方体【Programming(Python)】

使用Python和Scribus制作RGB立方体【Programming(Python)】

作者头像
Potato
修改2019-12-02 11:22:22
1K0
修改2019-12-02 11:22:22
举报

使用Scribus的Python Scripter功能创建一个显示RGB色谱图的3D立方体。

图片来源:Opensource.com
图片来源: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代码来完成Green-Red图形的任务:

代码语言:javascript
复制
 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视图。 因此,下一部分(下一页)需要在左上角具有原点(黑色角),水平绿色和垂直蓝色向下增加。

“摆弄数字”最终或多或少地经过反复试验才能得到我想要的。 创建第二张图之后,我需要第三张图(对于Red–Blue),其原点位于左上角,其中Red向左增加,Blue向下方增加。

当然,这只是该多维数据集的前半部分。 我需要做出类似的形状,只是原点应该是白色(而不是黑色)以表示较高的值。 这是我希望变得更聪明的时候,因为我不仅需要做出相似的整体形状,而且还需要以镜像方式与第一个形状进行交互(我认为)。 有时,反复试验是您唯一的朋友。

这是怎么出来的; 我使用了一个单独的脚本,因为在美国字母大小的页面上没有足够的空间来容纳它们:

现在,打印机已启动! 在这里,您可以了解彩色打印机在将RGB转换为CMYK方面的表现以及打印色彩密集空间的其他方面的性能。

接下来,男孩和女孩,这是剪切粘贴的时间! 我可以使用胶带,但是我不想改变表面的外观,因此在切割时我在侧面留了一些标签,以便可以将它们粘在里面。 根据经验,我可以说在复印纸上打印时会出现一些不希望有的皱纹,因此在复印纸原型制作完成后,我在较重的纸张上打印了立方体,并进行了磨砂处理。

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

最后,我很高兴做这个项目。 如果您想参加,请使用以下两个脚本。这些脚本需要Scribus 1.5.x,它提供了defineColorRGB()函数。

这是前半部分:

代码语言:javascript
复制
 #!/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()

这是下半部分:

代码语言:javascript
复制
 #!/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。

本文系外文翻译,前往查看

如有侵权,请联系?cloudcommunity@tencent.com?删除。

本文系外文翻译前往查看

如有侵权,请联系?cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com