none
Speziellen Farbverlauf berechnen RRS feed

  • Frage

  • Guten Tag, ich habe die Aufgabe bekommen eine Art Farbkreis auf eine Form zu malen. Der äußerste Ring soll in etwa so aussehen:
    http://upload.wikimedia.org/wikipedia/de/thumb/1/11/Komplement%C3%A4r.png/220px-Komplement%C3%A4r.png
    So soll es sich dann bis zur Mitte hin ziehen.

    Ich kenne die Grundlagen, wie man auf Forms zeichnet, also OnPaint, Invalidate, Graphics, ...
    Mein Problem ist die Berechnung, wo kommt welche Pixelfarbe hin? Ich brauche da mal ein paar Tipps. Ich versuchte in 2 verschachtelten for-Schleifen das zu erzeugen, aber dann fehlt immer noch die Berechnung.

    An sich soll es kein Kreis werden, sondern ein Quadrat, welches bis zu den Kanten gefüllt ist, das sollte aber nicht viel anders funktionieren.

    Da ich nach Stundenlangem intensivem Suchen nichts im Internet gefunden habe bitte ich nun um eure Hilfe. Ich bedanke mich schonmal für jeden Tipp.

    Dienstag, 1. Januar 2013 23:09

Antworten

  • Hi,
    hier mal eine Demo. Die gewünschte Farbverteilung musst Du aber erst einmal vorgeben:

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
          int zeilen = 255;
          int spalten = 255;
          Bitmap bmp = new Bitmap(spalten, zeilen);
          Rectangle lockRegion = new Rectangle(0, 0, spalten, zeilen);
          BitmapData data = bmp.LockBits(lockRegion, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
          unsafe
          {
            byte* p;
    
            for (int spalte = 0; spalte < spalten; spalte++)
            {
              for (int zeile = 0; zeile < zeilen; zeile++)
              {
                p = (byte*)data.Scan0 + (zeile * data.Stride) + (spalte * 3);
                p[0] =(byte)spalte; //B pixel
                p[1] = (byte)zeile; //G pixel
                p[2] = (byte)( zeilen -  zeile); //R pixel         
              }
            }
          }
          bmp.UnlockBits(data);
          e.Graphics.DrawImage(bmp, 0, 0);
        }
    
    

    --
    Viele Gruesse
    Peter

    Mittwoch, 2. Januar 2013 05:48

Alle Antworten

  • Hi,
    hier mal eine Demo. Die gewünschte Farbverteilung musst Du aber erst einmal vorgeben:

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
          int zeilen = 255;
          int spalten = 255;
          Bitmap bmp = new Bitmap(spalten, zeilen);
          Rectangle lockRegion = new Rectangle(0, 0, spalten, zeilen);
          BitmapData data = bmp.LockBits(lockRegion, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
          unsafe
          {
            byte* p;
    
            for (int spalte = 0; spalte < spalten; spalte++)
            {
              for (int zeile = 0; zeile < zeilen; zeile++)
              {
                p = (byte*)data.Scan0 + (zeile * data.Stride) + (spalte * 3);
                p[0] =(byte)spalte; //B pixel
                p[1] = (byte)zeile; //G pixel
                p[2] = (byte)( zeilen -  zeile); //R pixel         
              }
            }
          }
          bmp.UnlockBits(data);
          e.Graphics.DrawImage(bmp, 0, 0);
        }
    
    

    --
    Viele Gruesse
    Peter

    Mittwoch, 2. Januar 2013 05:48
  • Hallo XD3000,

    Der Beitrag von Peter beantwortet m.E. deine Frage. Bitte markiere ihn als Antwort, wenn es das ist, wonach Du gesucht hast.

    Die häufigste Ursache für das Nichtauffinden von Inhalten im Internet ist die Verwendung von falschen Suchbegriffen. Die relevanten Suchbegriffe für deine Fragestellung sind: "color space" (Farbraum) bzw. "color picker" (Farbauswahl-Dialog) oder "color wheel" (Farbkreis). Dazu gibt es im Netz sehr viele Beispiele. Du mußt nur wissen, welchen Farbraum Du wie verwenden möchtest.

    Für den Einstieg empfehle ich den Artikel Building a Color Picker User Control with GDI+ von Ken Getz. Dort wird u.a. anhand der Klasse ColorWheel erklärt, wie man ein Control zur kombinierten Anzeige des HSB/RGB-Farbraums entwickelt. Ein C#/VB.NET-Code-Download ist ebenfalls vorhanden.

    Gruß
    Marcel


    Mittwoch, 2. Januar 2013 11:32
    Moderator
  • Hallo XD3000,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Wenn nein, neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.

    Danke und viele Grüße,
    Ionut

    Freitag, 11. Januar 2013 16:12
    Moderator