2017-05-17 6 views
0

Ich habe ein benutzerdefiniertes Picturebox-Steuerelement, das es ermöglicht, 2 Bitmaps separat auf dem Hauptbild zu ziehen, so dass der Benutzer die Position der 2 Bitmaps auswählen kann.Überlappungserkennung von 2 Bitmaps durchführen

für die erste Bitmap

Point src = e.Location; 
PointF ratio = new PointF((float)src.X/ClientSize.Width, (float)src.Y/ClientSize.Height); 
LaunchOrigin.textratio = ratio; 
Point origin = new Point((int)(backupbit1.Width * ratio.X), (int)(backupbit1.Height * ratio.Y)); 
LaunchOrigin.textorigin = origin; 
point.X = src.X - origin.X; 
point.Y = src.Y - origin.Y; 

für zweiten Bitmap

Point src = e.Location; 
PointF ratio = new PointF((float)src.X/Width, (float)src.Y/Height); 
LaunchOrigin.logoratio = ratio; 
Point origin = new Point((int)(backupbit2.Width * ratio.X), (int)(backupbit2.Height * ratio.Y)); 
LaunchOrigin.logoorigin = origin; 
point2.X = src.X - origin.X; 
point2.Y = src.Y - origin.Y; 

Dies wird Standort die Hauptform zurückgeführt wird, die die volle Auflösung image.In enthält, um das richtig zu übersetzen 2 Punkte (von den 2 Bitmaps) mache ich folgendes.

Point origin = new Point((int)(bitmap.Width * textratio.X), (int)(bitmap.Height * textratio.Y)); 
Point pos2 = new Point((int)(textratio.X * img.Width), (int)(textratio.Y * img.Height)); 
cpoint.X = pos2.X - (int)(origin.X); 
cpoint.Y = pos2.Y - (int)(origin.Y); 

Point origin = new Point((int)(worktag.Width * logoratio.X), (int)(worktag.Height * logoratio.Y)); 
Point logopositionpoint = new Point((int)(logoratio.X * img.Width), (int)(logoratio.Y * img.Height)); 
imgpoint.X = logopositionpoint.X - origin.X; 
imgpoint.Y = logopositionpoint.Y - origin.Y; 

Dies funktioniert sehr gut, wenn die 2 Bitmaps an entfernten locations.But platziert werden, wenn die 2-Bitmaps näher zueinander und zu dem Bild mit voller Auflösung wird in Höhe als das Referenzbild für die Platzierung der Bitmaps verwendet geringeren platziert Diese 2 Bitmaps überlappen sich.

Ich mache ich etwas falsch? Oder muss ich eine Überlappungserkennung durchführen?

Bitte Beratung ..

Antwort

0

I crated einen Beispielcode, der auf Form arbeitet. Das Formular hat eine Picturebox, die das Bild von der Schaltfläche abruft. Sie können es ändern, wenn die Lösung funktioniert. Das Formular hat die componenets (PictureBox, btnImage)

Dies ist der komplette Code

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; 

namespace WindowsFormsApplication2 
{ 
    public partial class Form1 : Form 
    { 
     Image img1; 
     Image img2; 
     public Form1() 
     { 
      InitializeComponent(); 

      Image img = Image.FromFile(@"C:\pics\1.jpg"); 
      this.btnImage.Image = img; 
      this.pcitureBox.AllowDrop = true;     
     } 

     private void btnImage_MouseDown(object sender, MouseEventArgs e) 
     { 
      Button btnPic = (Button)sender; 
      btnPic.DoDragDrop(btnPic.Image, DragDropEffects.Copy); 
     } 

     private void picBox_DragEnter(object sender, DragEventArgs e) 
     { 
      if (e.Data.GetDataPresent(DataFormats.Bitmap)) 
      { 
       e.Effect = DragDropEffects.Copy; 
      } 
      else 
      { 
       e.Effect = DragDropEffects.None; 
      } 
     } 

     int img1X = 0; 
     int img1Y = 0; 
     private void picBox_DragDrop(object sender, DragEventArgs e) 
     { 
      var point = this.PointToClient(new Point(e.X, e.Y)); 
      int X = point.X - pcitureBox.Left; 
      int Y = point.Y - pcitureBox.Top; 



       PictureBox picbox = (PictureBox)sender; 
       Graphics g = picbox.CreateGraphics(); 
       if (img1 == null) 
       { 
        img1 = (Image)e.Data.GetData(DataFormats.Bitmap); 
        img1X=X; 
        img1Y = Y; 
        g.DrawImage(img1, new Point(img1X, img1Y)); 

        return; 
       } 
       else 
       { 
        #region add img2 
        img2 = (Image)e.Data.GetData(DataFormats.Bitmap); 

        //img1 has standart 0,0 point u can change 
        Rectangle r1 = new Rectangle(img1X, img1Y,  img1.Width, img1.Height); 
        Rectangle r2 = new Rectangle(X, Y, img2.Width, img2.Height); 
        Rectangle overlapRect = Rectangle.Intersect(r1, r2); 

        int img2X = X; 
        int img2Y = Y; 
        if (overlapRect.Width > 0 || overlapRect.Height > 0) 
        { 
         bool betweenX = overlapRect.X >= r1.X &&   overlapRect.X <= (r1.X + r1.Height); 
         bool betweenY = overlapRect.Y >= r1.Y &&  overlapRect.Y <= (r1.Y + r1.Width); 

         if (betweenX) 
         { 
          img2X = GetNewX(r1, r2); 
         } 
         else if (betweenY) 
         { 
          img2Y = GetNewY(r1, r2); 
         } 
         else 
         { 
          if (overlapRect.Width <= overlapRect.Height) 
          { 
           img2X = GetNewX(r1, r2); 
          } 
          else 
          { 
           img2Y = GetNewY(r1, r2); 
          } 
         } 
        } 
        g.DrawImage(img1, new Point(img2X, img2Y)); 
        #endregion 
       } 

     } 

     private int GetNewX(Rectangle r1, Rectangle r2) 
     { 
      if (r2.X < r1.X) 
      { 
       return r1.X - r2.Width; 
      } 
      else 
      { 
       return r1.X + r1.Width; 
      } 
     } 
     private int GetNewY(Rectangle r1, Rectangle r2) 
     { 
      if (r2.Y < r1.Y) 
      { 
       return r1.Y - r2.Height; 
      } 
      else 
      { 
       return r1.Y + r1.Height; 
      } 
     } 

    } 
} 
+0

überprüfen Will und zurück. – techno