PIL 改变颜色通道强度

2024-04-04

我想制作一个颜色选择器,它可以重新着色 png 纹理,同时保留 python3 中的透明度。
我只希望图像的较亮部分重新着色,但也保持渐变。
我能想到的唯一选择是调整颜色通道强度,但是我在 PIL 文档中没有找到类似的内容。
如何更改颜色通道强度?我的PNG纹理以ARGB模式加载,可以找到>>here https://github.com/9hax/midRenderResources/raw/master/keys/keyshape_a.png

原图:


我为此想到了一种方法:

  • 提取并保存Alpha/透明度通道
  • 将图像减去 Alpha 后转换为 HSV 色彩空间并保存 V(亮度)
  • 从颜色选择器中获取新的色调(可能还有饱和度)
  • 合成一个新的色调通道和一个新的饱和度通道 255(完全饱和)
  • 将新的色相、饱和度和原始 V(亮度)合并到 3 通道 HSV 图像
  • 将 HSV 图像转换回 RGB 空间
  • 将原来的 Alpha 通道合并回来

看起来像这样:

#!/usr/local/bin/python3
import numpy as np
from PIL import Image

# Open and ensure it is RGB, not palettised
img = Image.open("keyshape.png").convert('RGBA')

# Save the Alpha channel to re-apply at the end
A = img.getchannel('A')

# Convert to HSV and save the V (Lightness) channel
V = img.convert('RGB').convert('HSV').getchannel('V')

# Synthesize new Hue and Saturation channels using values from colour picker
colpickerH, colpickerS = 10, 255
newH=Image.new('L',img.size,(colpickerH))
newS=Image.new('L',img.size,(colpickerS))

# Recombine original V channel plus 2 synthetic ones to a 3 channel HSV image
HSV = Image.merge('HSV', (newH, newS, V))

# Add original Alpha layer back in
R,G,B = HSV.convert('RGB').split()
RGBA = Image.merge('RGBA',(R,G,B,A))

RGBA.save('result.png')

