我有一個關於如何恢復JPG圖像(這是一個CS50的任務)的問題。 我的代碼大部分工作(我相信),但是當我打開找到的JPG文件時,我只收到一堆縮略圖。C. 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;
}
歡迎來到Stack Overflow。請儘快閱讀[關於]頁面。一般來說,如果代碼運行,至少可以爭論它可能屬於[代碼評論](http://codereview.stackexchange.com/)。如果它不起作用,那麼你需要顯示不工作的代碼,也可能是一個(鏈接到)樣本破壞的圖像,它失敗了。通常,人們不太喜歡去其他網站獲取代碼。當操作代碼長度只有70多行時,你可以在這裏粘貼它。 – 2014-08-31 18:59:33