#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;
}
}