Общая ошибка возникает при GDI + в Bitmap.Save() после использования SaveFileDialog
Я использую следующий блок кода с еще одним кодом внутри блока использования:
using (System.Drawing.Bitmap tempImg =
(System.Drawing.Bitmap)tempObj.GetData(System.Windows.Forms.DataFormats.Bitmap))
{
// ...
tempImg.Save("..\\..\\testdata\\tempImg.bmp", ImageFormat.Bmp);
// ...
}
Но я все еще получаю ошибку:
Общая ошибка произошла в GDI +
только после того, как я сделаю какое-то действие, которое не связано с кодом внутри блока использования. В других случаях это хорошо работает.
Также tempImg.bmp является временным файлом, поэтому я удаляю tempImg.bmp в самом блоке использования.
Так как tempImg находится внутри используемого, и оно расположено, я думаю, что проблема блокировки должна быть решена.
Может кто-нибудь, пожалуйста, дайте мне знать, в чем ошибка в этом коде?
Edit:
System.Drawing.Image
до System.Drawing.Bitmap
как тип tempImg
.
Edit:
Я обнаружил, что получаю эту ошибку только после создания SaveFileDialog, и пользователь нажимает кнопку "Сохранить".
Ответы
Ответ 1
Наконец, я смог найти, что было не так в моем коде, и хотел бы упомянуть его здесь, поскольку я думаю, что это может быть полезно кому-то....
Как я указал относительный путь в tempImg.Save, и после того, как пользователь нажимает "Сохранить" в SaveFileDialog, фактический путь для tempImg.Save становится:
Путь, заданный SaveFileDialog + относительный путь
автоматически.
Таким образом, если путь не существует, эта ошибка возникает.
Спасибо каждому за ответы.
Ответ 2
У меня также была эта проблема: это происходит потому, что битмап блокируется, и вы не можете его сохранить (если хотите, я могу найти точное объяснение), так что в любом случае проблема заключается в следующем:
Создайте новое растровое изображение размера исходного растрового изображения, которое у вас есть: скопируйте исходное растровое изображение в новое созданное растровое изображение, а затем удалите исходное растровое изображение и сохраните новый.
Bitmap bm3 = new Bitmap(bm2);
И затем сохраните.
Ответ 3
Обычно это индикатор того, что что-то другое, потенциально другое, в вашем собственном приложении, уже имеет целевой файл, который вы пытаетесь сохранить заблокированным на уровне файловой системы. Если вы посмотрите на внутреннее исключение, я считаю, что он должен упомянуть об этом. Если это не напрямую в InnerException Еще один способ подтвердить это (или узнать, что это может быть на самом деле) - включить исключения в случайном порядке в отладчике и следить за тем, какое исключение выбрасывается под "Сохранить" и затем превращается в это общее исключение.
Ответ 4
Пробовал все приведенные здесь решения, но напрасно. В конечном итоге нашли решение.
- Утилизируйте любую графику, применяемую на изображении:
g.dispose();
- Убедитесь, что существует путь сохранения:
System.IO.Directory.Exists(dir);
Ответ 5
Это приложение ASP.NET?
Общая ошибка произошла в GDI + в asp.net в основном из-за отсутствия прав доступа к целевой папке/доступу.
Также ваш код может быть упрощен:
using (Image image= dataObject.GetImage())
{
if (image != null)
{
image.Save("test.bmp");
}
}
Ответ 6
В моем случае это было приложение ASP.NET, в котором я заменил одну DLL, и мне пришлось просто перезапустить пул приложений после развертывания. Затем он работал нормально.
Ответ 7
Это образец кода из форумов Microsoft.
// new image with transparent Alpha layer
using (var bitmap = new Bitmap(330, 18, PixelFormat.Format32bppArgb))
{
using (var graphics = Graphics.FromImage(bitmap))
{
// add some anti-aliasing
graphics.SmoothingMode = SmoothingMode.AntiAlias;
using (var font = new Font("Arial", 14.0f, GraphicsUnit.Pixel))
{
using (var brush = new SolidBrush(Color.White))
{
// draw it
graphics.DrawString(user.Email, font, brush, 0, 0);
}
}
}
// setup the response
Response.Clear();
Response.ContentType = "image/png";
Response.BufferOutput = true;
// write it to the output stream
bitmap.Save(Response.OutputStream, ImageFormat.Png);
Response.Flush();
}
Ответ 8
Я пытаюсь сохранить изображение с ресурса, и это дает мне слишком ошибку GDI, когда я напрямую использую метод Bitmap.Save(путь к файлу).
Я думаю, мы можем использовать тот же код ниже для любого другого растрового изображения, клонируя его.
Private void SaveResourceImage() {
object resBmpObject = Resource.Image1.Clone();//Bitmap Image from resource file
//object resBmpObject = anyBmpImage.clone(); //for image other than resource image
Bitmap resBmpImage = (Bitmap)resBmpObject;
resBmpImage.Save(destFilePath, System.Drawing.Imaging.ImageFormat.Png);
resBmpImage.dispose();
}
Ответ 9
Общая ошибка возникает при GDI + в Bitmap.Save() обычно принимается, когда папка защищена, или имя файла недействительно.
Общей ошибкой является забыть создать имя и просто написать имя папки.
Ответ 10
Удалите объект bitMap
после сохранения изображения:
bitMap.Dispose()
oimg.Dispose()
bitMap = Nothing
oimg = Nothing
Ответ 11
В моем случае я сохранял файл растрового изображения в том же месте, что и источник,
Так что проблема.
Я сохраняю растровое изображение в новом месте и все в порядке.
Ответ 12
Я столкнулся с той же проблемой, изменив тип изображения ".bmp" на ".png" свою рабочую форму me