Farbpipette selber erstellen?



  • Hallo zusammen,

    ich suche schon eine ganze Weile aber habe leider noch nichts passendes finden können.

    Ich möchte ein Programm haben, wo ich per Drag&Drop ein Bild reinziehe. Das klappt auch problemlos.
    Jetzt habe ich dort die ImageBox wo mein Bild mir angezeigt wird. Ich möchte nun eine Farbpipette haben.

    Ich möchte die Maus über das Bild bewegen können und genau an der Mausposition den RGB Wert des Pixels auslesen. Entweder durch Maus Hover oder durch Klicken.
    Hat jemand eine Idee wie ich etwas derartiges verwirklichen könnte?
    Zusätzlich müsste es auch möglich sein, den Radius zu verändern.

    Mit GIMP kann ich z. B. die Pipette nutzen und mit einem eingestellten Radius den RGB Wert auslesen. Genau das möchte ich auch haben. Nur eben als einzige Funktion im Programm; Denn alle anderen Funktionen von GIMP brauche ich nicht. Und nur für die RGB Werte möchte ich nicht immer GIMP o.ä. installieren.

    Würde mich freuen, wenn ihr ein paar Denkanstöße hättet.

    Viele Grüße,
    Felix



  • Grad aus uralt code raus gefingert, da hatte ich scheinbar mal Langeweile ^^

    internal static class WinApi
    {
        internal static SolidColorBrush BrushFromPosition(Point point)
        {
            int windowDC = GetWindowDC(0);
            int pixelColor = GetPixel(windowDC, (int) point.X, (int) point.Y);
            ReleaseDC(0, windowDC);
            return new SolidColorBrush(PixelColorToColor(pixelColor));
        }
    
        internal static SolidColorBrush BrushUnderMouse()
        {
            return new SolidColorBrush(ColorUnderMouse());
        }
    
        internal static Color ColorUnderMouse()
        {
            Point mousePosition = GetMousePosition();
            int windowDC = GetWindowDC(0);
            int pixelColor = GetPixel(windowDC, (int) mousePosition.X, (int) mousePosition.Y);
            ReleaseDC(0, windowDC);
            return PixelColorToColor(pixelColor);
        }
    
        [DllImport("user32.dll")]
        private static extern int GetCursorPos(ref POINT lpPoint);
    
        internal static Point GetMousePosition()
        {
            POINT lpPoint = new POINT();
            GetCursorPos(ref lpPoint);
            return new Point { X = lpPoint.x, Y = lpPoint.y };
        }
    
        [DllImport("gdi32.dll")]
        private static extern int GetPixel(int hdc, int nXPos, int nYPos);
    
        [DllImport("user32.dll")]
        private static extern int GetWindowDC(int hWnd);
    
        private static Color PixelColorToColor(int pixelColor)
        {
            byte[] buffer = new byte[4];
            buffer[1] = (byte) (pixelColor & 0xffL);
            buffer[2] = (byte) ((pixelColor >> 8) & 0xffL);
            buffer[3] = (byte) ((pixelColor >> 0x10) & 0xffL);
            return Color.FromRgb(buffer[1], buffer[2], buffer[3]);
        }
    
        [DllImport("user32.dll")]
        private static extern int ReleaseDC(int hWnd, int hDC);
    
        [StructLayout(LayoutKind.Sequential)]
        internal struct POINT
        {
            public uint x;
            public uint y;
        }
    }
    


  • GetPixel(...) Methode... ist ganz einfach



  • Vielen Dank!

    Ich habe es jetzt mit der GetPixel() Methode gelöst.
    Jetzt muss ich nur noch einbauen, dass ich mir die Farben in einem Quadrat oder Kreis um den Pixel herum auslese (Radius evtl. frei wählbar) und den Durchschnitt daraus errechne. 1 Pixel reicht nämlich leider nicht aus.
    Quadrat/Kreis soll dann auch um die Maus herum gezeichnet werden - beim Klick auf das Bild.


Log in to reply