修复损坏的jpegs

时间:2014-03-27 07:36:12

标签: jpeg file-format corrupt

前段时间我的外置硬盘崩溃(完全停止工作),我不得不从另一台硬盘中恢复文件。一段时间后,我意识到一些已被恢复的图片已被破坏。

我无法通过任何图像程序打开这些图像。当我运行"文件"命令我得到.jpgs:

DSCN9129.JPG: JPEG image data, EXIF standard 2.2
DSCN9130.JPG: JPEG image data, EXIF standard 2.2
DSCN9131.JPG: JPEG image data, EXIF standard 2.2
DSCN9132.JPG: DOS executable (COM)
DSCN9133.JPG: data
DSCN9134.JPG: data
DSCN9135.JPG: JPEG image data, EXIF standard 2.2
DSCN9136.JPG: data
DSCN9137.JPG: data
DSCN9138.JPG: data
DSCN9139.JPG: data
DSCN9140.JPG: 8086 relocatable (Microsoft)
DSCN9141.JPG: data
DSCN9142.JPG: data

在那里,我们可以注意到有些图像没问题,有些图像无法识别,有些图像被错误地解释为其他文件。

我正在上传2个示例图片:

http://ul.to/u7emvxp8 ---> DSCN9133.JPG(已损坏)
http://ul.to/zegf7q8a ---> DSCN9131.JPG(未损坏)

我使用这个python代码来查看文件中的内容:

import sys, os

with open("./images/DSCN9133.JPG", "rb") as f:
        stri=""
        i=0
        byte = f.read(1)
        while byte != "" and i < 1000:
                i=i+1
                stri = stri+" "+hex(ord(byte))
                byte = f.read(1)
        print(stri)

我在这里打印出损坏且未损坏图像的前几个字节。

损坏:

0x6b 0xe8 0xf2 0xd6 0x9b 0xba 0x77 0xb4 0x97 0xd1 0x69 0xbb 0x2e 0xe 0xda 0x8d 0x4 0xb7 0x7 0x33 0xb2 0xf2 0x10 0x35 0x58 0x4e 0xa1 0x80 0x4c 0x2b 0x1f 0x8f 0x9 0xd0 0xaf 0x22 0x5 0x2d 0x87 0xab 0x81 0xb0 0x6c 0x7a 0xd8 0x4c 0x7b 0x52 0xf1 0xe9 0xf3 0xe9 0xca 0xa6 0x4 0xcb 0x9c 0x7b 0x64 0x34 0x98 0x46 0x4 0xd1 0xa6 0x30 0x60 0xb5 0xae 0xcb 0xf2 0x56 0xda 0x20 0x15 0xcf 0x7 0x61 0x2c 0xc 0x3f 0x44 0x67 0x49 0x0 0x41 0xfe 0xac 0x4f 0x15 0xcf 0x9d 0x3a 0x6b 0xdb 0x94 0xb5 0x85 0xa 0x4 0x34 0x7d 0xfd 0x9 0xba 0x86 0xec 0x2f 0xe9 0xa9 0xb6 0xaa 0x62 0x80 0xbb 0x43 0x96 0xa1 0x4d 0x54 0xfa 0x1b 0xdf 0x33 0xab 0x93 0x8a 0xd6 0xdc 0x33 0xe1 0x9d 0x91 0x5a 0x4e 0xd0 0xe5 0x6a 0x1c 0x95 0x72 0x53 0x9f 0x27 0x9a 0x1e 0x8f 0x7d 0x1d 0xad 0x34 0x7b 0xf6 0xc8 0xf 0xde 0xe1 0x48 0xa7 0x58 0x52 0x4d 0x16 0x2b 0x53 0x1b 0x2 0x2a 0x93 0xc6 0x7c 0x76 0x3d 0x78 0xca 0xe2 0x90 0xd3 0x55 0xdb 0x32 0x62 0x1d 0x4f 0xd1 0xd1 0xdc 0x13 0xf 0xb6 0x4e 0x4e 0x66 

未腐败:

