”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 从打字机到像素:CMYK、RGB 和构建色彩可视化工具的旅程

从打字机到像素:CMYK、RGB 和构建色彩可视化工具的旅程

发布于2024-11-08
浏览:239

当我还是个孩子的时候,我出版了一本关于漫画的粉丝杂志。那是在我拥有计算机之前很久——它是用打字机、纸和剪刀创建的!

粉丝杂志最初是黑白的,在我的学校复印的。随着时间的推移,随着它取得了更大的成功,我能够负担得起带有彩色封面的胶印!

然而,管理这些颜色非常具有挑战性。每个封面必须打印四次,每种颜色打印一次:青色、品红色、黄色和基色(黑色)——缩写为 CMYK。

这意味着我必须提供四张单独的纸,每张都用黑色墨水打印,但对应于特定的颜色。

这是我发表的其中一期:

From Typewriters to Pixels: A Journey with CMYK, RGB, and Building a Color Visualizer

您在上图中看到的所有黄色都是我用黑色墨水在“黄色”纸上手绘的。对于肤色,我使用了一种叫做“光栅点”的东西。您可以购买带有不同密度黑点的床单。你可以剪下这些点并将它们应用到——在本例中,应用到“红色”纸上。

我在一张灯台上工作——一张带有内置照明的玻璃顶绘图桌——这样我就可以透过各种纸张看到它们,同时正确对齐它们。

非常耗时,但它激发了人们对理解颜色的终生兴趣——以及打印颜色和屏幕颜色之间的巨大差异!

虽然 CMYK 仅限于四种颜色,但它仍然相对容易掌握。我们都曾在纸上使用过彩色铅笔,并且对颜色如何混合有直观的感觉。 CMYK 是一种减色颜色模型。你从一张白纸开始,当你添加更多墨水时,你实际上是在减去光线。组合所有颜色会让你走向黑色。如果不涂任何墨水,纸张会保持白色,因为它会反射所有光线。

当我拿到第一台电脑时,我必须了解 RGB,它与 CMYK 非常不同。 RGB 是一种用于数字屏幕的加法颜色模型。在这里,您正在混合光线本身 - 添加更多光线会使颜色更明亮,并使您接近白色。关闭所有RGB灯(R=0,G=0,B=0),屏幕变黑,因为没有光发出。

当时作为一名图形设计师,您必须校准屏幕,因为您在屏幕上看到的颜色和在打印中看到的颜色通常非常不同!


可视化 RGB

RGB代表三种光源:红、绿、蓝。当灯关闭时,其值为0;当它完全上时,其值为255。当这些灯重叠时,它们会产生不同的颜色。

为了更好地理解 RGB 的工作原理,让我们构建一个小工具:

From Typewriters to Pixels: A Journey with CMYK, RGB, and Building a Color Visualizer


超文本标记语言

R GR BG B

风格

首先,我们创建一个 9x8 的网格:

.rgb {
  all: unset;
  aspect-ratio: 9 / 8;
  container-type: inline-size;
  display: grid;
  font-size: 1.75cqi;
  grid-template-columns: repeat(9, 1fr);
  grid-template-rows: repeat(8, 1fr);
  width: 100%;
}

这是一个不寻常的尺寸,但那是因为我们的 R、G 和 B 圆是 5x5 并且 重叠

.r, .g, .b {
  aspect-ratio: 1 / 1;
  border-radius: 50%;
  display: grid;
  font-size: 5cqi;
  mix-blend-mode: difference;
}

.r、.g 和 .b 的 CSS 为:

.r {
  background-color: rgb(var(--r), 0, 0);
  grid-area: 1 / 3 / 6 / 8;
}

.g {
  background-color: rgb(0, var(--g), 0);
  grid-area: 4 / 1 / 9 / 6;
}

.b {
  background-color: rgb(0, 0, var(--b));
  grid-area: 4 / 5 / 9 / 10;
}

我最近经常使用网格区域。它允许您将网格项放置在非常特定的位置:

行开始/列开始/行结束/列结束

如果启用开发工具的网格可视化工具

,则更容易将其可视化

From Typewriters to Pixels: A Journey with CMYK, RGB, and Building a Color Visualizer

