正在保存图像:GDI+中发生一般性错误,(vb.net)

bnl4lu3b  于 2023-11-20  发布在  .NET
关注(0)|答案(5)|浏览(143)

我需要保存一个图像后,打开它从一个OFD.这是我的代码atm:

Dim ofd As New OpenFileDialog
ofd.Multiselect = True
ofd.ShowDialog()

For Each File In ofd.FileNames
   Image.FromFile(File).Save("C:\Users\Jonathan\Desktop\e\tmp.png", Imaging.ImageFormat.png)
Next

字符串
Image.FromFile(File).Save("C:\Users\Jonathan\Desktop\e\tmp.png", Imaging.ImageFormat.png)行上,它出现了错误。
(note:该应用程序将建立在使这只是我的第一个代码,它将需要保存不复制)

anhgbhbe

anhgbhbe1#

我会检查两件事
1.您要保存到的目录存在
1.您对此目录具有写入权限

hjqgdpho

hjqgdpho2#

打开或保存Image会对文件加锁。覆盖此文件需要首先对持有锁的Image对象调用Dispose()。
我不太理解你的代码,但你必须这样做:

For Each File In ofd.FileNames
        Using img As Image = Image.FromFile(File)
            img.Save("C:\Users\Jonathan\Desktop\e\tmp.png", Imaging.ImageFormat.Png)
        End Using
    Next

字符串
Using语句确保释放img对象并释放文件锁。

xyhw6mcr

xyhw6mcr3#

图像将锁定。
例如,我使用这个缓冲区将图像保存到内存流中。

byte[] ImageData = new Byte[0];
if (BackGroundImage != null)
    {
        Bitmap BufferImage = new Bitmap(BackGroundImage);
        MemoryStream ImageStream = new MemoryStream();
        BufferImage.Save(ImageStream, ImageFormat.Jpeg);
        BufferImage.Dispose();
        ImageData = ImageStream.ToArray();
        ImageStream.Dispose();

        //write the length of the image data...if zero, the deserialier won't load any image
        DataStream.Write(ImageData.Length);
        DataStream.Write(ImageData, 0, ImageData.Length);
    }
    else
    {
        DataStream.Write(ImageData.Length);
    }

字符串

ewm0tg9j

ewm0tg9j4#

其中一个原因是您加载主图像的流(MemoryStream或任何其他流)已被释放!
比如这种情况:
这是一个将字节数组转换为位图的扩展方法,但使用语句将释放内存流,这将总是导致此错误:

public static Bitmap ToBitmap(this byte[] bytes)
    {
        if (bytes == null)
        {
            return null;
        }
        else
        {
            using(MemoryStream ms = new MemoryStream(bytes))
            {
                return new Bitmap(ms);
            }
        }
    }

字符串

eulz3vhy

eulz3vhy5#

这个问题似乎发生,因为Image.Drawing.FromFile()方法锁打开的文件!
我遇到了同样的问题,我已经解决了这个问题,使用以下变通办法。

Public sFileName as string
Public img as Drawing.Image

Public Sub OpenFile(ByVal sFile As String)
    img = System.Drawing.Image.FromFile(sFile)
    sFileName = sFile
End Sub

Public Sub Update()
    Try
        img.Save("NEW.jpeg", System.Drawing.Imaging.ImageFormat.Jpeg)
        img.Dispose
        System.IO.File.Delete(sFileName)
        System.IO.File.Move("NEW.jpeg", sFileName)
    Catch ex As Exception
    EndTry
End Sub

字符串
解决方法包括
1.保存修改后的图像在另一个文件命名这里NEW.jpeg

  1. dispose img object to release it
    1.将创建的文件重命名为原始文件名
    OpenFile()Update()方法之间,我调用了一个特定的方法来更改照片的捕获日期。
Public Sub SetDateTime(ByVal sDate As String)

    Dim ascii As New System.Text.ASCIIEncoding
    Dim propItem As System.Drawing.Imaging.PropertyItem

    propItem = img.GetPropertyItem(&H132) 'PropertyTagDateTime

    propItem.Value = ascii.GetBytes(sDate)
    propItem.Value(19) = 0

    img.SetPropertyItem(propItem)
    propItem.Id = &H9003
    img.SetPropertyItem(propItem)
    propItem.Id = &H9004
    img.SetPropertyItem(propItem)
    propItem = Nothing

End Sub


这是一个程序的一部分,当相机的日期没有被正确初始化时,重命名捕获的照片日期。

相关问题