Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将修改后的图像保存在同一文件中_C# - Fatal编程技术网

C# 将修改后的图像保存在同一文件中

C# 将修改后的图像保存在同一文件中,c#,C#,我正在制作一个应用程序,在最初存储在文件中的图像上添加(绘制)一些文本。我设法修改了图像并将其保存在另一个文件中,但我尝试不创建第二个文件,而是将结果存储在原始文件中,尽管当我尝试这样做时(如Microsoft文档网站中所述),将导致引发异常(因为Image.Save方法不允许在创建图像的同一文件中写入内容)。有没有正确的方法 现在我已经做了一个变通办法,将修改后的图像保存到另一个文件中,然后删除它并将第二个文件的名称更改为原始文件 这是我的密码 Image image = Image.From

我正在制作一个应用程序,在最初存储在文件中的图像上添加(绘制)一些文本。我设法修改了图像并将其保存在另一个文件中,但我尝试不创建第二个文件,而是将结果存储在原始文件中,尽管当我尝试这样做时(如Microsoft文档网站中所述),将导致引发异常(因为Image.Save方法不允许在创建图像的同一文件中写入内容)。有没有正确的方法

现在我已经做了一个变通办法,将修改后的图像保存到另一个文件中,然后删除它并将第二个文件的名称更改为原始文件

这是我的密码

Image image = Image.FromFile(originalFile);
Graphics graphics = Graphics.FromImage(image);
...
graphics.DrawString(line, ...);
...
image.Save(newFile);
graphics.Dispose();
image.Dispose();
File.Delete(originalFile);
File.Move(newFile, originalFile);

Image.FromFile
的文档确实会说“在图像被释放之前,文件将保持锁定状态。”

您的方法很好(尽管可能比删除和移动更好)


如果确实要提前解锁文件,另一个选项是在打开图像后克隆图像,处理“文件备份”图像,并将该图像用于绘图。

图像的文档。FromFile会说“在处理图像之前,该文件将保持锁定状态。”

您的方法很好(尽管可能比删除和移动更好)


如果确实要提前解锁该文件,另一个选项是在打开图像后克隆该图像,处置“备份的文件”图像,并将该图像用于绘图。

我认为这可能是一个合理的解决方案;如果考虑到这一点,在旧图像的上方保存一个新图像实际上是与此相同的操作集。您可以将该文件读入字节数组,然后从内存流加载它,但可能写入一个新文件,这样windows就可以ep磁盘碎片整理得更好,因为它可以搜寻用于放置新文件的连续空间,然后释放旧文件。也许您可以使用
FileAccess.ReadWrite
optionRelated:.更一般,而不是通过
image.FromFile(字符串路径)从流中打开图像
。这是否回答了您的问题?移动
图形.Dispose();
图像.Save(原始文件)之前;
应该可以解决这个问题,但使用更清晰。我认为这可能是一个合理的解决方案;如果你考虑一下,在旧图像的上方保存一个新图像实际上是一组与此相同的操作。你可以将文件读入字节数组,然后从内存流中加载它,但可能写一个新文件允许windows为了更好地对磁盘进行碎片整理,因为它可以搜寻用于放置新文件的连续空间,然后释放旧文件,也许您可以使用
FileAccess.ReadWrite
optionRelated:.更一般的不是通过
image.FromFile(字符串路径)加载图像
。这是否回答了您的问题?将
graphics.Dispose();
移动到
image.Save(原始文件);
之前应该可以解决问题,但使用更清晰。