2009-08-02 6 views
1

C#で画像を切り抜きたい。ほとんどの写真編集ソフトウェアと同じように、サイズ変更やマウスでの再配置が可能な長方形のボックスを使用したいと思っています。さらに、私はthis photoに示すように、トリミングされた領域を強調表示する方法を知りたいと思います。矩形を使って画像を切り抜く

+0

ここで何をお探しですか?より大きな画像から部品を切り取る実際の方法は?リンクした写真のような切り抜き選択を表示する方法はありますか? – peSHIr

+0

私はすでに作物について考えています。私は、写真のように切り抜きの選択を表示する方法について手伝っていきたいです。私も切り抜きの選択を移動します。 – qulzam

答えて

0

選択ボックスの外側には、約30%のアルファで黒いイメージが表示されているようです。これを行うには、各ピクセルをコンテンツ領域の外側に置き、その上に30%のアルファを含む黒のピクセルを描画します。これにより、所望の調光効果が得られる。

C#で矩形を動的に捕捉する方法については、

+0

Nick Beradiさん、ありがとうございました。問題は、私が1つ1つのピクセルを1つずつ処理すると、時間がかかることです。カラーマトリックスのような速い方法がありますか? – qulzam

0

画像を明るくまたは暗くする(または色を変更する)には、thisのようにColorMatrixを使用します。

+0

私はカラーマトリックスの使用を知っていますが、私はすべての画像にカラーマトリックスを使用することしか知りません。イメージの部分ではどうすれば使えますか? – qulzam

+0

5つのセパレート矩形として描画します(.DrawImageへの5回の呼び出し)。選択範囲外のすべてをカバーする4つの矩形と選択範囲内の1つの矩形でピクチャを分割することができます。 –

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(); 
    } 
関連する問題