English 中文(简体)
Geting a inverted result from using FromArgb R = B? where does this fail?
原标题:
  • 时间:2009-11-25 17:03:11
  •  标签:
  • c#
  • pixel
  • argb

the R and B gets error when using this logic, i cant seem to find what im doing wrong, my workaround in the end were i flip the r and b is not good at all and im trying to find where the logic breakes.

the label1.Text = colorX; shows R=255, G=0, B=0 when it shold be R=0, G=0, B=255, where does this fail?

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);
    }
 }
}
最佳回答

I think you re going about this in an odd way for one; Color has R, G, and B properties you can use instead of string matching:

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

Second, to address your question, GetPixel is probably getting BGR formatted pixels instead of RGB. BGR is commonly used in bitmaps and the HDC of the window you re talking to is most likely returning in this format.

Edit: from the MSDN docs:

When specifying an explicit RGB color, the COLORREF value has the following hexadecimal form. 0x00bbggrr

The Color.FromArgb() method expects 0xAARRGGBB. Your workaround is just fine, although a proper fix would be to flip the R and B components before you call the .FromArgb() method:

int color = GetPixel(...);
return Color.FromArgb(color & 0xFF, color >> 8 & 0xFF, color >> 16);
问题回答

暂无回答




相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签