Obtención de un resultado invertida del uso de FromArgb R = B? ¿de dónde viene esta falla?

StackOverflow https://stackoverflow.com/questions/1798396

  •  22-09-2019
  •  | 
  •  

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);
    }
 }
}
¿Fue útil?

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top