2015-10-27 1 views
0

Я реализую альфа-смешивание, и один из примеров, с которыми я столкнулся, использовал этот формат. Я смущен, почему деление на 256 и почему нет inv_alpha в красном и синем каналахПрояснение альфа-смешивания

int pixel,vga_pixel; 
int alpha, blue, green, red, pixel; 

int height = 1296; 
int width = 968; 
int x, y; 

for (y = 0; y <= height; y++){ 
    for (x = 0; x <= width; x++){ 
     pixel = *(img.memloc + x + y); 
      //0xff gets the first 8 bits, in this case red 
      red = pixel & 0xff; 

      //shift by 8 to get rid of red then AND to get first 8, here green 
      green = pixel >> 8 & 0xff; 

      blue = pixel >> 16 & 0xff; 

      alpha = pixel >> 24 & 0xff; 
      int inv_alpha = 0xff - alpha; // 1-alpha 

      int vga_red = (red*(int)alpha); 
      int vga_green = (green*(int)alpha + inv_alpha/256); 
      int vga_blue = (blue*(int)alpha); 
      int vga_alpha = 0xff; 

      int vga_pixel = vga_alpha << 24 | vga_blue << 16 | vga_green << 8 | vga_red;    
    } 
} 

Может кто-нибудь уточнить, если это правильный метод, и почему?

+0

Возможно, вы должны спросить, в чем разница 'inv_alpha/256', целочисленное деление между числом от 0 до 255 (предположим) и 256, дает .... 0. Я предполагаю, что вы можете просто игнорировать и убери это. –

+0

У меня создалось впечатление, что фактическая формула: vga_red = red * alpha + inv_alpha * red. это неправильно? – pointnotfoe

+0

Формула: red = source_red * alpha + destination_red * inv_alpha. В этом коде не происходит смешивания, потому что есть только один набор значений RGB. – samgak

ответ

2

Похоже, вы смешали формулы из целых чисел и с плавающей запятой. Например, vga_red должен, вероятно, стать 255, если оба red и alpha, так что он будет ближе к (red*alpha)/255, но, вероятно, вам, вероятно, следует обеспечить правильное округление с помощью (red*alpha+127)/255.

Разделительная inv_alpha с 256 всегда дают нуль, так что это, вероятно, не так, я предполагаю, что вы хотите, чтобы результат green если alpha является 255 и 255 если alpha является 0. Таким образом, это станет чем-то вроде (green*alpha+127)/255 + inv_alpha.

0

Формула для альфа-смешивания составляет C = alpha_A * A + (1 - alpha_A * B). Но в этой формуле мы работаем со значениями с плавающей запятой, а альфа - значением от 0 до 1.

Поскольку мы работаем с целыми значениями, альфа (и красный, зеленый и синий также) является значением между 0 и 255. Таким образом, значение 1 - alpha_A инкапсулировано в inv_alpha_A = 255 - alpha_A.

Поскольку каждый цвет не может превышать максимальное значение одного байта, мы должны убедиться, что расчетное число не превышает 255. Таким образом, мы должны разделить на 255.This результаты в:

C = (alpha_A * A + inv_aplha_A * B)/255

(Я намеренно пропустил проблему округления).

+0

так почему только на зеленом? – pointnotfoe

+0

Должно ли это быть '(1 - alpha_A) * B' вместо? – SirGuy

 Смежные вопросы

  • Нет связанных вопросов^_^