2013-08-03 5 views
1

Picturebox의 Mousedown 위치에서 Picture 좌표를 성공적으로 가져 왔습니다. 그러나 패닝 조작이나 줌 조작 후 중심점을 찾는 데 어려움을 겪습니다. 현재로서는 Picturebox의 Normal Sizemode에서만 다음 작업을 수행하고 있습니다.이동 및 확대/축소와 상관없이 그림 상자에서 이미지 좌표 (점)를 얻는 방법

내 주요 목적 ::

1. 중앙

2. 다음 (화소 환산) 반경을 찾는 것처럼 이는 MouseDown 위치로 원을 그리는 PictureBox에 그려진 원 (이미지가 아님)은 패닝 및 확대/축소 후에도 동일해야합니다. 확대/축소 또는 팬 후에도 원 (또는 타원)을 그릴 경우 이미지의 측면에서 반지름을 가져야합니다. 점의 픽셀 변환을 알고 있습니다. I가 Mousedown을 사용하고 이벤트를 이동 패닝 구현 및 트랙 바을 사용하여 줌을 구현 한


. 지금 다음 부분에 도움이 필요합니다. : 조건 1 : 이미지 열기 >> 특정 거리로 이동 >> 원형 도구 사용 >> 이미지 경계 안쪽에 가운데를 그려서 원을 그립니다. 그릴 때 그곳에 그려야합니다. 조건 2 : 이미지를 엽니 다. >> 원 그리기, 팬합니다. 원이 이미지가 팬되는 것과 같은 양만큼 이동되어야합니다. 은 여기 내 MouseDown, 이는 MouseUp, MouseMove 이벤트 및 페인트 방법입니다 :

당신이 어떤 함수 본문이 필요하거나 내가

에서 일하고 있어요는 단지 하나의 큰 혼란 응용 프로그램을 something.Because 경우 알려주세요 당신이 무엇이든 필요하면 말해줘. 위에서 언급 한 나의 주된 목표를 따르는 다른 디자인 접근법을 열어 라.

편집 한 후에 내가 당신을 가지고있는 경우가 마우스 이동 이벤트에 마우스를 드래그하면서 바로이, mousedown 잡은 지점으로 중심으로 타원을 그릴 것입니다

 Bitmap _bmp; 
     private bool _isMouseDown = false; 
     private Point _mouseDownLocation = Point.Empty; 
     int _xDifference, _yDifference; 
     public Form1() 
     { 
      InitializeComponent(); 
      _bmp = RenderImageOfSpecifiedSize(@"C:\Users\Public\Pictures\Sample Pictures\2 duck.bmp"); 
      _pictureBox.Image = _bmp; 
     } 

     private Bitmap RenderImageOfSpecifiedSize(string fileLocation) 
     { 
      //return new Bitmap(new Bitmap(fileLocation),new Size(300,300)); 
      return new Bitmap(fileLocation); 
     } 

     private void _pictureBox_MouseDown(object sender, MouseEventArgs e) 
     { 
      _isMouseDown = true; 
      _mouseDownLocation = new Point(e.X, e.Y); 
     } 
     private void _pictureBox_MouseMove(object sender, MouseEventArgs e) 
     { 
      if (_isMouseDown) 
      { 
       _xDifference = _mouseDownLocation.X > e.X ? _mouseDownLocation.X - e.X : e.X - _mouseDownLocation.X; 
       _yDifference = _mouseDownLocation.Y > e.Y ? _mouseDownLocation.Y - e.Y : e.Y - _mouseDownLocation.Y; 
       _pictureBox.Invalidate(); 
      } 
     } 
     private void _pictureBox_MouseUp(object sender, MouseEventArgs e) 
     { 
      _isMouseDown = false; 
     } 
     private void _pictureBox_Paint(object sender, PaintEventArgs e) 
     { 
      _txtCenter.Text= _xDifference.ToString() + " - " + _yDifference.ToString(); 
      e.Graphics.DrawEllipse(Pens.Red, _mouseDownLocation.X - _xDifference, _mouseDownLocation.Y - _yDifference, _xDifference * 2, _yDifference * 2); 
     } 

답변

1

TerryBozzio의 대답 :: 확장 또는 타원이 mousedown 위치에 의해 잡힌 지점에 중심에있을 것입니다. (그것은 mousemove 이벤트 내부) 코드에서 그림 상자에있을 것입니다 급진적으로 나는 2 개의 변수를 배치 Xdiff 및 Ydiff 작업을 완료하고 또한 (당신이 움직일 때마다 항상 업데이트됩니다.) 폼 캡션에 값을 보여줍니다. 그 값은 x와 y의 값입니다. 타원형 타원을 그릴 수 있습니다.

bool ismouseDown = false; 
    Point p; 
    int Xdiff, Ydiff; 
    Bitmap bmp; 

    public Form1() 
    { 
     InitializeComponent(); 
     bmp = (Bitmap)Image.FromFile(@"C:\..\YourImage.jpg"); 
     pictureBox1.Image = bmp; 
    } 

    private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 
     this.Text = Xdiff.ToString() + " - " + Ydiff.ToString(); 

     e.Graphics.DrawEllipse(Pens.Black, p.X - Xdiff, p.Y - Ydiff, Xdiff * 2, Ydiff * 2); 
    } 

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     ismouseDown = true; 
     p = e.Location; 
    } 

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (ismouseDown) 
     { 
      Xdiff = p.X > e.X ? p.X - e.X : e.X - p.X; 
      Ydiff = p.Y > e.Y ? p.Y - e.Y : e.Y - p.Y; 
      pictureBox1.Invalidate(); 
     } 
    } 

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
    { 
     ismouseDown = false; 
    } 
+0

@ terryBozio, 답장을 보내 주셔서 감사합니다. 귀하의 답변에 위의 편집으로 내 코드를 포함 시켰습니다. RenderImageOfSpecifiedSize (문자열 fileLocation) 함수를 참조하십시오. 본문 안의 줄을 주석 처리하지 않고 이미지 크기가 상관없이 동일한 크기 여야합니다 (크기가 그림 상자보다 크거나 작음). 저는 원의 중심 역할을 할 마우스 위치에 대해 더 염려합니다. 이미지 크기에 영향을받지 않는이 센터를 어떻게 저장할 것입니까? 내 다른 목적은 반경도 표시하는 것입니다 (이미지의 패닝에도 영향을받지 않음). –

+0

이렇게하면됩니다. _pictureBox.Image = Image.FromFile (@ "C : \ Users \ Public \ Pictures \ Sample \ 2 duck.bmp"샘플 이미지 \ 2 duck.bmp "); 나머지 코드는 잘 동작합니다. 왜냐하면 그래픽 객체가 picbox 표면에 그리기 때문에 좌표가 남아 있기 때문입니다. 같은 그림 크기 조정 후, 그냥 경우에 picbox의 sizemode를 변경하고 동일한 지점과 무서운 남아 버튼을 배치와 함께 시도. – terrybozzio