2009-08-02 133 views
1

我想在c#中裁剪图像。正如在大多数照片编辑软件中,我想使用可以通过鼠标调整大小和重新定位的矩形框。另外,我想知道如何突出裁剪区域,如this photo所示。使用矩形裁剪图片

+0

您在这里找什么?从较大的图像裁剪一部分的实际方法?或者您可以通过一种方式显示您的剪裁选择,就像您链接的图片一样? – peSHIr 2009-08-02 20:31:02

+0

我已经对裁剪有一些想法。我想帮助您展示剪裁选择的方式。我也移动裁剪选择。 – qulzam 2009-08-03 01:25:13

回答

0

选择框的外部似乎有一个黑色的图像放置在它的约30%的alpha。为此,您只需将内容区域外的每个像素都绘制成一个黑色像素,并在其上面绘制一个30%的alpha值。这会产生所需的暗淡效果。

至于如何获得一个矩形在C#中动态分页。

+0

感谢Nick Beradi寻求帮助。问题是,如果我一个接一个像素地工作,那就花很多时间。有没有像颜色矩阵的快速方式? – qulzam 2009-08-03 01:27:48

0

为了画出更亮或更暗的图片(或以任何方式更改颜色),请使用ColorMatrix,如this

+0

我知道使用颜色矩阵,但我知道只在所​​有图像上使用颜色矩阵。我们怎样才能在图像的一部分使用它? – qulzam 2009-08-03 16:21:43

+0

将其绘制为五个分离矩形(对.DrawImage的五个调用)。您可以将图片分为四个矩形,其中包含所有选区外的所有矩形和一个选区本身的矩形。 – 2009-08-04 08:52:50

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(); 
    }