17

Tôi đang cố gắng thực hiện thao tác trộn alpha của hình ảnh RGBA (hình nền trước), trên hình ảnh RGB (hình nền). Tuy nhiên, trong khi làm như vậy tôi nghĩ rằng tôi có thể làm việc trộn alpha sai hoặc làm sai. Ví dụ: pixel của hình ảnh RGB của tôi có màu xám (127, 127, 127). Pixel của hình ảnh RGBA của tôi cho pixel sẽ là (0, 0, 255). Sau khi tôi thực hiện thao tác trộn, màu cuối cùng sẽ là (127, 0, 255). Tuy nhiên, tôi nghĩ rằng đó là một sự pha trộn phụ gia và khác với hoạt động tôi đang làm.Trộn alpha theo cách thủ công pixel RGBA với pixel RGB

bao giá trị của tôi được thiết lập, hãy xem này

incPixelColor[0] = 0; (red) 
incPixelColor[1] = 0; (green) 
incPixelColor[2] = 255; (blue) 
incPixelColor[3] = 255; (alpha) 

currentPixelColor[0] = 127; (red) 
currentPixelColor[1] = 127; (green) 
currentPixelColor[2] = 127; (blue) 

Đối với cách tính toán của tôi được thiết lập, hãy xem này

float incAlpha = (currentPixelColor[3]/255.0f); 

float red = ((float)incPixelColor[0]/255.0f * incAlpha) + ((float)currentPixelColor[0]/255.0f); 
float green = ((float)incPixelColor[1]/255.0f * incAlpha) + ((float)currentPixelColor[1]/255.0f); 
float blue = ((float)incPixelColor[2]/255.0f * incAlpha) + ((float)currentPixelColor[2]/255.0f); 


currentPixelColor[0] = min(red * 255, 255.0f); 
currentPixelColor[1] = min(green * 255, 255.0f); 
currentPixelColor[2] = min(blue * 255, 255.0f); 

Đối với pixel không có alpha, tôi sẽ như cho giá trị được (0, 0, 255) sau đó cho hình ảnh với alpha tôi muốn cho nó để pha trộn. Vào cuối của hoạt động trên, nó sẽ là (127, 127, 255). Tôi có nên kiểm tra xem liệu có alpha cho mỗi điểm ảnh hay không và nếu có thì hãy trộn hay có cách nào khác để làm điều này không?

+0

Bạn đang pha trộn phụ gia. Hãy xem xét trộn tuyến tính như thế này: y = (x0 * w) + (x1 * (1-w)) –

+1

Đó là rất nhiều 255 quy mô qua lại. Nó không phải là cần thiết nếu hoạt động của bạn duy trì bình thường. – fche

Trả lời

22

Một điển hình "Over" pha trộn được thực hiện theo cách sau:

outputRed = (foregroundRed * foregroundAlpha) + (backgroundRed * (1.0 - foregroundAlpha)); 

Và sau đó lặp đi lặp lại cho các kênh màu xanh và màu xanh lá cây. Làm điều này cho mỗi điểm ảnh.

+0

Có lẽ tôi đã nhầm lẫn, nhưng đó không phải là những gì tôi đã làm chưa? – mmurphy

+0

Không, những gì bạn đang làm là outputRed = (foreRed * foreAlpha) + backgroundRed. Bạn cần nhân backgroundRed bởi (1.0 - foreAlpha). – user1118321

+0

Xin lỗi vì quá muộn, nhưng điều gì sẽ xảy ra với kênh alpha đầu ra alpha nếu cả pixel đích và nguồn là trong suốt? –

2

Có vẻ như bạn đã bỏ lỡ hệ số (1-Alpha) cho nền (currentPixelColor)

Các vấn đề liên quan