Colors 什么';在两种颜色之间插值最有效的方法是什么?(需要伪码和按位操作)

Colors 什么';在两种颜色之间插值最有效的方法是什么?(需要伪码和按位操作),colors,hex,interpolation,Colors,Hex,Interpolation,制作黑莓应用程序,想要一个渐变类。插入两种颜色最有效的方法是什么(如速度和电池寿命)?请具体说明 //当然是Java int c1=0xFFAA0055//颜色1,ARGB int c2=0xFF00CCFF//颜色2,ARGB float st=0//插值中的当前步长,介于0和1之间 从这里开始帮助。 我应该分离每种颜色的每个通道,将它们转换为十进制并插值吗?有没有更简单的方法 interpolatedChannel=red1+((red2-red1)*st) interpolatedCha

制作黑莓应用程序,想要一个渐变类。插入两种颜色最有效的方法是什么(如速度和电池寿命)?请具体说明

//当然是Java
int c1=0xFFAA0055//颜色1,ARGB
int c2=0xFF00CCFF//颜色2,ARGB
float st=0//插值中的当前步长,介于0和1之间
从这里开始帮助。 我应该分离每种颜色的每个通道,将它们转换为十进制并插值吗?有没有更简单的方法

interpolatedChannel=red1+((red2-red1)*st)
interpolatedChannel=interpolatedChannel.toString(16)
^这样做对吗?如果速度和效率 在移动应用程序中很重要,我应该使用位操作吗

救救我

更新了我的答案(找到了更好的方法):

以下技术将丢失每个通道的1位精度,但速度非常快,因为您不必将颜色拆分为通道:

intcolor1=。。。;
int color2=。。。;
int interpolatedColor=((color1&0xfefe)>>1)+
((color2&0xfefe)>>1));

因此,首先您可以通过
0xfefe
两种颜色。这将删除每个通道的最后一位(如我所说,降低了精度)。之后,可以安全地将整个值除以2(实现为右移除以1)。最后,您只需将这两个值相加。

您将必须分离通道,但无需将它们转换为十进制

例如,如果允许256种可能的渐变:

red=red1+((red2-red1)*stage/256)
编辑:既然你说你对比特管理知之甚少,这里有一个快速分割通道的方法:

red=color&0x000000ff;
绿色=颜色&0x0000ff00;
蓝色=颜色&0x00ff0000;
阿尔法=颜色>>24;
并将它们结合起来:

color=(alpha
private函数插值颜色对比(a:int,b:int,lerp:Number):int
{ 
变量MASK1:int=0xff00ff;
var MASK2:int=0x00ff00;
变量f2:int=256*lerp;
变量f1:int=256-f2;
返回(((a&MASK1)*f1)+(b&MASK1)*f2))>>8)和MASK1)
|(((((((a&MASK2))f1)+((b&MASK2)(f2))>8)和;
} 
不确定这是否是最简洁的方法,但它使用的局部变量和运算符比经典方法少,经典方法是先将它们分为3个通道


哦-很抱歉,这是Actionscript,但应该清楚如何将其转换为Java。

只是/u/Quasimondo的Java版本的答案:

public static int mixColors(int a, int b, float ratio){
    int mask1 = 0x00ff00ff;
    int mask2 = 0xff00ff00;

    int f2 = (int)(256 * ratio);
    int f1 = 256 - f2;

    return (((((a & mask1) * f1) + ((b & mask1) * f2)) >> 8) & mask1) 
         | (((((a & mask2) * f1) + ((b & mask2) * f2)) >> 8) & mask2);
}
如果您只需要精确的50/50比率,则可以删除位移位:

public static int mixColors(int a, int b){
    int mask1 = 0x00ff00ff;
    int mask2 = 0xff00ff00;

    return (((a & mask1) + (b & mask1)) & mask1) 
         | (((a & mask2) + (b & mask2)) & mask2);
}

问题是需要伪代码和位操作。我对位管理一无所知。示例!这只提供了50/50的混合,而不是可配置的0..1混合。@Jason:哦,我没有意识到!你说得对……我将把答案改为社区wiki。也许它对某些人仍然有用……是的,这不完全是我需要的。如果你找到了什么,pl轻松帮助!这是从Amiga demos移植的吗?那么我如何分离通道呢?回到我做actionscript的时候,有一次我需要这样做。我将十六进制值转换成字符串,将字符串分割成两个字符的组成部分,并将每个组成部分转换成一个整数。我确信这是一种糟糕的方法,所以请在这里帮助我。另外,我需要知道这个公式是否是最好的方法,或者按位运算是否更快/更好。您不需要将十六进制转换为字符串来分隔它。唯一的建议是查看该语言的按位运算符,它们通常是“&”、“|”、“^”和“。您确实希望在合并回之前屏蔽插值通道。用于计算绿色通道的除法将用绿色余数污染红色通道(例如)否则。谢谢你的回答。现在我有了单独的通道,但我仍然需要插值的东西。帮助?我有…我只是认为有一种方法可以用逐位运算来计算公式,这样做会更快。我说的对吗?有什么理由不使用java的颜色类吗?我不知道这个bitmagic是如何工作的,但是如果你将mask2更改为0xFF00FF00(保持所有其他内容不变),它也将在a和b之间线性插值alpha(假设为ARGB)