You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 19:44:49