Colors 合并/混合两个ARGB(阿尔法红、绿-蓝)值

Colors 合并/混合两个ARGB(阿尔法红、绿-蓝)值,colors,alpha,argb,Colors,Alpha,Argb,我一直在努力结合两个ARGB值-尽管有很多阅读,例如这里 我没有得到我所期望的结果——或者我所期望的是错误的;如果有人能建议一个函数来做这件事,那就太好了 我想结合: 彩色(红色=255,绿色=255,蓝色=0,阿尔法=100) 颜色B(红色=0,绿色=0,蓝色=100,阿尔法=200) 并以红色、绿色、蓝色和Alpha格式输出值 我希望输出如下(绿色中心颜色): 非常感谢你帮助这个愚蠢的程序员 像大多数问题一样,一个人最终只能自己回答: public static int MergeColo

我一直在努力结合两个ARGB值-尽管有很多阅读,例如这里

我没有得到我所期望的结果——或者我所期望的是错误的;如果有人能建议一个函数来做这件事,那就太好了

我想结合:

  • 彩色(红色=255,绿色=255,蓝色=0,阿尔法=100)

  • 颜色B(红色=0,绿色=0,蓝色=100,阿尔法=200)

  • 并以红色、绿色、蓝色和Alpha格式输出值

    我希望输出如下(绿色中心颜色):


    非常感谢你帮助这个愚蠢的程序员

    像大多数问题一样,一个人最终只能自己回答:

    public static int MergeColors(int backgroundColor, int foregroundColor) {
        final byte ALPHA_CHANNEL = 24;
        final byte RED_CHANNEL   = 16;
        final byte GREEN_CHANNEL =  8;
        final byte BLUE_CHANNEL  =  0;
    
        final double ap1 = (double)(backgroundColor >> ALPHA_CHANNEL & 0xff) / 255d;
        final double ap2 = (double)(foregroundColor >> ALPHA_CHANNEL & 0xff) / 255d;
        final double ap = ap2 + (ap1 * (1 - ap2));
    
        final double amount1 = (ap1 * (1 - ap2)) / ap;
        final double amount2 = amount1 / ap;
    
        int a = ((int)(ap * 255d)) & 0xff;
    
        int r = ((int)(((float)(backgroundColor >> RED_CHANNEL & 0xff )*amount1) +
                ((float)(foregroundColor >> RED_CHANNEL & 0xff )*amount2))) & 0xff;
        int g = ((int)(((float)(backgroundColor >> GREEN_CHANNEL & 0xff )*amount1) +
                ((float)(foregroundColor >> GREEN_CHANNEL & 0xff )*amount2))) & 0xff;
        int b = ((int)(((float)(backgroundColor & 0xff )*amount1) +
                ((float)(foregroundColor & 0xff )*amount2))) & 0xff;
    
        return a << ALPHA_CHANNEL | r << RED_CHANNEL | g << GREEN_CHANNEL | b << BLUE_CHANNEL;
    }
    
    publicstaticintmergecolors(intbackgroundcolor,intforeggroundcolor){
    最终字节ALPHA_通道=24;
    最终字节RED_通道=16;
    最终字节绿色通道=8;
    最终字节蓝色_通道=0;
    最终双通道ap1=(双通道)(背景色>>ALPHA_通道&0xff)/255d;
    最终双通道ap2=(双通道)(foregroundColor>>ALPHA_通道&0xff)/255d;
    最终双ap=ap2+(ap1*(1-ap2));
    最终双倍金额1=(ap1*(1-ap2))/ap;
    最终双倍金额2=金额1/ap;
    inta=((int)(ap*255d))&0xff;
    int r=((int)((浮点)(背景色>>红色通道和0xff)*数量1)+
    ((浮动)(前底色>>红色通道和0xff)*数量2))&0xff;
    int g=((int)((浮点)(背景色>>绿色通道和0xff)*数量1)+
    ((浮动)(前基色>>绿色通道和0xff)*数量2))&0xff;
    int b=((int)((浮点)(背景色和0xff)*数量1)+
    ((浮动)(前底色和0xff)*数量2))&0xff;
    
    返回a此处的问题是您没有指定预期发生的情况。有多种“组合”方法两种颜色。有很多方法可以组合两种颜色;例如,可以从一种颜色中提取色调,从另一种颜色中提取值、饱和度和alpha;同样,您可以平均每个属性。您需要定义如何组合它们。@Richard:lol,great minds;):)这就是我请求帮助的原因。我希望添加图像的编辑可以帮助您!Ta