With colpickerH=10你明白了(尝试把Hue=10 here https://www.w3schools.com/colors/colors_hsl.asp):

With colpickerH=120你明白了(尝试把Hue=120 here https://www.w3schools.com/colors/colors_hsl.asp):


只是为了好玩,您可以在不编写任何 Python 的情况下完成完全相同的操作,只需在命令行中使用图像魔术师它安装在大多数 Linux 发行版上,并且适用于 macOS 和 Windows:

# Split into Hue, Saturation, Lightness and Alpha channels
convert keyshape.png -colorspace hsl -separate ch-%d.png

# Make a new solid Hue channel filled with 40, a new solid Saturation channel filled with 255, take the original V channel (and darken it a little), convert from HSL to RGB, copy the Alpha channel from the original image
convert -size 73x320 xc:gray40 xc:white \( ch-2.png -evaluate multiply 0.5 \) -set colorspace HSL -combine -colorspace RGB ch-3.png -compose copyalpha -composite result.png

是的,我可以把它写成一行行,但它会更难阅读。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PIL 改变颜色通道强度 的相关文章

随机推荐

  • XPath 元素包含 2 个子元素,每个子元素都与特定文本匹配

    我正在使用 Selenium 来定位页面上的某些元素 我有一张看起来像这样的桌子 table tbody tr td Text1 td td Text2 td tr tbody table Each 元素与此模式匹配 我想传入两个字符串 t
  • 尝试映射具有重复值的系列时出现 InvalidIndexError

    我正在尝试将医院名称映射到其英国邮政编码 我有这些医院 在英国称为 Trusts 的脊柱手术的 csv 该 csv 是 kate spine csv 我从中导入一列 信任 以简化操作 import pandas as pd spine pd
  • Pod 和部署有什么区别?

    我一直在创建豆荚type deployment但我看到一些文档使用type pod 进一步来说多容器 Pod 的文档 http kubernetes io docs user guide pods multi container apiVe
  • React router Link 不会导致组件在嵌套路由内更新

    这真让我抓狂 当我尝试在嵌套路由中使用 React Router 的 Link 时 链接会在浏览器中更新 但视图不会改变 然而 如果我刷新页面到链接 它就会出现 不知何故 该组件没有在应该更新的时候更新 或者至少这是目标 这是我的链接的样子
  • 如何在 Google OAuth 客户端中使用私有 IP 作为“授权 JavaScript 来源”?

    我使用 Google OAuth2 在我的网站中实现了 使用 google 登录 在 Google API 控制台中Authorized JavaScript origins我目前拥有的清单http localhost 3000 但现在我想
  • 无法连接到 gitlab CI 中 unix:///var/run/docker.sock 的 Docker 守护进程

    我查看了其他问题 但找不到自己的解决方案 我在 gitlab 中设置 CI 并使用 gitlab 的共享运行器 在构建阶段 我使用 docker 镜像作为基础镜像 但是当我使用docker命令它说 无法连接到位于 unix var run
  • iPhone 应用程序的唯一标识符

    对于将图像提交到服务器的 iPhone 应用程序 我需要以某种方式将来自特定手机的所有图像绑定在一起 每次提交时我都想发送一些唯一的电话号码 看着 UIDevice mainDevice uniqueIdentifier and NSUse
  • 为什么 Visual Studio 代码格式不能正常用于 Razor 标记?

    或者 我应该问 VS 代码格式化何时可以正确用于 Razor 标记 这种格式适用于大多数结构 但似乎对 if 块感到窒息 下面的代码是VS格式化的 修复这种情况很容易 只需多一个缩进 但我很好地接受了日常使用中的格式 并且喜欢在我的大部分代
  • 在 Chrome 和 Safari 中使用 onafterprint

    我知道直到最近onafterprint仅适用于 IE 最近 HTML5 已将其添加到其事件列表中 我只在 Firefox 中成功使用它 但无法让它在 Chrome 或 Safari 中运行 当它在正文中使用时 它似乎仅在 Firefox 中
  • 使用访问令牌重置环回密码

    我正在开发一个使用 Loopback 作为框架的项目 其中包括用户和身份验证 我添加了生成并通过电子邮件发送的密码重置路由 一切似乎都正常工作 最近 我发现密码重置似乎不起作用 这里重置密码的流程是 调用用户密码重置方法 通过重置事件发送电
  • 获取 xml body 的所有元素并添加到 struct

    我正在寻找一种方法来循环 XML Body 并将每个 xml 元素传递到结构中 我通过以下方式访问了 xml 主体
  • 随着时间的推移围绕枢轴点旋转游戏对象

    我使用以下代码相对于另一个枢轴点旋转一个点 Vector3 RotatePointAroundPivot Vector3 point Vector3 pivot Vector3 angles Vector3 dir point pivot
  • 尝试共享图像时 Facebook 不会出现在共享窗口上

    我在应用程序中创建了一个位图 并希望使用 Intent ACTION SEND 通过电子邮件应用程序或 Facebook 共享它 共享窗口打开 gmail 和 yahoomail 应用程序图标出现 但没有 facebook 或 g 我真的不
  • @PostConstruct 中没有会话休眠

    MyDao 类具有通过 Hibernate SessionFactory 执行整个持久性任务的方法 它工作得很好 我在 MyService 中注入了 MyDao 如上所示 但是当在注入 MyDao 后调用 PostConstruct ini
  • 更好地理解 Java 中的递归

    好吧 我对 Java 中的递归有些困惑 假设我有以下代码 static int findShortestString String paths int lo int hi if lo hi return lo int minindex fi
  • mongos 上的 MongoDB 错误:位置选项太多

    我正在尝试运行一个批处理脚本 这应该是我第一次在 mongodb 上进行分片 它在这一行显示以下错误 D mongodb win32 x86 64 2 2 3 bin gt mongos configdb localhost 26050 l
  • 我可以使用 shmctl 调整 Linux 共享内存的大小吗?

    我有一个 C 应用程序 它通过 shmget 2 在 Linux 系统上分配共享内存 我存储在共享内存中的数据会定期增长 我想以类似于 realloc 增长常规内存的方式调整共享内存的大小 有没有办法做到这一点 我在 IBM 网站上找到了一
  • Python 许多依赖项中的任何一个

    我有时会遇到这样的情况 我有一个包可以依赖于包 A 或 B 例如 我的项目依赖于一个名为spam 如果该项目重命名为pyspam 我的项目可以取决于spam or pyspam 我无法弄清楚 或找到 如何在 setup py 中定义此类依赖
  • 安装 Angular 不支持的引擎,OSX

    我正在重新安装我的 MacBook 当我安装 npm install g angular cli Angular 时 我收到以下消息 知道为什么吗 我怀疑 nom 版本 但我附带了节点 Developments npm install g
  • PIL 改变颜色通道强度

    我想制作一个颜色选择器 它可以重新着色 png 纹理 同时保留 python3 中的透明度 我只希望图像的较亮部分重新着色 但也保持渐变 我能想到的唯一选择是调整颜色通道强度 但是我在 PIL 文档中没有找到类似的内容 如何更改颜色通道强度