看到这几个报错是不是很头疼?
png: invalid format: not a PNG file
或
png: invalid format: not a JPEG file
或
invalid JPEG format: missing SOI marker
或
invalid JPG format: missing SOI marker
或
invalid PNG format: missing SOI marker
...等等
目录
背景
webp的图片转为其他格式、合成图片时报的错。
这几个报错都几乎发生在jpeg.Decode、png.Decode、image.Decode的时候,共性就是
图片格式或者图片本身有问题,原因如下:
1,采取了不正确的手段转换了格式,导致不能正常解码
2,对图片本身进行了非法修改,导致不能正常解码
3,原图片在生成时就有问题
最简单的例子就是直接改后缀名就会导致基于一定方法来转换就出错。
这些报错前后都经历了,还尝试过换不同的后缀来进行合成,因为前一步转换(webp-->png、webp-->jpg、webp-->jpeg)的方法不对,导致最终合成都会失败(合成时会有Decode这一步)。
尝试过base64那种方式转换然后加后缀,也是不行的(多数方式代码看起来很像,实则还是有区别)。
解决方案
用到了github.com/h2non/bimg这个包。
// dir:新存放目录, path:源文件路径 imageType: 要转成的格式
// convert 转换格式
func convertFormat(srcPath, dir string, imageType bimg.ImageType) (error, string) {
buffer, err := bimg.Read(srcPath)
if err != nil {
return err, ""
}
bImage := bimg.NewImage(buffer)
options := bimg.Options{
// Width: 512,
// Height: 512, // 按实际需要是否需要resize
Embed: true,
Quality: 96,
Gamma: 1.0,
}
img, err := bImage.Process(options)
if err != nil {
return err, ""
}
newImage, err := bimg.NewImage(img).Convert(imageType)
if err != nil {
return err, ""
}
fileName := "xx." + bimg.ImageTypes[imageType] // 名称
filePath := filepath.Join(dir, fileName) // 路径
return bimg.Write(filePath, newImage), filePath
}
这样就欧克了,实测正常。