Frage

die R und B erhält Fehler, wenn diese Logik verwendet wird, kann ich nicht scheinen zu finden, was falsch im tut, meine Abhilfe am Ende war ich die R-Flip und b ist überhaupt nicht gut und im Versuch, wo die Logik breakes zu finden .

die label1.Text = ColorX; zeigt R = 255, G = 0, B = 0, wenn shold es R = 0, G = 0, sein B = 255, wobei sich diese nicht?

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);
    }
 }
}
War es hilfreich?

Lösung

Ich glaube, Sie über diesen für einen in einem ungeraden Weg gehen; Farbe hat R, G und B-Eigenschaften Sie können anstelle von String-Matching verwenden:

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

Zweitens, Ihre Frage zu beantworten, ist GetPixel wahrscheinlich BGR immer formatiert Pixel statt RGB. BGR ist in Bitmaps und die HDC des Fensters Sie sprechen wird höchstwahrscheinlich die Rückkehr in diesem Format verwendet.

Edit: von der MSDN docs:

  

Wenn ein explizites RGB farbspezifizierenden,   der COLORREF Wert hat die folgende   hexadezimal. 0x00bbggrr

Die Color.FromArgb () -Methode erwartet 0xAARRGGBB. Ihre Abhilfe ist ganz gut, obwohl eine passende Lösung wäre es, die R und B-Komponenten zu kippen, bevor Sie die .FromArgb () -Methode aufrufen:

int color = GetPixel(...);
return Color.FromArgb(color & 0xFF, color >> 8 & 0xFF, color >> 16);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top