2008-08-05 37 views
18

Hãy nói rằng chúng ta có một màu ARGB:Chuyển đổi ARBG để RGB với alpha pha trộn

Color argb = Color.FromARGB(127, 69, 12, 255); //Light Urple. 

Khi điều này được vẽ trên đầu trang của một màu sắc hiện có, màu sắc sẽ được pha trộn. Vì vậy, khi nó được pha trộn với màu trắng, màu sắc kết quả là Color.FromARGB(255, 162, 133, 255);

Các giải pháp nên làm việc như thế này:

Color blend = Color.White; 
Color argb = Color.FromARGB(127, 69, 12, 255); //Light Urple.  
Color rgb = ToRGB(argb, blend); //Same as Color.FromARGB(255, 162, 133, 255); 

ToRGB 's thực hiện là gì?

+0

Tôi chỉ muốn nói rằng tôi thấy thật tuyệt vời khi "Light Urple" đã sống sót sau 4 lần chỉnh sửa. –

Trả lời

16

Nó được gọi là alpha blending.

Trong mã psuedocode, giả sử màu nền (hỗn hợp) luôn có 255 alpha. Giả sử alpha là 0-255.

alpha=argb.alpha() 
r = (alpha/255)*argb.r() + (1 - alpha/255)*blend.r() 
g = (alpha/255)*argb.g() + (1 - alpha/255)*blend.g() 
b = (alpha/255)*argb.b() + (1 - alpha/255)*blend.b() 

lưu ý: bạn có thể cần phải có một chút (thêm) cẩn thận về dấu chấm động/int toán và các vấn đề làm tròn, tùy thuộc vào ngôn ngữ. Cast trung gian phù hợp

Edited thêm:

Nếu bạn không có một màu nền với một alpha 255, đại số được rất nhiều phức tạp hơn. Tôi đã thực hiện nó trước đây và đó là một bài tập thú vị để lại cho người đọc (nếu bạn thực sự cần phải biết, hãy hỏi một câu hỏi khác :).

Nói cách khác, màu C hòa trộn vào nền nào giống như trộn A, sau đó trộn B. Kiểu này giống như tính A + B (không giống như B + A).

2

nếu bạn không cần biết điều này trước khi kết xuất, bạn luôn có thể sử dụng phương pháp win32 của getpixel, tôi tin.

Lưu ý: nhập trên iPhone ở giữa Missouri mà không có quyền truy cập nội bộ. Sẽ tra cứu ví dụ win32 thực và xem liệu có tương đương .net hay không.

Trong trường hợp bất cứ ai quan tâm, và không muốn sử dụng (xuất sắc) Câu trả lời được đăng trên đây, bạn có thể nhận được giá trị màu của một điểm ảnh trong Net qua liên kết này MSDN example

4

Tôi biết đây là một tuổi chủ đề, nhưng tôi muốn thêm điều này:

Public Shared Function AlphaBlend(ByVal ForeGround As Color, ByVal BackGround As Color) As Color 
    If ForeGround.A = 0 Then Return BackGround 
    If BackGround.A = 0 Then Return ForeGround 
    If ForeGround.A = 255 Then Return ForeGround 
    Dim Alpha As Integer = CInt(ForeGround.A) + 1 
    Dim B As Integer = Alpha * ForeGround.B + (255 - Alpha) * BackGround.B >> 8 
    Dim G As Integer = Alpha * ForeGround.G + (255 - Alpha) * BackGround.G >> 8 
    Dim R As Integer = Alpha * ForeGround.R + (255 - Alpha) * BackGround.R >> 8 
    Dim A As Integer = ForeGround.A 

    If BackGround.A = 255 Then A = 255 
    If A > 255 Then A = 255 
    If R > 255 Then R = 255 
    If G > 255 Then G = 255 
    If B > 255 Then B = 255 

    Return Color.FromArgb(Math.Abs(A), Math.Abs(R), Math.Abs(G), Math.Abs(B)) 
End Function 

public static Color AlphaBlend(Color ForeGround, Color BackGround) 
{ 
    if (ForeGround.A == 0) 
     return BackGround; 
    if (BackGround.A == 0) 
     return ForeGround; 
    if (ForeGround.A == 255) 
     return ForeGround; 

    int Alpha = Convert.ToInt32(ForeGround.A) + 1; 
    int B = Alpha * ForeGround.B + (255 - Alpha) * BackGround.B >> 8; 
    int G = Alpha * ForeGround.G + (255 - Alpha) * BackGround.G >> 8; 
    int R = Alpha * ForeGround.R + (255 - Alpha) * BackGround.R >> 8; 
    int A = ForeGround.A; 

    if (BackGround.A == 255) 
     A = 255; 
    if (A > 255) 
     A = 255; 
    if (R > 255) 
     R = 255; 
    if (G > 255) 
     G = 255; 
    if (B > 255) 
     B = 255; 

    return Color.FromArgb(Math.Abs(A), Math.Abs(R), Math.Abs(G), Math.Abs(B)); 
} 
Các vấn đề liên quan