如何解码图像并将原始图像保留在 Go 中?

Posted

技术标签:

【中文标题】如何解码图像并将原始图像保留在 Go 中?【英文标题】:How to Decode an image and keep the original in Go? 【发布时间】:2021-12-19 19:57:14 【问题描述】:

我有以下代码:

imageFile, _ := os.Open("image.png") // returns *os.File, error

decodedImage, _, _ := image.Decode(imageFile) // returns image.Image, string, error
// imageFile has been modified!

当我在调用image.Decode 后尝试使用imageFile 时,它的行为不再相同,这让我相信image.Decode 以某种方式修改了imageFile

为什么image.Decode 修改原始值同时为decodedImage 返回一个新值 - 这不是误导吗?

如何保留原始值?有没有办法制作文件的“真实”副本,指向分配内存的新部分?

我刚开始使用 Go,如果我在这里遗漏了一些明显的东西,请道歉。

【问题讨论】:

你是什么意思它被修改了?原始值是文件本身,所以如果要复制文件,则复制文件而不解码。 我随后用imageFile 调用另一个函数。如果我在它不再识别文件之前调用了image.Decode。如果我在一切正常后调用它。 再次打开或寻找开头。这与 Go 无关,它是文件的工作方式。 【参考方案1】:

问题中的代码没有修改磁盘上的文件。

图像解码后,imageFile 的当前位置在文件开头的某个位置。要再次读取文件,Seek 回到文件的开头:

 imageFile, err := os.Open("image.png")
 if err != nil  log.Fatal(err) 
 decodedImage, _, err := image.Decode(imageFile)
 if err != nil  log.Fatal(err) 

// Rewind back to the start of the file.
_, err := imageFile.Seek(0, io.SeekStart)
if err != nil  log.Fatal(err) 
// Do something with imageFile here.

log.Fatal 错误处理替换为适合您的应用程序的任何内容。

【讨论】:

以上是关于如何解码图像并将原始图像保留在 Go 中?的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 在创建核心图像过滤器循环时保留原始图像

如何在 Python3 中从图像中删除矩形形状,保留文本?

保留缩略图中的原始比例

iOS - 创建核心图像过滤器循环时保留原始图像

JQuery 裁剪图像客户端也保留原始版本

laravel mix:如何在css中保留图像和字体的相对路径