2016-02-01 5 views
14

私はWinFormsを使用しています。私のフォームでは、イメージ・ドキュメントを表示するために使用するピクチャ・ボックスがあります。問題は、画像をトリミングしてから文書を印刷して画像が少し歪んだ場合です。私が画像文書をトリミングせずに定期的に印刷すると、画像文書が歪んでしまうことはありません。歪みのない画像文書の切り抜きと印刷C#

イメージドキュメントを歪ませずにトリミングして印刷するにはどうすればよいですか?

これをコードするより良い方法がありますので、イメージドキュメントが歪まずにトリミングして印刷することができますか?もしそうなら、どうすればいいの?画像文書寸法の

  • 例:X 3100 2500

  • マイ

    注:私はで動作する画像が大きいため

    • は私のPictureBoxをズームに設定されていますpictureboxには枠線がありません

      int _cropX, _cropY, _cropWidth, _cropHeight; 
      public Pen _cropPen; 
      private State _currentState; 
      
      private enum State 
      { 
          Crop 
      } 
      
      private void Open_btn_Click(object sender, EventArgs e) 
      { 
          // open file dialog 
          OpenFileDialog open = new OpenFileDialog(); 
      
          if (open.ShowDialog() == DialogResult.OK) 
          { 
           // display image in picture box 
           pictureBox1.Image = new Bitmap(open.FileName); 
          } 
      } 
      
      private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
      { 
          try 
          { 
           if (Crop_Checkbox.Checked == true) 
           { 
            Cursor = Cursors.Default; 
            if (_currentState == State.Crop) 
            { 
             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(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height); 
             //Original image 
      
             Bitmap img = new Bitmap(_cropWidth, _cropHeight); 
             // for cropinf 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); 
      
             pictureBox1.Image = img; 
             pictureBox1.Width = img.Width; 
             pictureBox1.Height = img.Height; 
            } 
      
           } 
           else 
           { 
            Cursor = Cursors.Default; 
           } 
          } 
          catch (Exception) 
          { 
      
          } 
      } 
      
      private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
      { 
          if (Crop_Checkbox.Checked == true) 
          { 
           if (_currentState == State.Crop) 
           { 
            Cursor = Cursors.Cross; 
            if (e.Button == System.Windows.Forms.MouseButtons.Left) 
            { 
             //X and Y are the coordinates of Crop 
             pictureBox1.Refresh(); 
             _cropWidth = e.X - _cropX; 
             _cropHeight = e.Y - _cropY; 
             pictureBox1.CreateGraphics().DrawRectangle(_cropPen, _cropX, _cropY, _cropWidth, _cropHeight); 
            } 
      
           } 
          } 
          else 
          { 
           Cursor = Cursors.Default; 
          } 
      
      } 
      
      private void Crop_Checkbox_CheckedChanged(object sender, EventArgs e) 
      { 
          if (Crop_Checkbox.Checked == true) 
          { 
           this.Cursor = Cursors.Cross; 
          } 
      } 
      
      private void Print_btn_Click(object sender, EventArgs e) 
      { 
          System.Drawing.Printing.PrintDocument myPrintDocument1 = new System.Drawing.Printing.PrintDocument(); 
          PrintDialog myPrinDialog1 = new PrintDialog(); 
          myPrintDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(printDocument1_PrintPage); 
          myPrinDialog1.Document = myPrintDocument1; 
      
      
          if (myPrinDialog1.ShowDialog() == DialogResult.OK) 
          { 
           myPrintDocument1.Print(); 
          } 
      } 
      
      private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) 
      { 
          e.Graphics.DrawImage(pictureBox1.Image, 10, 10); //(Standard paper size is 850 x 1100 or 2550 x 3300 pixels) 
      } 
      
      private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
      { 
          if (Crop_Checkbox.Checked == true) 
          { 
           if (_currentState == State.Crop) 
           { 
            if (e.Button == System.Windows.Forms.MouseButtons.Left) 
            { 
             Cursor = Cursors.Cross; 
             _cropX = e.X; 
             _cropY = e.Y; 
      
             _cropPen = new Pen(Color.FromArgb(153, 180, 209), 3); //2 is Thickness of line 
      
             _cropPen.DashStyle = DashStyle.DashDotDot; 
             pictureBox1.Refresh(); 
            } 
           } 
          } 
          else 
          { 
           Cursor = Cursors.Default; 
          } 
      
      } 
      

    enter image description here

    テスト:やや歪んだ

    enter image description here

    テスト:歪まない:

    enter image description here

    enter image description here

    試験: 上の写真は、試験です。

    Bitmap originalImage = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height); 
    

    および/置き換え(pictureBox1.ImageにoriginalImage)、編集:

    g.DrawImage(pictureBox1.Image, 0, 0, rect, GraphicsUnit.Pixel); 
    
    最も可能性が高いです
  • +0

    私は本当に "歪み"を見ることができません。どのような歪みが発生しますか? – Ian

    +0

    文書を定期的に印刷すると、より明確に表示されます。言葉に少し歪みがあります@lan – taji01

    +0

    私はまだ画像の歪みを見ることができません?イメージを表示していないようですね。 – Ian

    答えて

    1
    Bitmap originalImage = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height); 
    

    問題をこれは私がpictureBox1_MouseUpから以下のコードを取ったときに何が起こったかであります開始しました。これにより、pictureBox1.Imageは、pictureBox1サイズに強制的に再調整されます。ピクチャボックスに罫線とSizeModeプロパティ値があるかどうかによって異なります。再スケーリングによりイメージが再サンプリングされ、新しいビットマップ内のピクセルの色は、選択されたInterpolationModeによって指示された元のイメージ内の隣接するピクセルの値から計算されます。

    この結果、実際には画像がぼやけます。これは写真ではうまくいきますが、低解像度のモニターでは見えないようにアンチエイリアス処理するピクセルに非常に依存しているテキストです。これらのピクセルにわずかな変更が加えられても効果は失われ、もはや文字のシェイプを背景とスムーズにブレンドしなくなりました。彼らはより目に見えるようになり、結果として得られるテキストが「太っている」ように見えるという最良の方法です。

    私は、投稿されたコードでこれを行うことは何の理由もありません。ステートメントを削除し、originalImageをpictureBox1.Imageに置き換えます。

    また、この画像を印刷することは期待はずれである可能性が高いことを注意してください。これらのアンチエイリアスピクセルは、紙面上に6×6の塊になっています。あなたが長い腕を持っているときには、それだけが良いように見えます。フォントサイズがこのように小さく、アンチエイリアスの選択を制御できない限り、それについてはほとんどできません。 PrintDocumentとGraphics.DrawString()を使用すると、印刷されたテキストのみが良好に見えます。

    +0

    あなたの説明をありがとう。今すぐコードをレビューしていて、これで問題が解決されるかどうかは分かりません。 – taji01

    +0

    私はoriginalImageを取り出し、pictureBox1.Imageで置き換えます。プログラムが正しく切り取られません。 originalImageがなくなると、プログラムは画像の一部しか表示しません。 – taji01

    +0

    それは私があなたを助ける助けにはならない、トリミングのポイントは "イメージのいくつかを表示する"ことです。 _cropXxx値は、画像座標ではなく、pictureBox座標です。このコードは、SizeModeプロパティがAutoSizeと等しい場合にのみ機能します。 SizeModeプロパティに間違いがあるかもしれないということは、すでに回答で想定されていて、再スケーリングアーチファクトについて説明しています。その価値を文書化する必要があります。 –

    関連する問題