专栏首页Opensource翻译专栏使用Python和Scribus制作RGB立方体【Programming(Python)】

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

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

图片来源: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图形的任务:

 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()函数。

这是前半部分:

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

原文链接:https://opensource.com/article/19/7/rgb-cube-python-scribus

原文作者:Greg Pittman

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 学网络编程前的计算机知识普及——一图解乾坤

    可能有朋友会好奇,前两天刚发布了数据结构,现在突然又发布网络编程,那此刻的我到底在学些神马?哈哈,我这学期的目标就是学数据结构和网络编程,至于学的先后,我想你应...

    泰斗贤若如
  • 一款Google抓图神器,它与Python批量抓取图片的原理一模一样

    相信大家前段时间肯定看到一篇文章名为《只因写了一段爬虫,公司200多人被抓!》的公众号文章(文章的描述已经显而易见,大家都非常清楚了)

    测试小兵
  • python爬虫:爬取你喜欢的高清图片

    抓取到的图片要保存到电脑本地,所以就想着最好能够自己挑选本地任意一个文件夹作为存储路径

    python学习教程
  • (数据科学学习手札70)面向数据科学的Python多进程简介及应用

      进程是计算机系统中资源分配的最小单位,也是操作系统可以控制的最小单位,在数据科学中很多涉及大量计算、CPU密集型的任务都可以通过多进程并行运算的方式大幅度提...

    Feffery
  • app逆向入门分析——破解某APP登陆请求参数

    前段时间做爬虫遇到一个app,里面的数据需要登录之后才能拿到,而且登录不能用密码,只能通过验证码登录。 这不是明摆着欺负人么,按赵四哥那句话来说就是:

    州的先生
  • 性能优化指南(5000 字小结)

    作为一个程序员,性能优化是常有的事情,不管是桌面应用还是web应用,不管是前端还是后端,不管是单点应用还是分布式系统。本文从以下几个方面来思考这个问题:性能优化...

    用户1516716
  • Evaluating the linear regression model评估线性回归模型

    In this recipe, we'll look at how well our regression fits the underlying data. ...

    到不了的都叫做远方
  • [新手必看] 17个常见的Python运行时错误

    对于刚入门的Pythoner在学习过程中运行代码是或多或少会遇到一些错误,刚开始可能看起来比较费劲。随着代码量的积累,熟能生巧当遇到一些运行时错误时能够很快的定...

    叫我龙总
  • 警告!你的Python代码命名太烂了,命令你熟读本篇迷你命名指南!

    刚开始我丝毫不慌,祭出我的 debug 两板斧,小小 bug 何足挂齿,看我分分钟解决你!

    Rocky0429
  • 数据分析最有用的25个 Matplotlib图

    50个Matplotlib图的汇编,在数据分析和可视化中最有用。此列表允许您使用Python的Matplotlib和Seaborn库选择要显示的可视化对象。

    统计学家

扫码关注云+社区

领取腾讯云代金券