.NET6使用ImageSharp将TIFF转PNG时如何指定新文件名保存
问题根因
你当前的代码存在3个核心问题:
- 虽然修改了
fileName变量,但创建写入文件流时依旧使用原TIFF文件的completePath,没有用到修改后的新文件名,本质还是往原TIFF文件路径写内容。 - 执行顺序错误:先创建原路径的写入流,再加载同路径的图片文件,会触发文件占用冲突。
- 用字符串
Replace方法替换后缀存在误替换风险,如果文件名本身包含tiff字段,会被错误修改。
修正后实现代码
string extension = _GetExtension(img.ContentType); if (extension == Constants.TiffExtension) { // 用内置API生成PNG文件路径,自动替换后缀,避免字符串替换的误判问题 string pngSavePath = Path.ChangeExtension(completePath, ".png"); // 先加载原TIFF图片,加载完成后ImageSharp会自动释放读取流,不会锁文件 using var image = SixLabors.ImageSharp.Image.Load(completePath); // 异步保存必须加await,防止资源提前释放导致文件损坏 await image.SaveAsync(pngSavePath, new PngEncoder()); // 不需要异步的话可以直接用同步方法,无需手动创建文件流: // image.Save(pngSavePath, new PngEncoder()); }
关键注意事项
- 不要手动用字符串
Replace修改后缀:.NET内置的Path.ChangeExtension是专门处理文件后缀的API,只会修改路径最后一段的后缀部分,不会误改文件名主体的同名字符。 - 注意加载图片和创建写入流的顺序:必须先完成原文件的读取加载,再创建新文件的写入流,否则会出现文件被占用的异常。
- 调用
SaveAsync方法必须搭配await关键字:如果不加await,方法会在写入操作未完成时就提前释放图片对象和文件流,最终生成的PNG会出现损坏、为空的问题。 - 如果业务不需要保留原TIFF文件,可以在PNG保存成功后调用
File.Delete(completePath)删除原文件。
内容的提问来源于stack exchange,提问作者Sana
相关产品推荐
相关产品推荐

