Autor Beitrag
Ritzeratze
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101



BeitragVerfasst: So 26.10.14 01:28 
Hi,

ich möchte aus einer Grafik die Farbe via GetPixel auslesen. Mit der linken Maustaste möchte ich die ermittelte Farbe als Vordergundfarbe setzen, mit der rechten Maustaste als Hintergrundfarbe.
Weiß allerdings nicht wie. Anbei mein Versuch. Könnte mir jemand ein Tipp geben ?


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
private void toolStripButtonForeBackground_MouseDown(object sender, MouseEventArgs e)
{      
      if (e.Button == MouseButtons.Left)
      {
        Color pixelColor = bild.GetPixel(MousePosition.X, MousePosition.Y);
        stift.Color = pixelColor;

      }
      else
        
        if (e.Button == MouseButtons.Right)
        {
          Color pixelColor = bild.GetPixel(MousePosition.X, MousePosition.Y);
          pinsel.Color = pixelColor;
        }
}


Gruß Ritze

Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 26.10.14 10:49 
Hallo,

was ist denn dein genaues Problem?

Mir scheint, du hast zwei Fehler drin:
- zum einen registrierst du das MouseDown-Ereignis für den ToolStripButton, anstatt für das Bild
- und MousePosition liefert die absoluten Mauskoordinaten, du solltest aber die relativen aus dem übergebenen MouseEventArgs benutzen
Ritzeratze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101



BeitragVerfasst: Mo 27.10.14 20:23 
Danke für Deine Antwort.


Was heisst denn relative Koordinaten? In dem Moment des Maus Clips musste ich doch die absoluten Koordinaten bekommen.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 27.10.14 20:46 
MousePosition sind die Koordinaten relativ zum Bildschirm. Für die Koordinaten des Bild brauchst du aber die Mouseposition relativ zum Bild. Also relativ zur linken oberen Ecke des Bildes nicht die des Bildschirms.
Die bekommst du du von den MouseEventArgs, wenn du denn den MouseDown Event des richtigen Controls (dem mit dem Bild) verwendest.
Ritzeratze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101



BeitragVerfasst: Mi 29.10.14 00:23 
Sorry muss nochmal nachhaken. Das vertshe ich leider nicht. weil im Handbuch steht, dass ich mit
(Grafik).GetPixel(Mausposition.X, Mausposition.Y) die Pixelfarbe der aktuellen Position im Bild auslesen kann

Wie muss es den richtig lauten ?


Gruß Ritze
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 29.10.14 00:47 
Zitat:
Wie muss es den richtig lauten ?


Auf den Control das das Bild anzeigt MouseDown verdrahten. Der Event hat einen MouseEventArgs Parameter mit Namen e. Dieser wiederum hat eine X und Y Property und die halten die Koordinaten relativ zum Control und damit auch relativ zum Bild (zumindest vermutlich, ich/wir haben keine Ahnung was bei dir die bild Variable ist. Vermutlich ein Bitmap aber ob die du auch irgendwo anzeigst und wie können wir nur raten.
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mi 29.10.14 09:53 
Hallo,

also wenn ich das richtig deute, hast du eine Form in der ein Bild dargestellt wird. Du musst jetzt das MouseDown Event des Containers deines Bildes afangen. Also konkret: du hast eine PictureBox pictureBox; in der dein Bild angezeigt wird (das ist dein Bildcontainer). Jetzt fängst du das MouseDown Event dieser PictureBox ab. Das MouseDown Event stellt dir in den MouseEventArgs die Koordinaten des Klickpunkts bereit. Diese musst du nun für dein Bild verwenden. Bei der PrictureBox musst du noch aufpassen, dass du das Bild beim anzeigen nicht verzerrst, sonst geht das nämlich nicht.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
public partial class Form1 : Form
  {
      private Color foregroundColor;
      private Color backgroundColor;
      private Bitmap bmp;

    public Form1()
    {
      InitializeComponent();
    }

        private void pictureBox_MouseDown(object sender, MouseEventArgs e)
        {
            Bitmap deinBild = (Bitmap) pictureBox.Image;
            
            if (e.Button == MouseButtons.Left) foregroundColor = deinBild.GetPixel(e.X, e.Y);
            else if (e.Button == MouseButtons.Right) backgroundColor = deinBild.GetPixel(e.X, e.Y);
        }
  }

Wenn du verzerrte oder skalierte Bilder hast, ist es - denke ich - am Besten, wenn du ein Screenshot machst und den auswertest. Das würde dann grob so aussehen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            Bitmap screenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Size.Width, Screen.PrimaryScreen.Bounds.Size.Height);
            Graphics g = Graphics.FromImage(screenshot);
            g.CopyFromScreen(0000, screenshot.Size);

            if (e.Button == MouseButtons.Left) foregroundColor = screenshot.GetPixel(MousePosition.X, MousePosition.Y);
            else if (e.Button == MouseButtons.Right) backgroundColor = screenshot.GetPixel(MousePosition.X, MousePosition.Y);
        }

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Ritzeratze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101



BeitragVerfasst: Mi 19.11.14 23:49 
Danke für den Hinweis. Jetzt funktioniert es .

gruß
Ritze