gpt4 book ai didi

go - Golang修复jpeg错误的EOF格式

转载 作者:行者123 更新时间:2023-12-01 22:43:37 24 4
gpt4 key购买 nike

对于某些jpeg图像,EOI并非以\xff\xd9结尾,在我的示例中,我看到了\xff\x00,因此我尝试使用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)
这是我正在测试的 image

最佳答案

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

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)
}
}

关于go - Golang修复jpeg错误的EOF格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63842760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com