{ "@context": "https://schema.org", "@type": "Article", "headline": "Golang 修复 JPEG 文件的 EOF 问题", "datePublished": "2024-03-05T12:45:25", "dateModified": "2024-03-05T12:45:25", "description": "Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《Golang 修复 JPEG 文件的 EOF 问题》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!问题内容对于某些 jpeg 图像,eoi 不是以 \xff\xd9 结尾,我的示例中我看到 \xff\x00,所以我尝试使用 go 修复此问题。f, _ := os.open(bad.jpeg)img, _, err := i", "publisher": { "@type": "Organization", "name": "Golang学习网", "url": "https://m.17golang.com" }, "mainEntityOfPage": { "@type": "WebPage", "@id": "https://m.17golang.com/article/104934.html" } }
登录
首页 >  Golang >  Go问答

Golang 修复 JPEG 文件的 EOF 问题

来源:stackoverflow

时间:2024-03-05 12:45:25 150浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《Golang 修复 JPEG 文件的 EOF 问题》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

对于某些 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)

但是,由于 unexpected eofimage.decode(f) 失败,我想知道如何修复格式错误的 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)
  }
}

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>