Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
9 / 2 / 0
Регистрация: 18.09.2013
Сообщений: 98
1
.NET 4.x

Ошибка перезаписи файла: В GDI+ возникла ошибка общего вида

16.12.2014, 18:15. Показов 3373. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Написал небольшой граф редактор в visual studio 2013. Когда сохраняю файл с таким же именем, вылазит окошко о подтверждении перезаписи. Нажимаю "Да" и происходит вылет.
Вот кусочек кода:
VB.NET
1
2
3
4
5
    Private Sub Button2_Click(sender As System.Object, e As EventArgs) Handles Button2.Click
        SaveFileDialog1.Filter = "Image bmp|*.bmp"
        If SaveFileDialog1.ShowDialog = DialogResult.Cancel Then Exit Sub
        bmp.Save(SaveFileDialog1.FileName)
    End Sub
Пробовал изгаляться: сохранить файл с именем отличным от исходного, исходный удалить, и новый перенаименовать в исходный, но тогда вылазит ошибка, что файл уже используется. Погуглив нашел только методы закрытия текстовых файлов, то file_of_text.close(). Для битмапа не знаю как. Пробовал ставить всякие SaveFileDialog1.OpenFile, checkfileexists. Не помогло, прошу помощи

Добавлено через 1 минуту
Вот такая ошибка
Необработанное исключение типа "System.Runtime.InteropServices.ExternalException" в System.Drawing.dll

Дополнительные сведения: В GDI+ возникла ошибка общего вида.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2014, 18:15
Ответы с готовыми решениями:

Ошибка "В GDI+ возникла ошибка общего вида."
Всем привет! Опять баги, опять ошибки, опять боль и страдания нуба. Подскажите, в чем проблема? ...

В GDI+ произошла ошибка общего вида при сохранении изображений из picturebox'a в файл
Опять не получается. Что посоветуете? Как все таки сделать сохранение изображений из picturebox'a в...

System.Runtime.InteropServices.ExternalException: "В GDI+ возникла ошибка общего вида." Ошибка сохранения файла
У меня есть задача сделать что-то наподобие Paint. И проблема с сохранением файла. 1) Выбираем...

В GDI+ возникла ошибка общего вида
Здравствуйте! Вот почему так работает: public static Image AddAddiativeNoise(Image image,...

11
649 / 601 / 92
Регистрация: 19.03.2012
Сообщений: 1,128
16.12.2014, 18:48 2
Цитата Сообщение от sub-r-outine Посмотреть сообщение
Необработанное исключение...
А если обработать? "Засуньте" эту часть кода в Try...Catch и посмотрим, что выдаст.
1
9 / 2 / 0
Регистрация: 18.09.2013
Сообщений: 98
16.12.2014, 19:10  [ТС] 3
Nachrichter,
В GDI+ возникла ошибка общего вида
0
Почетный модератор
21413 / 9147 / 1083
Регистрация: 11.04.2010
Сообщений: 11,014
16.12.2014, 19:49 4
Вы не освобождаете объекты, работающие с файлом.
Это может быть объект Bitmap, может быть Graphics
Освобождайте эти ресурсы либо через Dispose, либо пользуйтесь директивой Using
1
9 / 2 / 0
Регистрация: 18.09.2013
Сообщений: 98
16.12.2014, 19:57  [ТС] 5
Памирыч, Dispose прямо использовать не получится, ибо мы "диспоузнем битмап", а затем попытаемся его сохранить. И зачем использовать Using?
0
Почетный модератор
21413 / 9147 / 1083
Регистрация: 11.04.2010
Сообщений: 11,014
16.12.2014, 20:04 6
sub-r-outine, освобождайте после сохранения.
Раз у Вас такая ошибка, значит в этот файл уже производилась запись, и объекты все еще привязаны к этому файлу.
Ведь речь о перезаписи, не так ли?
1
9 / 2 / 0
Регистрация: 18.09.2013
Сообщений: 98
16.12.2014, 21:21  [ТС] 7
Ведь речь о перезаписи, не так ли?
- да
есть 3 объекта: битмап - bmp as bitmap, g,grap as graphics. Объект "g" рисует на битмапе, объект grap рисует на пикчербоксе.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
[SPOILER]Public Class Form1
    Dim Pen1 As New Pen(Color.Black, 3)
    Dim bmp As Bitmap
    Dim g, grap As Graphics
    Dim x As Long, y As Long
    Dim IsOpened, drawing
 
    Private Sub Button1_Click(sender As System.Object, e As EventArgs) Handles Button1.Click
        OpenFileDialog1.Filter = "Image bmp|*.bmp"
        If OpenFileDialog1.ShowDialog = DialogResult.Cancel Then Exit Sub
        PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName)
        Me.Text = (OpenFileDialog1.SafeFileName & " - Paint")
        Load_P()
        'Рисуем заданое изображение
        g.DrawImage(New Bitmap(OpenFileDialog1.FileName), 0, 0)
        grap.DrawImage(New Bitmap(OpenFileDialog1.FileName), 0, 0)
        PictureBox1.Image = bmp
    End Sub
 
    Private Sub Button2_Click(sender As System.Object, e As EventArgs) Handles Button2.Click
        SaveFileDialog1.Filter = "Image bmp|*.bmp"
        If SaveFileDialog1.ShowDialog = DialogResult.Cancel Then Exit Sub
        ' bmp.Dispose()
        bmp.Save(SaveFileDialog1.FileName)
    End Sub
 
    Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
        x = e.X
        y = e.Y
        drawing = True
    End Sub
 
    Private Sub PictureBox1_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseUp
        drawing = False
    End Sub
    Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
        If IsOpened = False And e.Button = Windows.Forms.MouseButtons.Left And CheckBox1.Checked Then Form2.Visible = True
        If e.Button = Windows.Forms.MouseButtons.Left And IsOpened And CheckBox1.Checked Then
            g.DrawLine(Pen1, e.X, e.Y, x, y)
            grap.DrawLine(Pen1, e.X, e.Y, x, y)
            PictureBox1.Image = bmp
            x = e.X
            y = e.Y
        End If
    End Sub
 
    Private Sub TrackBar1_Scroll(sender As System.Object, e As EventArgs) Handles TrackBar1.Scroll
        Pen1.Width = TrackBar1.Value
    End Sub
    Private Sub Button3_Click(sender As System.Object, e As EventArgs) Handles Button3.Click
        If ColorDialog1.ShowDialog = DialogResult.Cancel Then Exit Sub
        Pen1.Color = ColorDialog1.Color
    End Sub
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    End Sub
 
    Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
    End Sub
 
    Public Sub Load_P()
        bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        g = Graphics.FromImage(bmp)
        grap = PictureBox1.CreateGraphics
        Pen1.StartCap = Drawing2D.LineCap.Round
        Pen1.EndCap = Drawing2D.LineCap.Round
        IsOpened = True
        Button2.Visible = True
    End Sub
 
    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        PictureBox1.Image = Image.FromFile("D:\1\empty.bmp")
        Load_P()
        Me.Text = ("No name - Paint")
        g.DrawImage(New Bitmap("D:\1\empty.bmp"), 0, 0)
        grap.DrawImage(New Bitmap("D:\1\empty.bmp"), 0, 0)
        PictureBox1.Image = bmp
    End Sub
 
    Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
    End Sub
