【问题标题】:C# saving an image from PictureBoxC# 从 PictureBox 保存图像
【发布时间】:2011-11-15 06:23:45
【问题描述】:

我有这样的代码:

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 错误。我想,我无法写入文件(可能没有足够的权限)。我该如何改善这个错误?

【问题讨论】:

  • 你得到的错误是什么?而且您不必假设任何事情,只需使用catch (Exception saveEx) { MessageBox.Show(saveEx.Message); }。那个异常不是带有一个可以提供更多细节的内部异常吗?
  • 你不是要覆盖源文件,是吗?
  • 请通过改进此错误帮助消除混乱,您的意思是更正此错误,如让它消失吗? 我不知道任何人如何将改进此错误解释为如何查看此错误如何改进此错误的处理,但你在那里,有些是。
  • 什么和哪里确切是错误?
  • 我改进了,在加载函数中使用这个:picBox_1.Image=Image.FromFile(dialog.FileName);

标签: c# image gdi picturebox


【解决方案1】:

你吃掉了例外,失去了所有有趣的细节。尝试将您的 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 编写一个类。

【讨论】:

  • '这是一般的 GDI 错误。' 用户似乎知道异常,只是一般 GDI+ 错误,嗯,非常通用,这里没有问题。
【解决方案2】:

您应该正确捕获异常,而不是使用 MessageBox 来告诉您所引发的确切异常!

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

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

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

【讨论】:

  • '这是一般的 GDI 错误。' 用户似乎知道异常,只是一般 GDI+ 错误,嗯,非常通用,这里没有问题。
  • 什么?这是什么意思?问题中是如何解释的?
  • 这就是重点,这个错误可能意味着很多事情(无效的访问权限、锁定的文件、内存不足等)。'改善这个错误'这句话可以换成'纠正这个错误',我想。
  • @Mr.失望而不是投票否决每个人,考虑到问题没有达到细节和问题中提到的一般 GDI 错误可能是任何东西,并不是说它是异常类型。我的回答和其他回答都在建议正确处理异常的方法,比在当前代码中更好,对于一个写得不好的问题的假设,不值得投反对票。
  • 不,如果您有使用 GDI+ 的经验并且有人告诉您 一般 GDI 错误,那么这将转化为 一般 GDI+ 错误(即error, in its entirety) ,这是你得到的所有信息。他们应该投反对票,因为他们没有正确回答问题,而是切题地讨论如何查看错误,而不是修复它。
【解决方案3】:

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

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

查看这里Best Practices for Handling Exceptions

【讨论】:

  • 是的,请在其他答案上查看我的 cmets - 这不是当前的主题,也无法解决任何问题。
  • 好吧,我们不得不对此持不同意见,您显然希望您的应用程序中出现很多 GDI 错误。
  • 真的这应该是一个评论,因为它没有直接解决问题。
  • 问题是什么?如何改进错误处理? how can I improve this error?
  • @TheCodeKing 您究竟如何改进错误?还有 error != error handling:这两个是不同的问题。 改善错误本身的唯一方法是消除错误。如果您改进错误警报,您还没有改进错误,是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
相关资源
最近更新 更多