الحصول على نتيجة مقلوبة من استخدام FromArgB r = B؟ أين يفشل هذا؟

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

  •  22-09-2019
  •  | 
  •  

سؤال

يحصل R و B على خطأ عند استخدام هذا المنطق ، لا يمكنني العثور على ما أفعله خطأ ، وكان الحل البديل في النهاية هو أنني أقلب R و B ليس جيدًا على الإطلاق وأحاول العثور على مكان تعطل المنطق.

label1.text = colorx ؛ يظهر r = 255 ، g = 0 ، b = 0 عندما يكون r = 0 ، g = 0 ، b = 255 ، أين يفشل هذا؟

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. الحل الخاص بك على ما يرام ، على الرغم من أن الإصلاح المناسب هو قلب مكونات R و B قبل الاتصال بالطريقة. من. من Method ():

int color = GetPixel(...);
return Color.FromArgb(color & 0xFF, color >> 8 & 0xFF, color >> 16);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top