End Class
[/SPOILER]
Добавлено через 7 минут
Честно говоря код не мой. Я вот попробовал убрать grap, и программа все так же работает, не понимаю зачем он нужен. Ну я нашел способ обратки перезаписи: if io.file.exists(savefiledialog1.filename)=true then exit sub

Добавлено через 5 минут
О, убрав объект grap прогрмамма прекрасно работает и также происходит перезапись фалов без ошибок.
Тогда к чему это?
VB.NET
1
2
grap.DrawImage(New Bitmap(OpenFileDialog1.FileName), 0, 0)
 grap = PictureBox1.CreateGraphics
Добавлено через 29 минут
а, нет, не перезаписывает...
0
Почетный модератор
21413 / 9147 / 1083
Регистрация: 11.04.2010
Сообщений: 11,014
17.12.2014, 13:47 8
Создал такой же проект, не понимаю, что не работает?
Загрузил картинку, включил чекбокс, порисовал, сохранил на стол.

Порисовал еще, снова сохранил (Button2), изменения внеслись, ошибок нет.

Где у Вас возникает исключение? Каком методе и строке и при каких действиях?
1
9 / 2 / 0
Регистрация: 18.09.2013
Сообщений: 98
17.12.2014, 16:20  [ТС] 9
Памирыч,
вот тут bmp.Save(SaveFileDialog1.FileName)
0
Почетный модератор
21413 / 9147 / 1083
Регистрация: 11.04.2010
Сообщений: 11,014
17.12.2014, 16:38 10
sub-r-outine, строка 24?
Странно, но у меня ошибок нет
1
9 / 2 / 0
Регистрация: 18.09.2013
Сообщений: 98
17.12.2014, 18:02  [ТС] 11
Памирыч, действительно странно...
Вот нашел на англоязычном форуме фикс этой проблемы. Суть такова что эта прога открывает файл, затем рисует на нем надпись и сохраняет в тот же файл и без ошибок (лично проверил). Сейчас буду применять к своему коду
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Dim oBitmap As Bitmap
oBitmap = New Bitmap("c:\\example.jpg")
Dim oGraphic As Graphics
' Here create a new bitmap object of the same height and width of the image.
Dim bmpNew As Bitmap = New Bitmap(oBitmap.Width, oBitmap.Height)
oGraphic = Graphics.FromImage(bmpNew)
oGraphic.DrawImage(oBitmap, New Rectangle(0, 0, _
bmpNew.Width, bmpNew.Height), 0, 0, oBitmap.Width, _
oBitmap.Height, GraphicsUnit.Pixel)
' Release the lock on the image file. Of course,
' image from the image file is existing in Graphics object
oBitmap.Dispose()
oBitmap = bmpNew
 
Dim oBrush As New SolidBrush(Color.Black)
Dim ofont As New Font("Arial", 8 )
oGraphic.DrawString("Some text to write", ofont, oBrush, 10, 10)
oGraphic.Dispose()
ofont.Dispose()
oBrush.Dispose()
oBitmap.Save("c:\\example.jpg", ImageFormat.Jpeg)
oBitmap.Dispose()
0
834 / 642 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
18.12.2014, 13:00 12
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

sub-r-outine, оборачивай Bitmap в Using. Но в таком случае придётся его перерисовать, чтобы потом можно было сохранить. Вообще, не особо понимаю, почему bitmap, полученный при помощи Bitmap.FromFile держится за этот файл, но, тем не менее, это так.
1
18.12.2014, 13:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.12.2014, 13:00
Помогаю со студенческими работами здесь

В gdi+ возникла ошибка общего вида
При попытке сохранить файл (был написан на другом компьютере) выскакивает ошибка "В gdi+ возникла...

Gdi+ возникла ошибка общего вида
"gdi+ возникла ошибка общего вида" На одной машине под win 7 возникает на другой нет: bmpK=gcnew...

В GDI+ возникла ошибка общего вида
Здравствуйте! Помогите, пожалуйста. Почему возникает такая ошибка? private byte...

В GDI+ возникла ошибка общего вида Image
ПРИНИМАЮ System.Threading.Thread.Sleep(100); byte igeb = new byte; igeb =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru