0

I'm a student working on a GUI using C# Winforms, where the user is able to load an image, paint on it and then save the edited image to his system.

Bitmap b = new Bitmap(imgList);
            image.DrawImage(b, new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height));
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.PixelOffsetMode = PixelOffsetMode.HighQuality;
            g.DrawImage(btm, Point.Empty);

My issue is when I save the edited image from the picturebox it's quality is reduced and it has the heightXwidth of that of the picturebox. I've provided my Form.cs below for reference. Is there any way I can make the edited image to maintain the image quality of the original image?

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SIP_UI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            imagelst = new ImageList();
        }

        //Declared Variables
        private Graphics g;

        private Graphics image;
        private Bitmap btm;
        private SolidBrush c;
        private bool drawing = false;
        private ImageList imagelst;
        private string[] imglst;
        private int imgCnt = 1;

        private bool saveNxtWasClicked = false;

        private bool savePrevWasClicked = false;

        private void Form1_Load(object sender, EventArgs e)
        {
            g = pictureBox1.CreateGraphics();
            btm = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            image = Graphics.FromImage(btm);
            image.Clear(Color.White);

            //Status color on default load
            pnlStatus.BackColor = Color.DarkGray;

            chkbxImageInfo.Checked = false;
            if (chkbxImageInfo.Checked == false)
            {
                txtTestRep.Enabled = false;
                txtBoard.Enabled = false;
                cmbxPosition.Enabled = false;
            }

            btnNext.Enabled = true;
            btnPrev.Enabled = false;

            txtImgNum.Text = "0";
            lblTotl.Text = "#";

            using (StreamReader streamReaderOpen = new StreamReader("OpenLocation.txt"))
            {
                string strOpen = streamReaderOpen.ReadLine();
                //Check path validity
                if (System.IO.Directory.Exists(strOpen))
                {
                    txtOpnPath.Text = strOpen;
                }
                else
                {
                    txtOpnPath.Text = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
                }
            }
            using (StreamReader streamReaderSave = new StreamReader("SaveLocation.txt"))
            {
                string strSave = streamReaderSave.ReadLine();
                //Check path validity
                if (System.IO.Directory.Exists(strSave))
                {
                    txtSavPath.Text = strSave;
                }
                else
                {
                    txtSavPath.Text = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                }
            }
            using (StreamReader streamReaderCsv = new StreamReader("CsvLocation.txt"))
            {
                string strCsv = streamReaderCsv.ReadLine();
                //Check path validity
                if (System.IO.Directory.Exists(strCsv))
                {
                    txtCsvPath.Text = strCsv;
                }
                else
                {
                    txtCsvPath.Text = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
                }
            }

            //Open images from previous folder
            if (txtOpnPath.Text.Length > 0)
            {
                int i = 0;
                int numImgs = Directory.GetFiles(txtOpnPath.Text, "*.PNG").Length;
                imglst = new string[numImgs];
                lblTotl.Text = Convert.ToString(numImgs);
                txtImgNum.Text = Convert.ToString(1);
                //foreach (var file in Directory.GetFiles(txtOpnPath.Text).Where(f => extensions.Contains(Path.GetExtension(f).ToUpper())))
                foreach (var file in Directory.GetFiles(txtOpnPath.Text, "*.PNG"))
                {
                    imglst[i++] = file;
                }
                if (imglst.Length > 0)
                {
                    drawImage(imglst[0]);


                    //Added new
                    bool exist = Directory.EnumerateFiles(txtSavPath.Text, Path.GetFileNameWithoutExtension(imglst[0]) + "_MSKD*").Any();
                    if (exist)
                    {
                        pnlStatus.BackColor = Color.Red;
                    }
                    else
                    {
                        pnlStatus.BackColor = Color.Green;
                    }
                }
                else
                {
                    MessageBox.Show("SELECT ANOTHER LOCATION", "NO SUPPORTED IMAGES FOUND", MessageBoxButtons.OK);
                    txtImgNum.Text = "0";
                }
            }
        }

        //Function to draw image into picturebox
        private void drawImage(string imgList)
        {
            Bitmap b = new Bitmap(imgList);
            image.DrawImage(b, new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height));
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.PixelOffsetMode = PixelOffsetMode.HighQuality;
            g.DrawImage(btm, Point.Empty);
        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            drawing = false;
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            drawing = true;
        }

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (drawing)
            {
                c = new SolidBrush(Color.Gray);
                image.FillEllipse(c, e.X - (trackBar1.Value / 2), e.Y - (trackBar1.Value / 2), (trackBar1.Value * 15), (trackBar1.Value * 15));

                g.DrawImage(btm, Point.Empty);
            }
        }

        private void btnOpen_Click(object sender, EventArgs e)
        {
            btnNext.Enabled = true;
            lblTotl.Text = "#";
            var fd = new System.Windows.Forms.FolderBrowserDialog();
            if (fd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                int i = 0;
                txtOpnPath.Text = fd.SelectedPath;
                int numImgs = Directory.GetFiles(txtOpnPath.Text, "*.PNG").Length;
                imglst = new string[numImgs];
                lblTotl.Text = Convert.ToString(numImgs);
                foreach (var file in Directory.GetFiles(txtOpnPath.Text, "*.PNG"))
                {
                    imglst[i++] = file;
                }
                if (imglst.Length > 0)
                {
                    drawImage(imglst[0]);
                    txtImgNum.Text = "1";

                    //Added new
                    bool exist = Directory.EnumerateFiles(txtSavPath.Text, Path.GetFileNameWithoutExtension(imglst[0]) + "_MSKD*").Any();
                    if (exist)
                    {
                        pnlStatus.BackColor = Color.Red;
                    }
                    else
                    {
                        pnlStatus.BackColor = Color.Green;
                    }
                }
                else
                {
                    MessageBox.Show("SELECT ANOTHER LOCATION", "NO SUPPORTED IMAGES FOUND", MessageBoxButtons.OK);
                    pictureBox1.Image = null;
                    txtImgNum.Text = "0";
                }

                using (StreamWriter streamWriter = new StreamWriter("OpenLocation.txt"))
                {
                    streamWriter.WriteLine(txtOpnPath.Text);
                }
            }
        }

        private void btnSaveFdr_Click(object sender, EventArgs e)
        {
            var savFoldr = new System.Windows.Forms.FolderBrowserDialog();
            if (savFoldr.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                txtSavPath.Text = savFoldr.SelectedPath;

                using (StreamWriter streamWriter = new StreamWriter("SaveLocation.txt"))
                {
                    streamWriter.WriteLine(txtSavPath.Text);
                }
            }

        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            saveNxtWasClicked = true;
            savePrevWasClicked = true;

            int count = 1;
            imgCnt = Convert.ToInt32(txtImgNum.Text);
            string imgPath = imglst[imgCnt - 1];
            string fileName = Path.GetFileNameWithoutExtension(imgPath) + "_MSKD";
            string fileExtnsn = Path.GetExtension(imgPath);
            string filePath = txtSavPath.Text + "\\" + fileName + fileExtnsn;
            while (File.Exists(filePath))
            {
                string tempFileName = string.Format("{0}({1})", fileName, count++);
                filePath = Path.Combine(txtSavPath.Text, tempFileName + fileExtnsn);
            }

            btm.Save(filePath, System.Drawing.Imaging.ImageFormat.Jpeg);

            //Writing to CSV
            string csvPath = txtCsvPath.Text + "\\CSVSpec.csv";
            if (chkbxImageInfo.Checked == true)
            {
                if (File.Exists(csvPath))
                {
                    // Initialise stream object with file
                    using (var wr = new StreamWriter(csvPath, true, Encoding.UTF8))
                    {
                        // Collection of image details
                        var row = new List<string>();
                        row.Add(Path.GetFileNameWithoutExtension(imgPath));
                        row.Add(txtTestRep.Text);
                        row.Add(txtBoard.Text);
                        row.Add(cmbxPosition.Text);

                        var sb = new StringBuilder();

                        foreach (string value in row)
                        {
                            // Add a comma before each string

                            if (sb.Length > 0)
                            {
                                sb.Append(",");
                            }
                            sb.Append(value);
                        }
                        wr.WriteLine(sb.ToString());
                    }
                }
                else
                {
                    MessageBox.Show("Please add CSVSpec.csv file in specified location to save Image Information.", "MISSING: TEMPLATE FILE", MessageBoxButtons.OK);
                }
            }
            else
            {
            }

            DialogResult result = MessageBox.Show("IMAGE SAVED", "SAVE DIALOGUE", MessageBoxButtons.OK);
            if (result == DialogResult.OK)
            {
                if (imgCnt != imglst.Length)
                {
                    drawImage(imglst[imgCnt]);
                    imgCnt++;

                    txtImgNum.Text = Convert.ToString(imgCnt);
                    txtTestRep.Text = string.Empty;
                    txtBoard.Text = string.Empty;
                    cmbxPosition.SelectedIndex = 0;

                    saveNxtWasClicked = false;
                }
                else
                {
                    btnNext.Enabled = false;
                }
            }
        }

        private void btnPrev_Click(object sender, EventArgs e)
        {
            int a = Convert.ToInt32(txtImgNum.Text);
            btnNext.Enabled = true;

            if (a > 1)
            {
                a = a - 2;
                drawImage(imglst[a]);
                txtImgNum.Text = Convert.ToString(a + 1);

                txtTestRep.Text = string.Empty;
                txtBoard.Text = string.Empty;
                cmbxPosition.SelectedIndex = 0;

                bool exist = Directory.EnumerateFiles(txtSavPath.Text, Path.GetFileNameWithoutExtension(imglst[a]) + "_MSKD*").Any();
                if (exist)
                {
                    pnlStatus.BackColor = Color.Red;
                }
                else
                {
                    pnlStatus.BackColor = Color.Green;
                }
            }
            else
            {
                btnPrev.Enabled = false;
            }
        }

        private void btnNext_Click(object sender, EventArgs e)
        {
            int a = Convert.ToInt32(txtImgNum.Text);

            btnPrev.Enabled = true;

            if (imglst != null && a < imglst.Length)
            {
                drawImage(imglst[a++]);
                txtImgNum.Text = Convert.ToString(a);

                txtTestRep.Text = string.Empty;
                txtBoard.Text = string.Empty;
                cmbxPosition.SelectedIndex = 0;

                bool exist = Directory.EnumerateFiles(txtSavPath.Text, Path.GetFileNameWithoutExtension(imglst[a - 1]) + "_MSKD*").Any();
                if (exist)
                {
                    pnlStatus.BackColor = Color.Red;
                }
                else
                {
                    pnlStatus.BackColor = Color.Green;
                }
            }

            else
            {
                btnNext.Enabled = false;
            }
        }

        private void txtImgNum_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)13)
            {
                int imgNum = Convert.ToInt32(txtImgNum.Text) - 1;
                drawImage(imglst[imgNum]);
            }
        }

        private void chkbxImageInfo_CheckedChanged(object sender, EventArgs e)
        {
            if (chkbxImageInfo.Checked)
            {
                txtTestRep.Enabled = true;
                txtBoard.Enabled = true;
                cmbxPosition.Enabled = true;
            }
            else
            {
                txtTestRep.Enabled = false;
                txtBoard.Enabled = false;
                cmbxPosition.Enabled = false;
            }
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            int imgNum = Convert.ToInt32(txtImgNum.Text) - 1;
            drawImage(imglst[imgNum]);
        }

        private void btnCsv_Click(object sender, EventArgs e)
        {
            var csvFoldr = new System.Windows.Forms.FolderBrowserDialog();
            if (csvFoldr.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                txtCsvPath.Text = csvFoldr.SelectedPath;

                using (StreamWriter streamWriter = new StreamWriter("CsvLocation.txt"))
                {
                    streamWriter.WriteLine(txtCsvPath.Text);
                }
            }
        }
    }
}
Daniel B
  • 3,109
  • 2
  • 33
  • 42
SwamJay
  • 27
  • 3
  • does the "picturebox" alter the height/width of the image? – Jeffrey Easley Oct 24 '17 at 02:36
  • Hi, like I mentioned the output image has the height /width of the picturebox, even though I've set the size of the picturebox to Autosize and put it inside a flowLayoutPanel with Autoscroll 'true'. I'm not able to figure out what I'm doing wrong. Any pointer would be very helpful. Thank you very much. – SwamJay Oct 24 '17 at 02:56
  • I think you are having the same issue as https://stackoverflow.com/questions/1484759/quality-of-a-saved-jpg-in-c-sharp Try altering your save method and adding in encoder paramaters – Jeffrey Easley Oct 24 '17 at 04:20
  • 1
    Possible duplicate of [Quality of a saved JPG in C#](https://stackoverflow.com/questions/1484759/quality-of-a-saved-jpg-in-c-sharp) – Daniel B Oct 24 '17 at 17:10
  • Thank you Jeff and Daniel, I really appreciate you taking the time to provide me some guidance. I'll take a look at the suggested post and implement the encoder parameters. If that works I'll definitely close this question as a duplicate. Thank you once again. – SwamJay Oct 25 '17 at 01:38

0 Answers0