java 如何做ARGB颜色插值而不分离组件?

lstz6jyr  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(119)

我自己也尝试过但没能弄明白,我从another thread中找到了一些代码,可以将两种颜色(整数)按指定的分数进行组合,但我只是没有足够的技巧让它使用ARGB整数。有人知道如何将这个函数从组合RGB转换为组合ARGB吗?

public static int mixColors(int a, int b, float fractionB){ 
   int mask1 = 0xff00ff; 
   int mask2 = 0x00ff00; 
    
   int f2 = (int)(256 * fractionB);
   int f1 = 256 - f2;
   
   return   ((((( a & mask1 ) * f1 ) + ( ( b & mask1 ) * f2 )) >>> 8 ) & mask1 ) 
          | ((((( a & mask2 ) * f1 ) + ( ( b & mask2 ) * f2 )) >>> 8 ) & mask2 );
}

我试过将掩码设置为mask1 = 0x00ff00ff; mask2 = 0xff00ff00;,但函数仍然只输出3字节的数字。

41zrol4v

41zrol4v1#

...“由于使用int,第4个字节丢失-您可以在计算(掩码和因子)中使用long来避免这种情况”-user 16320675
谢谢!我应该想到的,但我猜他们都是这么说的。以下是32位整数ARGB颜色值的更新函数:

public static int mixColors(int a, int b){
    long mask1 = 0x00ff00ffL;
    long mask2 = 0xff00ff00L;

    return (int)((((((a & mask1) + (b & mask1)) * 128) >> 8) & mask1) 
               | (((((a & mask2) + (b & mask2)) * 128) >> 8) & mask2));
}

public static int mixColors(int a, int b, float fractionB){
    long mask1 = 0x00ff00ffL;
    long mask2 = 0xff00ff00L;

    short f2 = (short)(256 * fractionB),
          f1 = (short)(256 - f2);
          
    return (int)((((((a & mask1) * f1) + ((b & mask1) * f2)) >> 8) & mask1) 
               | (((((a & mask2) * f1) + ((b & mask2) * f2)) >> 8) & mask2));
}

相关问题