0xff 0xd8 0xff 0xe1 0x8a 0x45 0x45 0x78 0x69 0x66 0x0 0x0 0x49 0x49 0x2a 0x0 0x8 0x0 0x0 0x0 0xb 0x0 0xe 0x1 0x2 0x0 0xb 0x0 0x0 0x0 0x92 0x0 0x0 0x0 0xf 0x1 0x2 0x0 0x6 0x0 0x0 0x0 0xb2 0x0 0x0 0x0 0x10 0x1 0x2 0x0 0x6 0x0 0x0 0x0 0xca 0x0 0x0 0x0 0x12 0x1 0x3 0x0 0x1 0x0 0x0 0x0 0x1 0x0 0x0 0x0 0x1a 0x1 0x5 0x0 0x1 0x0 0x0 0x0 0xd8 0x0 0x0 0x0 0x1b 0x1 0x5 0x0 0x1 0x0 0x0 0x0 0xe0 0x0 0x0 0x0 0x28 0x1 0x3 0x0 0x1 0x0 0x0 0x0 0x2 0x0 0x0 0x0 0x31 0x1 0x2 0x0 0xa 0x0 0x0 0x0 0xe8 0x0 0x0 0x0 0x32 0x1 0x2 0x0 0x14 0x0 0x0 0x0 0x8 0x1 0x0 0x0 0x13 0x2 0x3 0x0 0x1 0x0 0x0 0x0 0x2 0x0 0x0 0x0 0x69 0x87 0x4 0x0 0x1 0x0 0x0 0x0 0x1c 0x1 0x0 0x0 0xa4 0x3 0x0 0x0 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x4e 0x49 0x4b 0x4f 0x4e 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x45 0x33 0x37 0x30 0x30 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x2c 0x1 0x0 0x0 0x1 0x0 0x0 0x0 0x2c 

但我不知道jpgs是由什么组成的......

有人可以给我一个建议我应遵循的方向,以便找出是否可以修复图像?

如何判断像素信息是否存在或我是否只保留随机数据?

我认为知道图像的大小是件好事,但当然因为这些图像是压缩的,所以它不会那么容易。

编辑:我发现这个http://www.w3.org/Graphics/JPEG/itu-t81.pdf应该对此有用,但我也想知道如何判断像素数据是否存在。

EDIT2:我原来的问题集中在以下几点(我澄清因为我意识到它不够清晰)我认为这些图像上的字节可能是jpegs的一部分。可能是字节刚刚移位或缺少标头,也许有一种方法可以探索数据是否存在。当然,如果这些是BMP或某些国王的未压缩图像,情况就是如此。作为jpgs,压缩,我认为使一切变得更加困难并非完全不可能。但是,我仍然想知道更多,如果我告诉某人在某些字节中有图像中的像素信息,我们怎么办呢?

1 个答案:

答案 0 :(得分:4)

以下是您的整个问题:&#34;我必须从另一个已被删除的硬盘中恢复文件&#34;

当创建任何文件时,OS(通常通常)将数据写入多个块,并将指向这些块的指针放在索引文件中。当文件被删除时,这些索引和它们指向的块标记为&#34; free&#34; (如在&#34;磁盘区域,现在可以存储数据&#34;)。

重要的是要了解删除的文件仍然在磁盘上,并且只有指示器被重写。

当然,这正是数据恢复的工作原理。恢复程序扫描&#34;删除&#34;磁盘的一部分寻找可识别的数据。当它找到某些东西时,它会以各种方式保存这些数据,并且通常会评估所发现的数据是否实际可以恢复&#34;或不。

一种数据识别方法是通过&#34;魔术数字&#34;,AKA&#34;文件签名&#34;。对于JPG文件,文件开头和结尾的幻数分别为:0xFFD8和0xFFD9。

如果您查看发布的数据,您会发现&#34;未损坏&#34;文件确实以&#34; 0xFFD8&#34;开头,并且恢复程序会将其标记为JPG文件。

但是......正如我之前所说,当一个文件被删除时,它的数据块是&#34; free&#34;为操作系统编写新的用户数据,覆盖旧数据。这通常导致说&#34; xyz.jpg&#34;在删除之前最初跨越3个街区。你继续使用你的计算机,在某些时候,给阿姨mabel的一封信的一部分被写入其中一个块,只有原来的xyz.jpg的其他两个块可以被恢复(即使这样,有很多原因,恢复计划可能只找到其中​​一个块而不是两者都是

OTOH,一个恢复程序垫也可以恢复一个索引指针,并抓住那里的任何东西。因此,如果恢复的文件指针显示&#34; DSCN9132.JPG&#34;驻留在这样一个地址,恢复程序将获取数据块,将其命名为&#34; DSCN9132.JPG&#34;,但将数据类型识别为&#34; DOS可执行文件(COM)& #34; file - 因为它是由于被覆盖而现在在那里的文件类型。这是获得描述结果的一个原因,如列表示例所示。

而BTW,恢复图像文件的另一个结果来自于使用图形程序来查看您在恢复目录中看到的JPG文件:有些图像看起来很棒,有些会有下半部分(&#图像缺失的一半是34个;一半是主观的:它可能是底部到几乎整个图像的几行),有些会产生文件错误。

这不是关于文件删除,恢复或损坏的详尽或写得很好的论文,但我认为您的问题值得某种答案,我希望它能为您提供一些关于这些系统如何工作的线索。