Ottenere un risultato invertito usare FromArgb R = B? da dove viene questo fallire?

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

  •  22-09-2019
  •  | 
  •  

Domanda

R e B ottiene l'errore quando si utilizza questa logica, i cant sembrano trovare ciò che sto facendo di sbagliato, la mia soluzione, alla fine, sono stati i capovolgere la R e B, non è affatto buono e im cercando di trovare dove i breakes logica .

il label1.Text = ColorX; mostra R = 255, G = 0, B = 0 quando shold essere R = 0, G = 0, B = 255, dove questo sicuro?

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);
    }
 }
}
È stato utile?

Soluzione

Credo che stai andando su questo in un modo strano per uno; Il colore ha R, G, B e le proprietà è possibile utilizzare invece di string matching:

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

In secondo luogo, per rispondere alla tua domanda, GetPixel sta probabilmente diventando pixel BGR formattati invece di RGB. BGR è comunemente usato in bitmap e la HDC della finestra si sta parlando è probabilmente tornando in questo formato.

Modifica: dal docs MSDN :

  

Quando si specifica un colore esplicito RGB,   il valore COLORREF ha la seguente   forma esadecimale. 0x00bbggrr

Il metodo Color.FromArgb () si aspetta 0xAARRGGBB. La vostra soluzione va bene, anche se una correzione adeguata sarebbe quella di capovolgere le componenti R e B prima di chiamare il metodo .FromArgb ():

int color = GetPixel(...);
return Color.FromArgb(color & 0xFF, color >> 8 & 0xFF, color >> 16);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top