百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

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

toyiye 2024-06-21 12:31 8 浏览 0 评论

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

-- Greg Pittman(作者)

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

作为色轮的替代,我想在立方体表面使用一系列图形来显示 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 个点,然后绘制下一条矩形线。


Red-Green graph


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

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

下面是最终效果图:


First half of RGB cube


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

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


Second half of RGB cube


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

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


RGB cubes


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


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。


via: https://opensource.com/article/19/7/rgb-cube-python-scribus

作者: Greg Pittman 选题: lujun9972 译者: zianglei 校对: wxy

本文由 LCTT 原创编译, Linux 中国 荣誉推出

点击“了解更多”可访问文内链接

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码