2017-05-17 3 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 비트 맵은 먼 locations.But에 배치 될 때이 비트 맵은 서로 전체 해상도 이미지는 비트 맵을 배치에 사용되는 참조 이미지보다 높이가 낮은하게 가까이 배치 할 때이 꽤 잘 작동 이 2 비트 맵은 겹칩니다.

내가 잘못하고있는 것이 있습니까? 또는 일부 중복 감지가 필요합니까?

제발 ..

답변

0

형식으로 작동하는 샘플 코드를 작성했습니다. 이 폼에는 버튼에서 이미지를 가져 오는 picturebox가 있습니다. 솔루션이 작동하면 변경할 수 있습니다. 폼은

여기

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

확인하고 다시 얻을 것이다 전체 코드입니다 componenets (PictureBox를, btnImage)가 있습니다. – techno