在Go语言中复制JPEG的EXIF元数据后文件损坏的问题排查
复制JPEG图片EXIF元数据后文件损坏,提示缺少SOS标记
我尝试将一张带有EXIF标签的JPEG图片中的元数据复制到另一张无元数据的JPEG中,参考了相关方法。我的思路是:复制标签源文件中直到第一个ffdb(不包含)的所有内容,再复制图片源文件中从第一个ffdb(包含)开始的所有内容。但生成的文件损坏,提示缺少SOS标记。
包含相关建议的完整复现代码可在Go在线运行环境获取,只需在包含带标签test.jpg文件的目录中运行即可。
以下是我的Go代码草稿:
func copyExif(from, to string) error { os.Rename(to, to+"~") //defer os.Remove(to + "~") tagsSrc, err := os.Open(from) if err != nil { return err } defer tagsSrc.Close() imageSrc, err := os.Open(to + "~") if err != nil { return err } defer imageSrc.Close() dest, err := os.Create(to) if err != nil { return err } defer dest.Close() // copy from tagsSrc until ffdb, excluded buf := make([]byte, 1000000) n, err := tagsSrc.Read(buf) if err != nil { return err } x := 0 for i := 0; i < n-1; i++ { if buf[i] == 0xff && buf[i+1] == 0xdb { x = i break } } _, err = dest.Write(buf[:x]) if err != nil { return err } // skip ffd8 from imageSrc, then copy the rest (there are no tags here) skip := []byte{0, 0} _, err = imageSrc.Read(skip) if err != nil { return err } _, err = io.Copy(dest, imageSrc) if err != nil { return err } return nil }
检查生成的文件后,代码似乎执行了我预期的操作。左上角是标签源文件,左下角是图片源文件,右侧是生成的结果文件。
请问有人知道我遗漏了什么吗?感谢解答。
内容的提问来源于stack exchange,提问作者neclepsio
相关产品推荐
相关产品推荐

