Obtención de un resultado invertida del uso de FromArgb R = B? ¿de dónde viene esta falla?
Pregunta
R y B se pone de error cuando se utiliza esta lógica, Parece que no puedo encontrar lo que estoy haciendo mal, mi solución, al final fueron muevo de un tirón la ryb no es bueno en absoluto y estoy tratando de encontrar donde los breakes lógicas .
el Label1.Text = ColorX; Eventos R = 255, G = 0, B = 0 cuando shold sea R = 0, G = 0, B = 255, ¿dónde esta fracasan?
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);
}
}
}
Solución
creo que va sobre esto en una forma extraña por una; El color tiene R, G, B y propiedades se puede utilizar en lugar de la coincidencia de cadenas:
R = colorX.R;
G = colorX.G;
B = colorX.B;
En segundo lugar, para hacer frente a su pregunta, GetPixel está consiguiendo probablemente BGR píxeles en lugar de RGB formateado. BGR se utiliza comúnmente en los mapas de bits y la HDC de la ventana que está hablando se vuelve más probable en este formato.
Editar: desde docs el MSDN :
Al especificar un color RGB explícita, el valor COLORREF tiene la siguiente forma hexadecimal. 0x00bbggrr
El método Color.FromArgb () espera 0xAARRGGBB. Su solución es muy bien, a pesar de una solución adecuada sería voltear los componentes R y antes de llamar al método .FromArgb ():
int color = GetPixel(...);
return Color.FromArgb(color & 0xFF, color >> 8 & 0xFF, color >> 16);