使用Python和Scribus创建一个RGB立方体的方法


Posted in Python onJuly 17, 2019

使用 Scribus 的 Python 脚本编写器功能,开发一个显示 RGB 色谱的 3D 立方体。

当我决定这个夏天要玩色彩游戏时,我想到通常色彩都是在色轮上描绘的。这些色彩通常都是使用色素而不是光,并且你失去了任何对颜色亮度或光度变化的感觉。

作为色轮的替代,我想在立方体表面使用一系列图形来显示 RGB 频谱。色彩的 RGB 值将在具有 X、Y、Z 轴的三维图形上展示。例如,一个平面将会保持 B(蓝色)为 0,其余的坐标轴将显示当我将 R(红色)和 G (绿色)的值从 0 绘制到 255 时发生的情况。

事实证明,使用 Scribus 及其 Python 脚本编写器 功能实现这一点并不困难。我可以创建 RGB 颜色,使矩形显示颜色,并以 2D 格式排列它们。我决定设置颜色值的间隔为 5,并让矩形按 5 个点(pt)进行绘图。因此,对于每个 2D 图形,我将使用大约 250 种颜色,立方体的一个边有 250 个点(pt),也就是 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 位置开始绘制图形,这个位置大约是一个美国信件大小的纸张的水平中心,大概是垂直方向从顶部到底的三分之一位置;这是图像的原点,然后它沿着 X 轴(绿色值)水平构建图形,然后返回到 Y 轴,向上移动 5 个点,然后绘制下一条矩形线。

使用Python和Scribus创建一个RGB立方体的方法

Red-Green graph

这看起来很简单;我只需要调整一下数字就可以把立方体的另一面画出来。但这不仅仅是再画两个图,一个是蓝 - 绿色,另一个是红 - 蓝色的问题。我想创建一个展开的立方体,这样我就可以打印、剪开然后折叠它,创建一个 RGB 的 3D 视图。因此,下一部分(向下的页面)的原点(黑色的角落)需要在左上角,其水平方向是绿色,垂直方向是蓝色。

“调整数字”最终或多或少变成了试错,从而得到我想要的东西。在创建了第二个图之后,我需要第三个图,它是红 - 蓝色的,原点位于左上角,红色向左递增,蓝色向下递增。

下面是最终效果图:

使用Python和Scribus创建一个RGB立方体的方法

First half of RGB cube

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

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

使用Python和Scribus创建一个RGB立方体的方法

Second half of RGB cube

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

接下来,朋友们,是剪切粘贴时间!我可以用胶带,但我不想改变表面的外观,所以我在切割的时候在两边留下了一些空间,这样我就可以把它们粘在里面了。根据我的经验,在复印纸上打印会产生一些不需要的皱纹,所以在我的复印纸原型完成后,我把立方体打印在了更厚的纸上,表面是哑光的。

使用Python和Scribus创建一个RGB立方体的方法

RGB cubes

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

使用Python和Scribus创建一个RGB立方体的方法

RGB cube slice

最后,我做这个项目很开心。如果您也想参与其中,这里有两个脚本。

这是前半部分:

#!/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 相关文章推荐
python3爬取淘宝信息代码分析
Feb 10 Python
Python OpenCV处理图像之图像直方图和反向投影
Jul 10 Python
Flask框架web开发之零基础入门
Dec 10 Python
django 类视图的使用方法详解
Jul 24 Python
python装饰器相当于函数的调用方式
Dec 27 Python
Python log模块logging记录打印用法解析
Jan 20 Python
Python 找出出现次数超过数组长度一半的元素实例
May 11 Python
jupyter notebook的安装与使用详解
May 18 Python
Python 捕获代码中所有异常的方法
Aug 03 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
Jan 01 Python
python实现文件+参数发送request的实例代码
Jan 05 Python
用Python生成会跳舞的美女
Jan 18 Python
python实现点击按钮修改数据的方法
Jul 17 #Python
python 批量添加的button 使用同一点击事件的方法
Jul 17 #Python
python实时检测键盘输入函数的示例
Jul 17 #Python
python  文件的基本操作 菜中菜功能的实例代码
Jul 17 #Python
python对绑定事件的鼠标、按键的判断实例
Jul 17 #Python
Django model update的多种用法介绍
Mar 28 #Python
Django model select的多种用法详解
Jul 16 #Python
You might like
asp和php下textarea提交大量数据发生丢失的解决方法
2008/01/20 PHP
php 记录进行累加并显示总时长为秒的结果
2011/11/04 PHP
对象失去焦点时自己动提交数据的实现代码
2012/11/06 PHP
php+js iframe实现上传头像界面无跳转
2014/04/29 PHP
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
javascript继承机制实例详解
2014/11/20 Javascript
jQuery选择器总结之常用元素查找方法
2016/08/04 Javascript
jquery dialog获取焦点的方法
2017/02/09 Javascript
AngularJS使用拦截器实现的loading功能完整实例
2017/05/17 Javascript
nodeJS实现简单网页爬虫功能的实例(分享)
2017/06/08 NodeJs
67 个节约开发时间的前端开发者的工具、库和资源
2017/09/12 Javascript
12条写出高质量JS代码的方法
2018/01/07 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
BootStrap table实现表格行拖拽效果
2018/12/01 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
[54:15]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第二场2月1日
2021/03/11 DOTA
跟老齐学Python之用Python计算
2014/09/12 Python
跟老齐学Python之玩转字符串(3)
2014/09/14 Python
把项目从Python2.x移植到Python3.x的经验总结
2015/04/20 Python
Python语言描述连续子数组的最大和
2018/01/04 Python
详解Python函数式编程—高阶函数
2019/03/29 Python
python SQLAlchemy的Mapping与Declarative详解
2019/07/04 Python
python从list列表中选出一个数和其对应的坐标方法
2019/07/20 Python
解决pandas展示数据输出时列名不能对齐的问题
2019/11/18 Python
5分钟快速掌握Python定时任务框架的实现
2021/01/26 Python
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
英国音乐设备和乐器商店:Gear4music
2017/10/16 全球购物
世界上最大的冷却器制造商:Igloo Coolers
2019/07/23 全球购物
本科毕业生的求职信范文
2013/11/20 职场文书
业务员简历自我评价
2014/03/06 职场文书
毕业生自荐信格式
2014/03/07 职场文书
开场白怎么写
2015/06/01 职场文书
详解CocosCreator消息分发机制
2021/04/16 Javascript