开始正文之前,讲几句题外话,咱又重新回到了知乎,知乎账号名称与公众号名称一致,都叫巴山学长。知乎账号分享的内容将更加灵活多样,任何想给大家分享的内容都会在知乎上给大家分享,而公众号将侧重于编程内容的分享。尽量不炒冷饭,把公众号的内容搬到知乎,或把知乎内容搬到公众号。此外,公众号将正式启用GitHub作为分享代码的仓库,地址如下:
github.com/bashancode. 今后的懂科学的程序员所属账号所公开分享的代码都将上传至GitHub,也希望有GitHub账号的多多去给bashancode点赞加星。
咱也注意到自从公众号改名以来,这几天的关注量都是负的。在此也再给大家说明一下,公众号仅仅是换了个名称而已,并不存在转让给其他任何第三方运营的事情,咱依旧是matlab爱好者,希望伙伴们能够继续支持“巴山学长”。
言归正传,之前的学习中遇到了需要将整数值转换为RGB值的情况,于是就用matlab写了这么一个小脚本,可实现RGB与整数值之间得相互转换(PS: 这种方法可以应用到加密领域哦,其实本质上是一种256进制与十进制的相互转换)。RGB到整数值相对容易些,使用如下公式即可完成转换:
而整数值到RGB的转换则需要一点小技巧,从公式(1)中不难看出,整数DEC若对256求余,则可直接得到B,即有:
由(2)求出B之后,此时将DEC与B的差值作为整体来看待,则有:
可以看出,将(3)式两边同时除以256,则变成与(1)类似的式子,即:
让(4)左边对256求余即可得出G,如下:
现已知DEC,B以及G,由(1)式即可得出R的值,即:
本文给出rgb2dec的源代码,完整源代码请点击左下角阅读原文到咱的GitHub仓库下载:
function rgb = dec2rgb(dec)
%{
Features: Converting decimal integers to rgb values.
Formula 1: dec = 256^2*R + 256*G + B;
⟹ B = dec mod 256
C−B = 256^2*R+256*G
⟹ (C−B)/256 = 256R+G
⟹ G ≡ (C−B)/256 mod 256
And then:
(C−B)/256−G = 256*R
⟹ R = (C−B)/256^2 − G/256.
Input: decimal integers
Output: rgb values.
Ref.: https://math.stackexchange.com/questions/1635999/algorithm-to-convert-integer-to-3-variables-rgb
Online tool: https://www.checkyourmath.com/convert/color/rgb_decimal.php
Author(作者): 巴山(bashan)
WeChat Official Account(微信公众号): 懂科学的程序员(ScientificProgrammer)
Github: https://github.com/ScientificProgrammerOwner
ZhiHu(知乎): https://www.zhihu.com/people/67-93-61-26-8
BiliBili(B站): https://space.bilibili.com/205153905
Welcome to subscribe! 欢迎订阅!
%}
try
validateattributes(dec,{'numeric'},{'row','>=',0,'<=',16777215,'integer'});
catch
validateattributes(dec,{'numeric'},{'column','>=',0,'<=',16777215,'integer'});
end
rgb(:,3) = mod(dec,256); % B
rgb(:,2) = mod(fix((dec-rgb(3))/256),256); % G
rgb(:,1) = fix((dec-rgb(3))/65536) - fix(rgb(2)/256); % R
以下是相应的转换示例:
例1:多组rgb转整数值
rgb2 = [1 2 3;4 5 6;7 8 9;10 11 12];
dec2 = rgb2dec(rgb2)
dec2 =
66051
263430
460809
658188
例2:多组单R/G/B转整数值
R2 = [1 4 7 10];
G2 = [2 5 8 11];
B2 = [3 6 9 12];
dec4 = rgb2dec(R2,G2,B2)
dec4 =
66051 263430 460809 658188
例3:多组整数转RGB值
dec6 = [66051 263430 460809 658188];
rgb2 = dec2rgb(dec6)
rgb2 =
1 2 3
4 5 6
7 8 9
10 11 12
当然,如果伙伴想用在线版,可访问checkyourmath提供的在线转换工具,链接如下:checkyourmath.com/convert/color/rgb_decimal.php.
若有问题,欢迎留言讨论!关注支持一下也不错哦!
特别鸣谢:本文采用ciaochaos开发的mpMath工具插入公式,在此对作者的辛勤付出深表感谢!(链接: github.com/ciaochaos/mpMath)
参考资料:
[1] math.stackexchange.com/questions/1635999/algorithm-to-convert-integer-to-3-variables-rgb
如需转载,请在公众号中回复“转载”获取授权,如未经授权擅自搬运抄袭的,本公众号将保留一切追责权利!