C# сохранение изображения из 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 ответа
Вы должны правильно отлавливать исключения, а не с помощью MessageBox, который ничего не говорит о том, какое именно исключение выдается!
как минимум, ваш блок catch должен выглядеть так:
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
и я говорю как минимум, потому что на самом деле вы должны где-то регистрировать исключение, используя каркас журналирования, такой как NLog или Log4Net, трассировку стека дампов и другие детали. Вы даже не можете указать точный тип Exception, если вы показываете сообщение со статической строкой, а не детали фактического исключения.
Вы должны ловить только определенные исключения, которые вы собираетесь обрабатывать или восстанавливать, и регистрировать детали. Никогда не лови Exception
так как вы потенциально могли бы замаскировать большие проблемы с вашим сервером, если они возникнут.
Неожиданные исключения должны всплывать, чтобы можно было быстро определить причину, когда они возникают.
Смотрите здесь, чтобы ознакомиться с рекомендациями по обработке исключений.
Вы едите исключение и теряете все сочные детали. Попробуйте изменить свой 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 среди прочего на фактическое ведение журнала, но, по крайней мере, напишите класс для записи подробностей исключений в средство просмотра событий.