2017-01-10 4 views
4

Ich habe ein Bild, auf das Sie 2 Punkte klicken und es erstellt eine Linie zwischen jedem Punkt. Am Ende verlangt die Abteilung nach der Möglichkeit, die Länge dieser Linien und wo diese Linien auftreten zu berechnen. Sie tun dies derzeit per Hand mit Papier/Stift/Lineal. Dies ist eines der Bilder, mit denen ich arbeite.Gibt es eine bessere Möglichkeit, Bildklickregionen zu bearbeiten?

Example Image

Diese Risse in der Mitte sind "Bereich 7" betrachtet.

Also brauchte ich einen Weg zu, neben dem Speichern meiner x & y Ort, um die Zeilen später zu messen, auch den Ort, die sie auf meiner Liste aufgetreten sind. Unten ist der einzige Weg, den ich wusste, um dies zu tun, aber es erweist sich als eher unordentlich. Da das Bild kein exaktes Quadrat oder Rechteck ist, gibt es viele überlappende Bereiche und viele Bereiche, in denen es Lücken gibt, so dass die Bereiche nicht sehr gut abgedeckt werden.

Gibt es einen besseren Weg, dies zu tun? (Zur Zeit verwende ich nur einen messagebox zu zeigen, wo ich geklickt habe, habe ich nicht so weit ging, mit den Daten etwas zu tun noch, bis ich dieses Recht zu bekommen.)

if (e.Button.Equals(MouseButtons.Left)) 
    { 
     Rectangle zone1 = new Rectangle(35, 30, 770, 30); 
     if (zone1.Contains(e.Location)) 
     { 
      MessageBox.Show("Zone1");     
     } 
     Rectangle zone2 = new Rectangle(890, 40, 330, 300); 
     if (zone2.Contains(e.Location)) 
     { 
      MessageBox.Show("Zone2"); 
     } 
     Rectangle zone3 = new Rectangle(340, 340, 850, 60); 
     if (zone3.Contains(e.Location)) 
     { 
      MessageBox.Show("Zone3"); 
     } 
     Rectangle zone4 = new Rectangle(100, 25, 75, 300); 
     if (zone4.Contains(e.Location)) 
     { 
      MessageBox.Show("Zone4"); 
     } 
     //4-1 trying to cover areas missed in zone4 
     Rectangle zone41 = new Rectangle(255, 270, 120, 240); 
     if (zone41.Contains(e.Location)) 
     { 
      MessageBox.Show("Zone4-1"); 
     } 
     Rectangle zone5 = new Rectangle(310, 100, 180, 150); 
     if (zone5.Contains(e.Location)) 
     { 
      MessageBox.Show("Zone5"); 
     } 
     //5-1 trying to cover areas missed in zone5 
     Rectangle zone51 = new Rectangle(220, 80, 60, 45); 
     if (zone51.Contains(e.Location)) 
     { 
      MessageBox.Show("Zone5-1"); 
     } 
     Rectangle zone6 = new Rectangle(635, 35, 250, 210); 
     if (zone6.Contains(e.Location)) 
     { 
      MessageBox.Show("Zone6"); 
     } 
    } 
+0

Wird das Bild aus Vektordaten generiert, auf die Sie Zugriff haben, oder wird von Ihnen im Wesentlichen erwartet, dass sie Feature-Erkennung durchführen? Wenn Letzteres, ist dies eine einmalige Sache, oder muss es automatisiert werden? Wenn es sich um eine einmalige Situation handelt, können Sie manuell ein Bild für jede Region erstellen (z. B. jede Region für das entsprechende Bild schwarz ausfüllen) und pro Pixel testen, ob der Ort, auf den der Nutzer geklickt hat, in dieser Region liegt. Die Antwort hängt sehr von Ihren Einschränkungen ab. – adv12

+0

Re: einschließlich "C#" im Titel, eigentlich dachte ich, dass das verpönt war. Aber vielleicht haben sich die "Regeln" geändert. – adv12

+2

