我有一个关于如何恢复jpg图像的问题(它是CS50的一项任务)。 我的代码大部分都是有效的(我相信),但是当我打开我发现的jpg时,我只得到一堆缩略图。
我一直试图解决这个问题很长一段时间,但我似乎无法弄清楚它为什么不起作用。有人能帮我推动正确的方向。
这是我的代码(也可在http://pastebin.com/U2pwJd5e处获得):
#include <stdio.h>
#include <stdlib.h>
#include "bmp.h"
int main(int argc, char* argv[])
{
//get input file
char* infile = "card.raw";
// open card file
FILE* inptr;
inptr = fopen("card.raw", "r");
// error checking (copied from copy.c)
if (inptr == NULL)
{
printf("Could not open %s.\n", infile);
return 2;
}
// initialize buffer
BYTE buffer[512];
//initialize jpg variables:
int increment = 0;
char outfilename[8];
// while the end of the file is not reached, continue process & write to buffer next block of 512 bytes
while (fread(buffer, 512, 1, inptr) != 0)
{
// if the inpointer is not empty
if(inptr != NULL)
{
// If the block of 512 bytes starts with markers
if(buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3]== 0xe1 || buffer[3]== 0xe0))
{
// increase file number by 1
sprintf(outfilename,"%.3d.jpg", ++increment);
// open new file
FILE* outptr;
outptr = fopen(outfilename, "a");
// write first block of 512 bytes, then read next block
fwrite(buffer, 512, 1, outptr);
if(fread(buffer, 512, 1, inptr) == 0)
break;
// copy all information from inpointer to buffer to jpg
while((buffer[0] != 0xff && buffer[1] != 0xd8 && buffer[2] != 0xff && (buffer[3]!= 0xe1 || buffer[3]!= 0xe0) ))
{
// if next byte is NULL break
if(fread(buffer, 512, 1, inptr) == 0)
break;
fread(buffer, 512, 1, inptr);
//copies jpg file 1 byte at a time
fwrite(buffer, 512, 1, outptr);
}
// close file
fclose(outptr);
}
}
}
return 0;
}
答案 0 :(得分:4)
您的问题中有很多缺失的信息,但我可以看到一些潜在的问题:
第二个if
块中的以下检查不正确:
(buffer[3] != 0xe1 || buffer[3] != 0xe0)
这始终是正确的,因为buffer[3]
不能同时是0xE1和0xE0。这应该是:
(buffer[3] != 0xe1 && buffer[3] != 0xe0)
您检查JPEG图像的结尾可能并不符合您的要求:
while ( buffer[0] != 0xff && buffer[1] != 0xd8 &&
buffer[2] != 0xff && buffer[3] != 0xe1 && buffer[3]!= 0xe0 )
当您在512字节块的开头找到任何的值时,这将结束JPEG。例如,字节01DB0203将结束JPEG,因为buffer[1] != 0xd8
为假,即使这不是JPEG块标记。