![](/img/trans.png)
[英]Using ToArgb() followed by FromArgb() does not result in the original color
[英]Geting a inverted result from using FromArgb R = B? where does this fail?
使用此邏輯時,R和B會出錯,我似乎無法發現我做錯了什么,最后我的解決方法是我翻轉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);
}
}
}
我認為您正在以一種奇怪的方式進行此操作; 顏色具有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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.