2009-04-14 27 views
49

Tôi đang viết bộ chọn màu nhận các giá trị RGB pixel từ bất cứ nơi nào bạn trỏ đến trên màn hình. Tôi cũng muốn có tùy chọn chỉ định màu mà tôi chọn đã có giá trị alpha. Tôi chỉ tự hỏi làm thế nào tôi có thể tính toán màu sắc kết quả.Làm cách nào để tính toán màu RGB bằng cách chỉ định số lượng pha trộn alpha?

Ví dụ:

Kết quả là màu của điểm ảnh là 240.247.249 nhưng tôi biết rằng màu sắc ban đầu có opacity 10% và đang trên đỉnh của một (255.255.255) nền trắng. Tính toán để làm việc ra các giá trị RGB ban đầu là gì?

Trả lời

80

Phương trình pha trộn giữa các ý kiến:

out = alpha * new + (1 - alpha) * old 

đâu out, newold là màu RGB và alpha là một số dấu chấm động trong khoảng [0,1].

Vì vậy, bạn phải (đối với màu đỏ):

240 = 0.1 * newR + 0.9 * 255 

Giải quyết cho newR, chúng tôi nhận được:

newR = (240 - 0.9 * 255)/0.1 

mà đánh giá đến 105. Lặp lại cho các thành phần khác, và bạn thực hiện xong .

+1

? không phải là phương trình của bạn giống như tôi? –

+0

Có, tôi là các phương trình giống nhau, nhưng được viết hơi khác. – unwind

+2

Thật tuyệt vời! Tôi đã kéo tóc của tôi trong 2 giờ cố gắng để đảo ngược kỹ sư phương trình này bằng cách so sánh các giá trị trong photoshop! Cảm ơn bạn đã làm chậm mất tóc của tôi! Làm thế nào bạn tìm thấy hoặc đưa ra phương trình này? – talentedmrjones

31

Tôi chỉ tự hỏi làm thế nào bạn biết alpha của nó chứ không phải r, g, b ... Trừ khi chế độ hoà trộn được sử dụng là trong mọi trường hợp Bình thường, bạn sẽ không thể tính giá trị ban đầu. Và ngay cả khi tất cả là lý tưởng, bạn sẽ chỉ có thể gần đúng, như một số làm tròn có lẽ đã diễn ra khi đi từ bản gốc đến kết quả. Ngoài ra, bạn rất có thể sẽ phải quay vòng khi quay lại từ kết quả ban đầu.

Nếu chế độ hoà trộn là Normal, sau đó nó không phải là quá khó khăn :-)

opacity*original + (1-opacity)*background = resulting pixel 

original R = (resulting R - ((1-opacity)*background R))/opacity. 
original G = (resulting G - ((1-opacity)*background G))/opacity. 
original B = (resulting B - ((1-opacity)*background B))/opacity. 

trong đó opacity là (alpha/100).

+0

Xin lỗi, tôi có nên nói rằng chế độ hoà trộn là bình thường. Tôi đã chọn màu từ một trang web có một hình ảnh với một bộ opacity, vì vậy tôi biết nó không chỉ là rgb. Dù sao cũng cảm ơn bạn. –

3

Các pseudo-code sau đây giải quyết vấn đề của bạn:

CalculateSolidColorFromTransparentColor(Color color, Color background) 
    { 
     alpha = color.A/255; 
     oneminusalpha = 1 - alpha; 

     newR = ((color.R * alpha) + (oneminusalpha * background.R)); 
     newG = ((color.G * alpha) + (oneminusalpha * background.G)); 
     newB = ((color.B * alpha) + (oneminusalpha * background.B)); 
    } 

Lưu ý rằng màu đầu vào và backgroud đã giá trị thể hiện trong [0..255]

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