gpt4 book ai didi

python - 如何从损坏的原始文件中提取 jpeg?

转载 作者:行者123 更新时间:2023-12-05 05:59:03 25 4
gpt4 key购买 nike

我有一个损坏的原始文件,我想恢复 ( click here to download it if you want )。我认为原始文件中的 jpeg 是完整的,所以我一直在尝试以不同的方式提取它,使用像 ERawP 这样的免费软件,甚至编写一个简单的 python 程序

然而,这些方法的问题在于程序和 Python 库都没有首先将文件视为原始文件

有什么建议吗?

编辑:照片是用 Fujifilm 相机拍摄的,以防相关

谢谢

这是我使用的代码:

import rawpy
import imageio

path = '/pathToFile/_FFF9198.RAF'
raw = rawpy.imread(path)
rgb = raw.postprocess()
imageio.imsave('findMe.tiff', rgb)

最佳答案

文件实际上充满了 JPEG。

enter image description here

应用程序非常简单:

  1. 任何以 FF D8 FF 字节序列开头的 JPEG
  2. JPEG 不关心文件大小是否精确,只要不太小
  3. JPEG 以 FF D9 结束,大多数解码器(查看器)在该点停止解码

因此应用程序扫描 FF D8 FF > 打开新文件并将所有数据从该字节序列复制到新文件而不用担心 FF D9 标记。这是执行此操作的愚蠢方法。

IOW 源文件:

... FF D8 FF ... FF D9 .. FF D8 FF .. FF D9 .. 等等.. 结束

每当您遇到字节序列 FF D8 FF 时,您都将其以及后面的所有内容复制到新文件中。这是愚蠢的方式。

聪明的方法:

我们需要了解 JPEG:

JPEG 文件是围绕所谓的标记组织的。标记是 FF nn。每次 JPEG 解码器看到 FF nn(nn = 某个值)时,它都会认为这是一个 JPEG 标记。 Here's a list of possible markers that I maintain on my website .

JPEG 以 FF D8 开头,紧接着是第一个标记 FF nn。接下来的两个字节是该部分的大小。所以 offset + size 为我们提供了下一个标记。对于除 FF D8(起始文件)、FF DA(起始图像数据)和 FF D9(图像数据结束)之外的所有标记都是如此。

所以:

FF D8 - FF nn xx xx - FF nn xx xx - FF DA ......... JPEG 图像数据...... FF D9.

雕刻 JPEG 的聪明方法是遵循从 FF D8 开始的标记链,直到我们找到 FF DA,然后一切都是 JPEG 数据,直到我们遇到 FF D9。

如果我们牢记,每次 JPEG 解码器看到 FF nn 时,它都会假设它是 JPEG 标记,我们可以解释有时我们如何修复半灰 JPEG 文件:如果我们有 FE 89 作为 JPEG 数据中的一些字节和一个一位翻转我们可以突然拥有 FF 89。大多数 JPEG 解码器都会卡住,因为它们无法确定标记 FF 89 应该做什么。如果我们将字节组合更改为任何非“FF nn”的内容,解码器将愉快地继续,尽管图像可能看起来失真。

关于python - 如何从损坏的原始文件中提取 jpeg?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68279517/

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