image - image.Decode() 未知格式
问题描述
我有一个存储在文件系统中的图像。该文件应解码为图像,然后调整大小。我知道如何调整它的大小,但我无法解码图像。无论我在程序中插入什么图像路径/图像,它都会产生: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.Decode和image.DecodeConfig都使用传入的字节。io.Reader
这意味着在DecodeConfig
完成之后,文件中的位置在已经读取的字节之后。image.Decode
然后与相同的基础文件一起出现,希望找到图像标题,但没有。
bufio.NewReader
不会将位置重置到文件的开头(因为它不能,它只知道底层对象是一个io.Reader
)。
您有一些解决方案(按顺序或个人喜好):
- 在调用
image.Decode
. 例如:newOffset, err := file.Seek(0, 0)
- 不要使用
image.DecodeConfig
(这可能不是一个选项) - 将文件读入 a
[]byte
并使用 abytes.Buffer
- 再次打开文件(不是特别有效)
作为旁注,您不需要将os.File
对象包装在 a 中bufio.Reader
,它已经实现了io.Reader
接口。
推荐阅读
- c# - 如何将静态资源用于 WPF 数据网格组合框绑定
- matlab - 如何在 importdata() 的结果中修复“这种类型的变量不支持点索引”
- php - 从 TinyMCE 中去除 html_tags 和额外的反斜杠
- java - 在一定秒数后执行几行程序
- wordpress - 如何创建带有可编辑选项的 WordPress 小部件
- sql-server - 简化的 GeoJSON 报告谷歌地图上的幻想标记
- java - jps、jinfo、jstat、jmap和jstack如何获取本地Java进程的信息?
- r - 如何将唯一的重复列折叠到 R 中的唯一列?
- python-3.x - 如何递归地从列表中检索最大值和最小值?
- android - 我正在使用选项卡布局,其中一个我有一个按钮,我想在单击该按钮时更改片段