2017-05-17 5 views
0

私は、メイン画像上に2つのビットマップを別々にドラッグすることができるカスタムピクチャボックスコントロールを持っているので、ユーザーは2つのビットマップの場所を選択できます。2つのビットマップのオーバーラップ検出を実行する

最初のビットマップ

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; 

第二ビットマップのために

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; 

のためにこの場所では、適切に変換するフル解像度image.In順序を含むメインフォームに返されます2ポイント(2つのビットマップのうち)私は以下を行います。

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; 

2つのビットマップは、互いに近くに配置し、フル解像度の画像は、ビットマップを配置するために使用される参照画像よりも高さが低いとなっているとき2ビットマップは離れlocations.Butに配置されたときにこれは非常にうまく動作これらの2つのビットマップは重なり合う。

私は何か間違っていますか?または、いくつかの重複検出を行う必要がありますか?

助けてください。

答えて

0

フォームで動作するサンプルコードを作成しました。フォームにはボタンからイメージを取得するピクチャボックスがあります。ソリューションが機能する場合は変更できます。フォームはこちらcomponenets(ピクチャ、btnImage)

は、完全なコード

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

をチェックして、戻ってきますでいます。 – techno

関連する問題