【问题标题】:image.Decode() unknown formatimage.Decode() 未知格式
【发布时间】:2020-07-11 06:59:35
【问题描述】:

我有一个存储在文件系统中的图像。该文件应解码为图像,然后调整大小。我知道如何调整它的大小,但我无法解码图像。无论我在程序中插入什么图像路径/图像,结果都是: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)

}

输出:

png 512 512 &{0x4ae340}
2020/07/11 09:37:10 image: unknown format

【问题讨论】:

    标签: image go image-processing


    【解决方案1】:

    image.Decodeimage.DecodeConfig 都使用传入的 io.Reader 中的字节。

    这意味着在完成DecodeConfig 之后,文件中的位置在已经读取的字节之后。 image.Decode 然后带有相同的底层文件,期望找到图像头,但没有。

    bufio.NewReader 将位置重置到文件的开头(因为不能,它只知道底层对象是io.Reader)。

    您有几个解决方案(按顺序或个人喜好):

    • seek 在调用image.Decode 之前回到文件的开头。例如:newOffset, err := file.Seek(0, 0)
    • 不要使用image.DecodeConfig(这可能不是一个选项)
    • 将文件读入[]byte并使用bytes.Buffer
    • 再次打开文件(效率不是特别高)

    附带说明,您不需要将os.File 对象包装在bufio.Reader 中,它已经实现了io.Reader 接口。

    【讨论】:

      猜你喜欢
      • 2015-09-02
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 2011-08-30
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      相关资源
      最近更新 更多