2009-11-25 35 views
0

當使用這個邏輯時,R和B會出錯,我似乎無法找到我做錯了什麼,我的解決方法最終是我翻轉了R,而B並不擅長,並試圖找到邏輯在哪裏破壞。使用FromArgb得到一個反轉結果R = B?這在哪裏失敗?

label1.Text = colorX;當R = 0,G = 0,B = 255時,顯示R = 255,G = 0,B = 0,這在哪裏失敗?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
using System.Text.RegularExpressions; 


namespace Color_tool 
{ 
public partial class Form1 : Form 
{ 
    Regex rgbInputR; 
    Regex rgbInputG; 
    Regex rgbInputB; 

    int r; 
    int g; 
    int b; 


    string colorX; 

    [DllImport("gdi32")] 
    private static extern int GetPixel(IntPtr hdc, int x, int y); 
    [DllImport("User32")] 
    private static extern IntPtr GetWindowDC(IntPtr hwnd); 

    private static readonly IntPtr DesktopDC = GetWindowDC(IntPtr.Zero); 

    public static System.Drawing.Color GetPixelAtCursor() 
    { 
     System.Drawing.Point p = Cursor.Position; 
     return System.Drawing.Color.FromArgb(GetPixel(DesktopDC, p.X, p.Y)); 
    } 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     button1.BackColor = Color.Black; 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     colorX = GetPixelAtCursor().ToString(); 
     Color backX = GetPixelAtCursor(); 
     this.BackColor = Color.FromArgb(r,g,b); 
     label1.Text = colorX; 
     RGB_value(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (timer1.Enabled == false) 
      timer1.Enabled = true; 
     else 
      timer1.Enabled = false; 
    } 

    private void RGB_value() 
    { 
     rgbInputR = new Regex(@"(?<=R=)\d{0,3}"); 
     rgbInputG = new Regex(@"(?<=G=)\d{0,3}"); 
     rgbInputB = new Regex(@"(?<=B=)\d{0,3}"); 

     Match R, G, B; 

     R = rgbInputR.Match(colorX); 
     G = rgbInputG.Match(colorX); 
     B = rgbInputB.Match(colorX); 
     //had to flip the R and B ??? 
     b = int.Parse(R.Groups[0].Value); 
     g = int.Parse(G.Groups[0].Value); 
     r = int.Parse(B.Groups[0].Value); 
    } 
} 
} 

回答

2

我想你會以奇怪的方式去解決這個問題;顏色有可以使用的,而不是字符串匹配R,G,B的性能:

R = colorX.R; 
G = colorX.G; 
B = colorX.B; 

二,解決你的問題和GetPixel可能是越來越BGR格式的像素,而不是RGB。 BGR通常在位圖中使用,並且與之交談的窗口的HDC很可能以這種格式返回。

編輯:從MSDN文檔:

當指定一個明確的RGB顏色, 的COLORREF值具有以下 十六進制形式。 0x00bbggrr

Color.FromArgb()方法期望0xAARRGGBB。你的解決方法是蠻好的,雖然一個適當的解決將是你調用.FromArgb()方法之前翻轉R和B部分:

int color = GetPixel(...); 
return Color.FromArgb(color & 0xFF, color >> 8 & 0xFF, color >> 16); 
+0

感謝您抽空閱讀這一點,好awnser,虐待修復時間我的代碼,你的建議:) – Darkmage 2009-11-25 19:34:03

相關問題