В GDI exception произошла общая ошибка при попытке сохранить изображение в MemoryStream

#c# #winforms #bitmap #gdi #memorystream

#c# #winforms #растровое изображение #gdi #memorystream

Вопрос:

Я использую C # windows form.

Мой код :

 private void Openbutton_Click(object sender, EventArgs e)
{
        OpenFileDialog openFileDialog = new OpenFileDialog();
        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            SurveyDiagrampictureBox.Image = Bitmap.FromFile(openFileDialog.FileName);

            MemoryStream memoryStream = new MemoryStream();
            SurveyDiagrampictureBox.Image.Save(memoryStream, ImageFormat.Jpeg);
            SurveyDiagram = memoryStream.GetBuffer();
        }
}
  

Это происходит не всегда, исключение возникает при переходе к этой строке : SurveyDiagrampictureBox.Image.Save(memoryStream, ImageFormat.Jpeg);

Сообщение об исключении :

Необработанное исключение типа ‘System.Runtime.Службы взаимодействия.В системе произошло исключение ExternalException.Drawing.dll

Дополнительная информация: в GDI произошла общая ошибка.

Комментарии:

1. Снимок в темноте: попробуйте инициализировать MemoryStream со значением емкости, немного превышающим ожидаемый размер файла jpeg. (Ширина * высота, вероятно, является приличной оценкой).

2. @JatSing это такая распространенная ошибка, 40 000 страниц в Google. Если вы хотите, чтобы мы помогли provide a repro - including a image . В прошлом я получал эту ошибку на очень большом веб-сайте, и когда мы отследили ее, изображение было фактически повреждено, но есть множество других причин.

Ответ №1:

Растровые изображения GDI не являются потокобезопасными, поэтому часто эти ошибки поступают из изображения, доступ к которому осуществляется в нескольких потоках. Похоже, что это может произойти здесь (например, PictureBox, отображающий изображение, и изображение сохраняется в потоке обработчика нажатия кнопки).

Как насчет назначения растрового изображения в PictureBox после завершения операций сохранения?

 private void Openbutton_Click(object sender, EventArgs e)
{
        OpenFileDialog openFileDialog = new OpenFileDialog();
        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            Image img = Bitmap.FromFile(openFileDialog.FileName);

            MemoryStream memoryStream = new MemoryStream();
            img.Save(memoryStream, ImageFormat.Jpeg);
            SurveyDiagram = memoryStream.GetBuffer();

            SurveyDiagrampictureBox.Image = img;
        }
}