C#从PictureBox保存图像

时间:2011-09-12 11:17:32

标签: c# image gdi picturebox

我有这样的代码:

private void Load_Button_Click(object sender, EventArgs e)
    {
        OpenFileDialog dialog = new OpenFileDialog();            
        if (dialog.ShowDialog()==DialogResult.OK){
            MessageBox.Show(dialog.FileName,"My Application", MessageBoxButtons.OK,MessageBoxIcon.Asterisk);
            string s; 
            s=".bmp";
            if (dialog.FileName.Substring(dialog.FileName.LastIndexOf('.')).Equals(s))
            {
                picBox_1.Load(dialog.FileName);
                BitmapFile = new Bitmap(dialog.FileName.ToString());
            }
            else {
                MessageBox.Show("Not a BMP file!");
            }
        }

    }

所以,加载图片。并且有一个错误:

private void Save_Button_Click(object sender, EventArgs e)
    {
        SaveFileDialog dialog = new SaveFileDialog();
        try
        {
            if (picBox_1.Image != null)
            {
                if (dialog.ShowDialog() == DialogResult.OK)
                {
                    MessageBox.Show(dialog.FileName, "My Application", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    string s;
                    s = ".bmp";
                    if (dialog.FileName.Substring(dialog.FileName.LastIndexOf('.')).Equals(s))
                    {

                        picBox_1.Image.Save(dialog.FileName.ToString());
                        //BitmapFile.Dispose();
                    }
                    else
                    {
                        MessageBox.Show("Not a BMP file!");
                    }
                }
            }
            else
            {
                MessageBox.Show("My PicBox is empty!");
            }
        }
        catch (Exception) { MessageBox.Show("Cannot save file, error!"); }

    }

这是一般的GDI错误。我想,我不能写入文件(可能没有足够的权利)。我怎样才能改善这个错误?

3 个答案:

答案 0 :(得分:1)

你应该正确地捕获异常,而不是使用MessageBox,它不会告诉你所引发的确切异常!

至少你的catch块应该是这样的:

catch (Exception exc)
{
  MessageBox.Show(exc.Message);
}

我说至少是因为你实际上应该在某个地方使用NLog或Log4Net等日志框架和转储堆栈跟踪和其他细节来记录异常。如果您显示带有静态字符串的消息而不是实际异常的详细信息,您甚至无法告诉精确类型的异常。

答案 1 :(得分:1)

您应该只捕获要处理或恢复的特定异常,并记录详细信息。永远不要抓住Exception,因为如果它们发生,您可能会掩盖服务器的更大问题。

意外的异常应该冒出来,以便在发生原因时能够快速识别原因。

请参阅此处查看Best Practices for Handling Exceptions

答案 2 :(得分:0)

你正在吃异常并失去所有多汁的细节。尝试将catch块更改为这样的内容,看看发生了什么:

catch (Exception ex)
{
    MessageBox.Show(this, ex.ToString(), "Error Saving Image", MessageBoxIcons.Error);
}

另外,考虑实现一些日志记录(到事件查看器和/或文本文件。这将允许你有一个简单的消息框,但所有有用的细节放在事件后获取的某些地方很有用。

catch (Exception ex)
{
    MessageBox.Show(this, ex.Message, "Error Saving Image", MessageBoxIcon.Error);

    // _logger is a private field on this class in this case.
    _logger.Log(ex, string.Format("Saving image to {0}", dialog.Filename))
}

您可以查看Log4net以及实际日志记录,但至少要写一个类write exception detail to the event viewer