计算机中的颜色VII——快速计算纯色的偏转

  在颜色的实际使用中,通过更改颜色的色相值改变图片的颜色是常用的方法。

  通过更改纯色的色相值称为纯色的偏转,例如:纯色(255,0,0)顺时针偏转60就得到纯色(255,255,0),逆时针偏转60得到纯色(255,0,255)。

  那么纯色(255,44,0)顺时针偏转127得到什么颜色呢?下面的文章就是讲述计算方法。

  在“计算机中的颜色V——快速计算颜色的色相值”中,纯色的色相值H的计算公式为:

  当G≥B时,H=(255-R+G+B)/255×60       公示1

  当G<B时,H=360-(255-R+G+B)/255×60    公式2

  令ω为偏转值,且定义正值为顺时针偏转,负值为逆时针偏转,ω的取值范围为[-180,180]

  则偏转后的颜色的色相值H'=H+ω,此时H'有一个溢出的问题。后文再讨论。

  在“计算机中的颜色VI——从色相值到纯色的快速计算”中,

  计算纯色的关键就在于纯色和红色的夹角θ,当H<180,θ=H;当H>180,θ=360-H

  结合公式1和公式2,可知θ=(255-R+G+B)/255×60

  偏转后的纯色和红色的夹角θ’=θ+ω,此时的ω和上文的ω有一定的区别,在六色环的右边,定义和上文一样;在六色环的左边,定义和上文相反,逆时针正值,顺时针负值。因为六色环左右对称的缘故。

  λ’=θ’/60×255=(θ+ω)/60×255=[(255-R+G+B)/255×60+ω]/60×255=255-R+G+B+ω/60×255

  令ω’=ω/60×255,则λ’=255-R+G+B+ω’

  再考虑λ’的溢出问题,

  当λ’<0时,说明,偏转后的颜色跨越了左右分区(注:在上文中,实际颜色分为左右两个分区)。此时,令λ’’=-λ’

  当λ’>765时,也说明偏转后的颜色跨越了左右分区。此时,令λ’’=1530-λ’

  否则λ’’=λ’

  则偏转后的纯色(R’,G’,B’)

  R’=510-λ’’;若R’<0,则R’=0;若R’>255,则R’=255;

  G’=λ’’;若G’>255,则G’=255;

  B’=λ’’-510;若B’<0;则B’=0;

  若偏转后的颜色在左半区,那么交换G’,B’

  如何判断偏转后的颜色在左半区,而要交换G’,B’?

  对于G≥B,原色在右半区,那么当出现跨越分区的情况。偏转后的纯色在左半区。就是λ’<0或λ’>765

  对于G<B,原色在左半区,那么当没出现跨越分区的情况。偏转后的纯色在左半区。就是0≤λ’≤765

  这两种情况,有没有统一的表述公式呢?

  当(G<B)XOR(λ’<0或λ’>765)表达式为TRUE时,要交换G’,B’

  XOR表示异或运算,两个逻辑表达式为一真一假时,得到TRUE,反之得到FALSE

 

  好,把上面的推理过程梳理一下。纯色(R,G,B)偏转ω后,如何计算偏转纯色(R’,G’,B’)

  当G<B时,ω=-ω

  ω’=ω/60×255

  λ’=255-R+G+B+ω’

  当λ’<0时,令λ’’=-λ’

  当λ’>765时,令λ’’=1530-λ’

  否则λ’’=λ’

  偏转纯色的分量

  R’=510-λ’’;若R’<0,则R’=0;若R’>255,则R’=255;

  G’=λ’’;若G’>255,则G’=255;

  B’=λ’’-510;若B’<0;则B’=0;

  若(G<B)XOR(λ’<0或λ’>765)=True时,交换G’,B’分量的值

 

  (255,44,0)顺时针偏转127得到什么颜色呢?答案是(0,255,74)

  (255,44,0)逆时针偏转127得到什么颜色呢?答案是(14,0,255)

上一篇:交换函数的陷阱——VB2005


下一篇:PHP SQL 注入攻击的技术实现以及预防办法