2009-08-02 3 views
1

C#으로 이미지를 자르고 싶습니다. 대부분의 사진 편집 소프트웨어에서와 마찬가지로 마우스로 크기를 조정하고 위치를 변경할 수있는 사각형 상자를 사용하고 싶습니다. 또한 자른 부분을 강조 표시하는 방법을 알고 싶습니다 (this photo 참조).직사각형을 사용하여 그림 자르기

+0

여기에서 무엇을 찾고 계십니까? 큰 이미지에서 파트를 자르는 실제 방법은 무엇입니까? 또는 연결된 그림과 같이 자르기 선택을 보여주는 방법은 무엇입니까? – peSHIr

+0

나는 작물에 대해 이미 알고있다. 나는 그림 에서처럼 자르기 선택을 보여주는 방법을 돕고 싶다. 그리고 자르기 선택을 이동합니다. – qulzam

답변

0

선택 상자의 바깥쪽에 검은 색 이미지가 약 30 %의 알파로 놓여있는 것처럼 보입니다. 이렇게하려면 각 픽셀을 내용 영역 외부로 가져 와서 위에 30 %의 알파가있는 검은 픽셀을 그립니다. 이것은 원하는 희미한 효과를 줄 것입니다.

C#에서 사각형을 동적으로 점유 할 수있는 방법은.

+0

도움을 주신 Nick Beradi에게 감사드립니다. 문제는 내가 한 픽셀 씩 작업 할 때 시간이 매우 걸린다는 것입니다. 컬러 매트릭스와 같은 빠른 방법이 있습니까? – qulzam

0

그림을 밝게 또는 어둡게 (또는 어떤 방식 으로든 색상을 변경하려면) this과 같은 ColorMatrix을 사용하십시오.

+0

컬러 매트릭스의 사용을 알고 있지만 모든 이미지에 컬러 매트릭스 만 사용한다는 것을 알고 있습니다. 이미지의 일부로 어떻게 사용할 수 있습니까? – qulzam

+0

다섯 개의 사각형 직사각형으로 그립니다 (.DrawImage에 5 번 호출). 그림을 네 개의 사각형으로 나눌 수 있습니다. 네 개의 직사각형은 선택 항목 외부에있는 모든 항목과 선택 항목 인 하나의 사각형을 포함합니다. –

0

이미지 링크는 더 이상 제공되지 않습니다.

그래서 패널에서 자르기 할 이미지가있는 그림 상자가 있다고 가정합니다.

먼저 당신이 마우스 동작하면 자르기하고자하는 사각형 영역 그릴 수 있도록하기위한 이벤트 핸들러를 작성해야합니다 : 이제

private void picBox_MouseDown(object sender, MouseEventArgs e) 
    { 
     Cursor = Cursors.Default; 
     if (Makeselection) 
     { 
      try 
      { 
       if (e.Button == System.Windows.Forms.MouseButtons.Left) 
       { 
        Cursor = Cursors.Cross; 
        cropX = e.X; 
        cropY = e.Y; 

        cropPen = new Pen(Color.Crimson, 1); 
        cropPen.DashStyle = DashStyle.Solid; 
       } 
       picBox.Refresh(); 
      } 
      catch (Exception ex) 
      { 
      } 
     } 
    } 

    private void picBox_MouseUp(object sender, MouseEventArgs e) 
    { 
     if (Makeselection) 
     { 
      Cursor = Cursors.Default; 
     } 
    } 

    private void picBox_MouseMove(object sender, MouseEventArgs e) 
    { 
     Cursor = Cursors.Default; 
     if (Makeselection) 
     { 
      picBox.Cursor = Cursors.Cross; 
      try 
      { 
       if (picBox.Image == null) 
        return; 


       if (e.Button == System.Windows.Forms.MouseButtons.Left) 
       { 
        picBox.Refresh(); 
        cropWidth = e.X - cropX; 
        cropHeight = e.Y - cropY; 
        picBox.CreateGraphics().DrawRectangle(cropPen, cropX, cropY, cropWidth, cropHeight); 
       } 
      } 
      catch (Exception ex) 
      { 
      } 
     } 
    } 

    private void picBox_MouseLeave(object sender, EventArgs e) 
    { 
     tabControl.Focus(); 
    } 

    private void picBox_MouseEnter(object sender, EventArgs e) 
    { 
     picBox.Focus(); 
    } 

을, 이미지 자르기 버튼 클릭 기능을 제공 :

private void btnCrop_Click_1(object sender, EventArgs e) 
    { 
     Cursor = Cursors.Default; 

     try 
     { 
      if (cropWidth < 1) 
      { 
       return; 
      } 
      Rectangle rect = new Rectangle(cropX, cropY, cropWidth, cropHeight); 
      //First we define a rectangle with the help of already calculated points 
      Bitmap OriginalImage = new Bitmap(picBoxScreenshot.Image, picBoxScreenshot.Width, picBoxScreenshot.Height); 
      //Original image 
      Bitmap _img = new Bitmap(cropWidth, cropHeight); 
      // for cropinfo image 
      Graphics g = Graphics.FromImage(_img); 
      // create graphics 
      g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
      g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; 
      g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
      //set image attributes 
      g.DrawImage(OriginalImage, 0, 0, rect, GraphicsUnit.Pixel); 

      picBox.Image = _img; 
      picBox.Width = _img.Width; 
      picBox.Height = _img.Height; 
      PictureBoxLocation(); 
      cropWidth = 0; 
     } 
     catch (Exception ex){} 
    } 

private void PictureBoxLocation() 
    { 
     int _x = 0; 
     int _y = 0; 
     if (panel1.Width > picBox.Width) 
     { 
      _x = (panel1.Width - picBox.Width)/2; 
     } 
     if (panel1.Height > picBox.Height) 
     { 
      _y = (panel1.Height - picBox.Height)/2; 
     } 
     picBox.Location = new Point(_x, _y); 
     picBox.Refresh(); 
    } 
관련 문제