您注意到三个 CSS 自定义属性 --r、--g 和 --b 了吗?我们将在一个小的 JS 片段中更新它们:

const rgb = document.querySelector('.rgb');
rgb.addEventListener('input', e => {
  const N = e.target;
  document.body.style.setProperty(`--${N.name}`, N.value);
})

基本上就是这样。我添加了一些 元素和细微的调整……但我几乎忘记提及 使可视化工具正常工作的最重要的一行

混合混合模式:差异

在这里阅读相关内容 - 循环浏览所有模式非常有趣。


演示

这是一个 Codepen。单击并编辑 R、G 和 B 下面的数字,注意页面背景和所有三个圆圈的重叠部分如何变化。

版本声明 本文转载于:https://dev.to/madsstoumann/from-typewriters-to-pixels-a-journey-with-cmyk-rgb-and-building-a-color-visualizer-484b?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何更改 C++ 中的当前工作目录?
    如何更改 C++ 中的当前工作目录?
    更改 C 中的当前工作目录 处理文件和 I/O 时经常遇到需要调整当前工作目录的情况运营。 C 通过使用 std::filesystem::current_path 函数为此任务提供了一个独立于平台的解决方案。C 17 解决方案:std::filesystem::current_path 在C 17...
    编程 发布于2024-11-08
  • 将 CSV 转换为 JSON:快速指南 + 在线工具
    将 CSV 转换为 JSON:快速指南 + 在线工具
    CSV(逗号分隔值)是一种广泛使用的存储表格数据的格式,常见于电子表格和数据交换中。虽然 CSV 对于数据存储来说简单且有效,但 JSON(JavaScript 对象表示法)已成为在 Web 应用程序中处理结构化数据的首选格式。无论您是构建 API、导入/导出数据,还是只是处理 JavaScript...
    编程 发布于2024-11-08
  • RGFW 底层:XDrag &#n Drop
    RGFW 底层:XDrag &#n Drop
    Introduction To handle Drag 'n Drop events with X11, you must use the XDnD protocol. Although the XDnD protocol is significantly more complic...
    编程 发布于2024-11-08
  • 招聘 Django 开发人员
    招聘 Django 开发人员
    大家好,我是 Nicholas,一名软件开发人员,在构建强大的 Web 应用程序方面拥有 3 年经验,利用 Python、JavaScript 和 Ruby 提供最新行业的业务解决方案Django、Nodejs、Nextjs、Reactstrap、Ruby on Rails、Git 和 Redis ...
    编程 发布于2024-11-08
  • 我用C开发了神经网络库
    我用C开发了神经网络库
    用Python开发人工智能对我来说相当困难,因为我以前从未使用过Python。但我懂 C 和数学,那为什么我不能用 C 开发它呢? 我的故事就是这样开始的。我决定开发它。 我首先在C播放列表中观看了Tsoding Daily的ml。这对我来说是一个很好的资源。数学和神经网络的解释非常棒!所以我用这...
    编程 发布于2024-11-08
  • 四种原始形态的故事
    四种原始形态的故事
    在Computoria王国,一个充满逻辑和神秘的国度,住着四位高贵的存在,每一位都掌握着编程本身核心的钥匙。他们不像普通公民或流浪的陌生人;他们不像普通人。它们是存在的本质,是代码和计算蓬勃发展的土地上创造的气息和骨骼。 他们被所有人,无论老少,都知道这些永恒的名字:Int、Float、Str和Bo...
    编程 发布于2024-11-08
  • 如何在 Python 中修改函数内的列表:通过引用传递或就地修改?
    如何在 Python 中修改函数内的列表:通过引用传递或就地修改?
    修改函数内的列表在函数中使用列表参数时,传递给函数的引用指向原始列表。函数内对 list_arg 变量所做的任何修改都仅限于其局部范围,不会影响原始列表。要规避此问题并修改原始列表,需要直接将元素分配给列表而不是将整个列表重新分配给新值。这是一个例子:def function1(list_arg):...
    编程 发布于2024-11-08
  • React Hooks:详细说明
    React Hooks:详细说明
    React Hooks 是允许您从功能组件“挂钩”React 状态和生命周期功能的函数。 Hooks 在 React 16.8 中引入,使您无需编写类组件即可使用状态和其他 React 功能。 我们来分解一下Hooks背后的核心概念: 1. 为什么使用 React Hooks? 在钩...
    编程 发布于2024-11-08
  • 了解 JavaScript 生成器:强大的代码流控制工具
    了解 JavaScript 生成器:强大的代码流控制工具
    生成器是 JavaScript 中最强大的功能之一,它允许我们编写可以根据需要暂停和恢复的代码。与一次执行所有代码的常规函数​​不同,生成器使用延迟执行,增量返回值,从而更容易处理数据序列、迭代或长时间运行的进程。 发电机如何工作? 在JavaScript中,生成器是使用functi...
    编程 发布于2024-11-08
  • 如何在 groupby 操作期间维护 Pandas DataFrame 中的其他列?
    如何在 groupby 操作期间维护 Pandas DataFrame 中的其他列?
    在 Groupby 操作期间维护其他列对 pandas 数据框执行 groupby 操作时,通常需要保留不属于的列参与分组或聚合过程。默认情况下,操作完成后将删除这些其他列。如果保留的列包含有价值的信息,这可能会出现问题。考虑以下数据框: item diff otherstuff ...
    编程 发布于2024-11-08
  • 根据您文章的内容,以下是一些适合问答格式的标题选项:

