也说:“GDI+ 中发生一般性错误

wenluderen 2018-08-22 11:06:54
为啥叫也说:“GDI+ 中发生一般性错误。

因为这个问题在网上 炸了锅。到处都是探讨这个的。 不过看似很多,细看都是粘贴复制那几句话。

我也说下我遇到的情况和大家不一样。

在VS2012里面开发了一个VB.net窗口程序,添加了一个按钮 ,在按钮的单机事件里写了图像读取和保存代码
如下:


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'Dim gg As Graphics '定义一个图像处理器,名叫gg
'gg = Graphics.FromHwnd(Me.Handle) '是在指定画在什么地方
'gg.DrawRectangle(Pens.AliceBlue, 0, 0, 200, 200)
Try
Dim b As Bitmap '= 想要保存的图片。 创建一个bitmap类型的bmp变量来读取文件。
b = Image.FromFile("H:\2018-08-22_095415.bmp")

b.Save("H:\picture.bmp", System.Drawing.Imaging.ImageFormat.Bmp)

Catch ex As Exception
MessageBox.Show(ex.Message, Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try

End Sub


在VS运行 按下F5 运行,点击按钮 出现 GDI+ 中发生一般性错误 。就是在运行到保存image的那个代码上

。但是!
如果我在Debuge文件下找到WindowsApplication1.exe 以管理员权限运行 就没有报错。

××特别要说明的是,网上很多人说 保存的路劲下 需要已经有个同样的名字的文件在。不然报错。 我这边没有

所以我认为 此处还是权限的问题

那么GDI+ 中发生一般性错误 这个问题就转化为如何让VS开发的程序,在VS里面按住F5后 以管理员权限运行
...全文
372 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenluderen 2018-08-22
  • 打赏
  • 举报
回复
C#的窗口程序里面
如果是如下代码 ,报错

string fileName = "sample.jpg";
bmp.Save(fileName, ImageFormat.Jpeg);
bmp.Save(fileName, ImageFormat.Jpeg);

报错内容就是GDI+ 中发生一般性错误

修改代码

string fileName = "H:\\my1Bitmap.jpeg";

Bitmap bmpTemp = new Bitmap(fileName);
Bitmap bmp = new Bitmap(bmpTemp);
bmpTemp.Dispose();
//bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
bmp.Save("H:\\my3Bitmap.jpeg", System.Drawing.Imaging.ImageFormat.Jpeg);


原作者 追根到WIN32里面查找报警代码,得到解释:
The process cannot access the file because it is being used by another process.
×××
大致意思就是被占用了。 这应该算是微软公司的Bug了
不过微软不会修改这个东西。
原作者 就新建了一个BItmap ,然后在保存。这个思路是可以的

不过我不知道为啥 我VB.net里面 不需要这个

正文上文所说,读取一个硬盘上的图片,然后直接就可以保存了
。但是读取流(映射内存里面的玩意),就不好使了。哪怕是新建一个Bitmap 都不行
智造引领未来 2018-08-22
  • 打赏
  • 举报
回复
转:
vb.net 判断文件夹存在并创建文件夹(亲自实践)

https://blog.csdn.net/bigheadsheep/article/details/12014883

有时候我们需要判断某个指定的文件夹是否存在,如果不存在则提示用户是否创建

程序如下:

判断指定文件夹是否存在(保存在common文件中,方便其他程序调取)

' "文件夹存在CHECK"
Public Function isDirExist(ByVal strPath As String) As Boolean
Dim strDirTemp As String()
strDirTemp = strPath.Split("\")
strPath = String.Empty
For i As Integer = 0 To strDirTemp.Length - 1
' 判断数组内容.目的是防止输入的strPath内容如:c:\abc\123\ 最后一位也是"\"
If strDirTemp(i) <> "" Then
strPath += strDirTemp(i) & "\"
End If
Next

' 判断文件夹是否存在
isDirExist = System.IO.Directory.Exists(strPath)
End Function


画面程序调用:

' 检查设定的输出报表路径是否存在
If common.isDirExist(Me.txtOutputPath.Text.Trim()) = False Then
' 设定的输出报表路径不存在的场合,确认是否要创建该路径
If MsgBox("设定的输出报表路径: " & Me.txtOutputPath.Text.Trim() & " 不存在,是否创建该路径?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
' 创建设定的文件夹
My.Computer.FileSystem.CreateDirectory(Me.txtOutputPath.Text.Trim())
Return True
Else
Me.txtOutputPath.Focus()
Return False
End If
End If
智造引领未来 2018-08-22
  • 打赏
  • 举报
回复
在VB.net 里面 判断 是否存在的

#Region "'判断目录是否存在的函数,传入String值,返回Boolean值"
Private Function Boo_DirExist(ByVal Str_Path As String) As Boolean
Boo_DirExist = System.IO.Directory.Exists(Str_Path)
End Function
#End Region

#Region "'判断文件是否存在的函数, 传入String值,返回Boolean值"
Private Function Boo_FileExist(ByVal Str_File As String) As Boolean
Boo_FileExist = System.IO.File.Exists(Str_File)
End Function
#End Region
智造引领未来 2018-08-22
  • 打赏
  • 举报
回复



Dim Gsz_image As Image = Me.PictureBox_Left.Image
Me.PictureBox_Right.Image = Gsz_image
' Gsz_image = Image.FromFile("H:\my1Bitmap.jpeg")
Gsz_image.Save("H:\myBitmap.jpeg", System.Drawing.Imaging.ImageFormat.Jpeg)

Gsz_image 这个 里面的图像是正常的。

VS的管理员权限也是打开的
但是还是报错

原因是?


wenluderen 2018-08-22
  • 打赏
  • 举报
回复
至此 问题解决了一半。 还没有完全解决。从映射内存读取的图像 在保存的时候 还是报错,内容依然是GDI+ 中发生一般性错误

代码如下:

Private Sub Button_UPLOAD_Click(sender As Object, e As EventArgs) Handles Button_UPLOAD.Click
Dim L_Err As String = ""
Dim opd As OpenFileDialog = New OpenFileDialog()
opd.CheckFileExists = True
opd.CheckPathExists = True
opd.RestoreDirectory = True
opd.DefaultExt = "*.*"
opd.Filter = "图像文件 (*.bmp;*.gif;*.jpg;*.jpeg;*.png)|*.bmp;*.gif;*.jpg;*.jpeg;*.png"
opd.ShowDialog()
If opd.FileName <> "" Then
Me.PictureBox.Image = Image.FromFile(opd.FileName)
Me.PictureBox.ImageLocation = opd.FileName
End If
Try
Dim Gsz_image As Image = Me.PictureBox.Image
'直接从硬盘上读取的文件,是可以保存的。但是从PictureBOX读取的图片 保存的时候报错
' Gsz_image.Image.Save("H:\myBitmap.jpeg", System.Drawing.Imaging.ImageFormat.Jpeg)
Gsz_image.Save("H:\myBitmap.jpeg")
Catch ex As Exception
MessageBox.Show(ex.Message, Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try


End Sub


Dim Gsz_image As Image = Me.PictureBox.Image
'直接从硬盘上读取的文件,是可以保存的。但是从PictureBOX读取的图片 保存的时候报错
' Gsz_image.Image.Save("H:\myBitmap.jpeg", System.Drawing.Imaging.ImageFormat.Jpeg)
Gsz_image.Save("H:\myBitmap.jpeg")


这个原因是啥?
wenluderen 2018-08-22
  • 打赏
  • 举报
回复
经过验证,只要在开启VS的时候 是以管理员权限运行的时候 ,那么按了F5运行的那个程序 也是以管理员权限运行的。
为了方便 可以通过修改VS的那个exe文件的属性,添加 以 管理权权限运行 。这样每次打开都是管理员 权限了。

16,553

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