I'm using WinForms. In my form I have a picturebox I use to display image documents. The problem is when I crop the image and then print the document out the image becomes slightly distorted. If I don't crop the image document and print it regularly the image document does not become distorted.
How do I crop and print the image documents without them being distorted?
Or is there a better way to code this so it can crop and print without the image document being distorted? If so, how can i do it?
Notes:
My picturebox is set to Zoom because the images i work with is big:
Example of image document Dimensions: 2500 x 3100
My picturebox does not have a border
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; } }
Test: Slightly Distorted:
Test: Not Distorted:
Test: The picture above is a test. This is what happened when i took the below code out from pictureBox1_MouseUp:
Bitmap originalImage = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height);
And edited/replaced (originalImage to pictureBox1.Image):
g.DrawImage(pictureBox1.Image, 0, 0, rect, GraphicsUnit.Pixel);
InterpolationMode
,PixelOffsetMode
andCompositingQuality
from the code? @Serrato – Condillac