选项 1(直接):

* 如何从 OpentelemetryContext Pr 中的字符串跟踪 ID 构造跨度
    根据您文章的内容,以下是一些适合问答格式的标题选项: 选项 1(直接): * 如何从 OpentelemetryContext Pr 中的字符串跟踪 ID 构造跨度
    在 Opentelemetry 中根据跟踪 ID 构建 Span上下文传播通常用于检索父跟踪 ID 并创建子 Span。但是,在使用标头进行消息交换的情况下,需要替代方法。要从字符串跟踪 ID 创建范围,可以按照以下步骤操作:构造一个解析 Trace 和 Span ID 的函数:func const...
    编程 发布于2024-11-08
  • 如何将 JSON 字符串转换为 Python 字典?
    如何将 JSON 字符串转换为 Python 字典?
    如何将 JSON 字符串转换为 Python 字典JSON(JavaScript 对象表示法)是一种流行的数据格式,通常用于表示复杂的数据结构。在 Python 中,您可以使用 json 模块来处理 JSON 数据。一个常见的任务是将 JSON 字符串转换为 Python 字典。这允许您以键值对的形...
    编程 发布于2024-11-08
  • 治疗高血压的整体阿育吠陀方法
    治疗高血压的整体阿育吠陀方法
    管理高血压的整体阿育吠陀方法 阿育吠陀治疗高血压提供了一种自然和整体的方法来管理这一常见的健康问题。在阿育吠陀中,高血压通常与能量的不平衡有关,特别是皮塔和瓦塔。这种古老的医学体系旨在通过个性化治疗和生活方式改变来恢复平衡并促进整体健康。 治疗高血压的阿育吠陀疗法包括使用特定草药,如阿朱那、南非醉茄...
    编程 发布于2024-11-08
  • 如何设置 Y 轴范围以丰富多个子图布局中的可视化?
    如何设置 Y 轴范围以丰富多个子图布局中的可视化?
    设置子图轴范围背景在可视化中处理多个子图时,有必要控制每个子图的轴范围以确保正确的数据表示。本问题探讨如何在双子图布局中设置第二个子图的 y 轴范围。当 FFT 图出现异常尖峰,导致所需数据不可见时,就会出现此问题。解决方案要解决此问题,请在绘图后使用 pylab.ylim([bottom, top...
    编程 发布于2024-11-08
  • CSS 中的盒模型:制作精确布局的终极指南
    CSS 中的盒模型:制作精确布局的终极指南
    Web设计概念中,盒子模型(Box Model)是CSS中非常关注布局设计的基础知识领域。盒子模型解释了页面上元素的放置和定位方式,这会影响水平度和总体连贯性。 除了概述盒子模型的背景和边框之外,本指南还指导您完成填充、边距和盒子大小调整,以便您可以完全控制布局。要开始专业水平的 Web 项目设计,...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3