Golang修复jpeg错误的EOF格式



对于一些jpeg图像,EOI没有以xffxd9结尾,我的例子中我看到了xffx00,所以我试图使用go来解决这个问题。

f, _ := os.Open("bad.jpeg")
img, _, err := image.Decode(f)
if err != nil {
fmt.Println(err)
}
fmt.Println("successfully decoded")
opt := jpeg.Options{
Quality: 100,
}
f1, _ := os.Create("good.jpeg")
jpeg.Encode(f1, img, &opt)

然而,image.Decode(f)由于unexpected EOF而失败,我想知道如何修复格式错误的jpeg文件的结束问题。

使用Python,我可以简单地执行以下操作,opensave将自动为我修复EOI,在Go中有等效的方法吗?

from PIL import Image
im = Image.open("bad.jpeg")
im.save("good.jpeg", quality=100)

这是我正在测试的图像

这里有一个相当简单的解决方案,只适用于这种非常特殊的情况:读取文件,尝试对其进行解码。如果解码失败,请检查最后两个字节,如果是已知模式,则覆盖最后一个字节。请尝试再次解码。如果成功,请将固定字节写入新文件。

package main
import (
"bytes"
"image"
_ "image/jpeg"
"io/ioutil"
) 

func main() {
contents, err := ioutil.ReadFile("bad.jpeg")
if err != nil {
panic(err)
}

buffer := bytes.NewBuffer(contents)
_, _, err = image.Decode(buffer)
if err == nil {
return
}

if err.Error() != "unexpected EOF" {
panic(err)
} 

// Maybe wrong End-Of-Image.
if contents[len(contents)-1] == 'x00' && contents[len(contents)-2] == 'xff' {
contents[len(contents)-1] = 'xd9'
} else {
panic("don't know what to do")
} 

// Reset buffer and decode again.
buffer = bytes.NewBuffer(contents)
_, _, err = image.Decode(buffer)
if err != nil {
panic(err)
}

// Write fixed buffer to the new file.
err = ioutil.WriteFile("good.jpeg", contents, 0644)
if err != nil {
panic(err)
}
}

最新更新