Ich verwende WinForms. In meinem Formular habe ich eine Bildbox, mit der ich Bilddokumente anzeigen kann. Das Problem ist, wenn ich das Bild beschneide und dann das Dokument ausdruck, wird das Bild leicht verzerrt. Wenn ich das Bilddokument nicht zuschneide und es regelmäßig drucke, wird das Bilddokument nicht verzerrt.Zuschneiden und Drucken von Bilddokumenten ohne Verzerrung in C#
Wie kann ich die Bilddokumente zuschneiden und drucken, ohne dass sie verzerrt sind?
Oder gibt es eine bessere Möglichkeit, dies zu kodieren, damit es beschneiden und drucken kann, ohne dass das Bilddokument verzerrt wird? Wenn ja, wie kann ich es tun?
Hinweise:
Mein picturebox ist auf Zoom, weil die Bilder i mit groß arbeiten:
Beispiel für Bilddokument Abmessungen: 2500 x 3100
Meine picturebox hat keine Grenze
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: leicht verzerrt:
Test: Verfälschungen schützt:
Test: Das obige Bild ist ein Test. Dies ist, was passiert, wenn ich den Code unten aus pictureBox1_MouseUp heraus nahm:
Bitmap originalImage = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height);
und bearbeitet/ersetzt (originalImage zu pictureBox1.Image):
g.DrawImage(pictureBox1.Image, 0, 0, rect, GraphicsUnit.Pixel);
Ich kann nicht wirklich die "Verzerrung" sehen. Welche Art von Verzerrung begegnet Ihnen? – Ian
Wenn Sie das Dokument regelmäßig drucken, sehen Sie es klarer. Die Wörter haben eine kleine Verzerrung @lan – taji01
Ich kann immer noch nicht die Verzerrung im Bild sehen? Du scheinst das Bild nicht zu zeigen, oder? – Ian