【问题标题】:cs50x pset4 recover: Recovers 50 JPEGS, but half or less of the imagecs50x pset4 恢复:恢复 50 个 JPEG,但图像的一半或更少
【发布时间】:2018-04-22 11:06:45
【问题描述】:

我的程序找到所有 50 张 jpg。但是,图像是“不完整的”。有些恢复了一半,有些不到四分之一,有些完全变灰了。当我打开一个 jpeg 时,它在打开时显示为灰色,在十六进制中它显示大部分是彩色像素,这是没有意义的。我已经尝试从各个角度寻找错误。

谁能帮我理解为什么我的图片被“损坏”了?

// 000.jpg
int j = 0;
// storing 000.jpg
char jpeg[8];
// buffer
unsigned char bf[512];
// FILE pointer
FILE *img = NULL;
// reading into memory card file
while(fread(bf, 512, 1, inptr) == 1)
{
    if (bf[0] == 0xff && bf[1] == 0xd8 && bf[2] == 0xff && (bf[3] & 0xf0) == 0xe0)
    {
        sprintf(jpeg, "%03i.jpg", j);
        img = fopen(jpeg, "w");
        do
        {
            fwrite(bf, 512, 1, img);
            fread(bf, 512, 1, inptr);
        }
        while(bf[0] != 0xff && bf[1] != 0xd8 && bf[2] != 0xff && (bf[3] & 0xf0) != 0xe0);
        fclose(img);
        j++;
        // fread is going to read it again
        fseek(inptr, -512, SEEK_CUR);
    }
}
fclose(inptr);
return 0;
}

【问题讨论】:

    标签: c cs50 recover


    【解决方案1】:

    确保将“b”标志传递给 fopen。例如:

    fopen(jpeg, "wb");
    

    否则标准库将(通常无济于事)自动为您转换行尾(例如,\n 在 Windows 上变成 \r\n),当应用于二进制文件时会导致损坏。

    documentation for fopen

    使用上面的模式说明符,文件作为文本文件打开。为了将文件作为二进制文件打开,“b”字符必须包含在模式字符串中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 2020-08-02
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多