_ "Bearbeiten, um C# in den Titel aufzunehmen, wie angefordert" _ - das ist seltsam, weil der [allgemeine Konsens ist, dass Tags nicht in Titeln enthalten sein sollten] (http://meta.stackexchange.com/questions/19190/should- questions-include-tags-in-the-titles) – stuartd

Antwort

2

Mein Vorschlag ist, dass Sie Verwenden Sie ein Hintergrundbild als Zonenkarte. Dieses Bild wird dem Benutzer überhaupt nicht angezeigt. Sie laden es einmal und behalten es im Gedächtnis, aber fahren fort, Ihr ursprüngliches Bild anzuzeigen und Linien wie es zu zeichnen. Wenn der Benutzer dann auf Ihr Bild klickt, überprüfen Sie die Farbe der Zonenkarte, um die Zone zu bestimmen.

Zum Beispiel lassen Sie uns sagen, dass ich diese beiden Bilder als meine Anzeige bin mit und und meine Zonenkarte:

Zone display Zone map

Beide Bild in der Code geladen, sondern nur die Anzeige der Karte ist gezeigt an den Benutzer:

class MyForm 
{ 
    Bitmap zoneDisplay; 
    Bitmap zoneMap; 

    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 

     zoneDisplay = (Bitmap)Image.FromFile(@"c:\temp\zonedisp.png"); // replace with actual path to file 
     zoneMap = (Bitmap)Image.FromFile(@"c:\temp\zonemap.png"); 

     // put the display image into the picturebox (or whatever control displays it) 
     pictureBox.Image = zoneDisplay; 
    } 

Dann, wenn der Benutzer das Bild klickt, nur die Farbe überprüfen Sie auf der Zonenkarte:

private void pictureBox_MouseDown(object sender, MouseEventArgs e) 
{ 
    var color = _zoneMap.GetPixel(e.X, e.Y); 
    if (color == Color.FromArgb(0, 0, 255)) 
     MessageBox.Show("Zone 1"); 
    else if (color == Color.FromArgb(255, 0, 0)) 
     MessageBox.Show("Zone 2"); 
    else if (color == Color.FromArgb(0, 255, 0)) 
     MessageBox.Show("Zone 3"); 
    // etc... 
} 

Wenn Ihre Farben geringfügig abweichen, müssen Sie möglicherweise einen weniger genauen Vergleich durchführen. Beispiel:

static int ColorDelta(Color c1, Color c2) 
{ 
    return Math.Abs(c1.R - c2.R) + Math.Abs(c1.G - c2.G) - Math.Abs(c1.B - c2.B); 
} 

private void pictureBox_MouseDown(object sender, MouseEventArgs e) 
{ 
    var color = _zoneMap.GetPixel(e.X, e.Y); 
    if (90 > ColorDelta(color, Color.FromArgb(0, 0, 255))) 
     MessageBox.Show("Zone 1"); 
    else if (90 > ColorDelta(color, Color.FromArgb(255, 0, 0))) 
     MessageBox.Show("Zone 2"); 
    else if (90 > ColorDelta(color, Color.FromArgb(0, 255, 0))) 
     MessageBox.Show("Zone 3"); 
    // etc... 
} 
+0

Klingt gut. Lass mich ein wenig daran arbeiten, wie viel Zeit ich hier im Büro habe und ich werde zurückschreiben. – Lee

+0

Oh, und falls es nicht offensichtlich war, sollten Sie ein verlustfreies Bildformat wie BMP oder PNG verwenden. Verwenden Sie JPG nicht für Ihre Zonenkarte, da dies die Farben verzerrt. – RogerN

+0

Ich benutze PNG. Ich habe 2 Kopien meines Bildes geöffnet. Ich habe die Bereiche für die Zonen manuell mit einfachen RGB-Farben in Farbe eingefärbt (rot, grün, blau usw.), habe den obigen Code benutzt, um sie zu laden und mit der Maus nach unten, und es scheint nicht zu funktionieren. Ist das Ausmalen der Bereiche meiner Image Map nicht der richtige Weg? Ich bin neu in dieser Methode, aber ich sehe nicht, wo es die 2 Bilder vielleicht vergleicht? – Lee

Verwandte Themen