代码之家  ›  专栏  ›  技术社区  ›  TuomasR

用alpha“正常”混合两幅图像的问题

  •  1
  • TuomasR  · 技术社区  · 14 年前

    我正在尝试用Java混合图像。在成功地做了乘法和屏幕混合后,“正常”混合让我头疼。

    我在维基百科上发现,将两个像素与alpha混合的公式是: Co是结果颜色,顶部图像的Ca颜色,底部图像的Cb颜色和顶部的Aa->alpha,底部的Ab->alpha。

    我试着把它翻译成Java,现在有了:

    float t_a = (topPixels[i] >> 24) & 0xff, t_r = (topPixels[i] >> 16) & 0xff, t_g = (topPixels[i] >> 8) & 0xff, t_b = topPixels[i] & 0xff;
    float b_a = (bottomPixels[i] >> 24) & 0xff, b_r = (bottomPixels[i] >> 16) & 0xff, b_g = (bottomPixels[i] >> 8) & 0xff, b_b = bottomPixels[i] & 0xff;
    
    destPixels[i] = 
        (255 << 24 |
        (int)((t_r * t_a) + ((b_r * b_a) * (((255 - t_a) / 255)))) << 16 |  
        (int)((t_g * t_a) + ((b_g * b_a) * (((255 - t_a) / 255)))) << 8 |   
        (int)((t_b * t_a) + ((b_b * b_a) * (((255 - t_a) / 255)))) << 0                     
    );
    

    但这似乎是错误的,因为生成的图像是错误的。

    2 回复  |  直到 8 年前
        1
  •  1
  •   Hannesh    14 年前

    你需要改变很多。

        2
  •  0
  •   Hannesh    14 年前

    如果t\u a不是浮点值,那么(255-t\u a)/255等计算也作为整数进行。您需要预先将一个输入强制转换为一个float,例如((255-t\u a)/255f)。