Kri*_*aka 2 image image-processing go
我有一个存储在文件系统中的图像。此文件应解码为图像,然后调整大小。我知道如何调整它的大小,但我无法解码图像。无论我在程序中插入什么图像路径/图像,它都会导致:image: unknown format.
我已经阅读了所有关于这个问题的网站,但没有一个对我有帮助。这段代码代表了我简化的程序逻辑(我想了解为什么会出现这个错误)。在此先感谢您的关注!
import (
"bufio"
"fmt"
"image"
"image/png"
_ "image/jpeg"
_ "image/png"
"log"
"os"
)
func main() {
file, err := os.Open(`D:\photos\img.png`)
if err != nil {
log.Fatal(err)
}
defer file.Close()
config, format, err := image.DecodeConfig(bufio.NewReader(file))
if err != nil {
log.Fatal(err)
}
fmt.Println(format, config.Height, config.Width, config.ColorModel)
decodedImg, format, err := image.Decode(bufio.NewReader(file)) // ERROR HERE
if err != nil {
log.Fatal(err)
}
fmt.Println(format,"decode")
outputFile, err := os.Create(`D:\photos\image.png`)
if err != nil {
log.Fatal(err)
}
defer outputFile.Close()
png.Encode(outputFile, decodedImg)
}
Run Code Online (Sandbox Code Playgroud)
输出:
png 512 512 &{0x4ae340}
2020/07/11 09:37:10 image: unknown format
Run Code Online (Sandbox Code Playgroud)
无论image.Decode和image.DecodeConfig消耗从传入的字节io.Reader。
这意味着DecodeConfig完成后,文件中的位置在已读取的字节之后。image.Decode然后带有相同的底层文件,期望找到图像标题,但没有。
bufio.NewReader 不会将位置重置为文件的开头(因为它不能,它只知道底层对象是 an io.Reader)。
您有几个解决方案(按顺序或个人喜好):
image.Decode。例如:newOffset, err := file.Seek(0, 0)image.DecodeConfig(这可能不是一个选项)[]byte并使用 abytes.Buffer作为旁注,您不需要将os.File对象包装在 a 中bufio.Reader,它已经实现了io.Reader接口。