C:没有正确写入BMP文件

时间:2016-07-15 16:14:57

标签: c bmp

新来的,第一篇文章......一直在教自己C.

在写入文件时遇到问题,特别是BMP文件。我删除了RGB值并将剩余数据写入新文件。当我试图打开它时,它不被识别,然后挫败感随之而来。代码写出适当的大小,我没有任何错误,它运行...我只是没有得到我需要的输出文件,并坚持如何解决它。

显然,我正在搞砸我的转换回文件或完全丢失其他内容。感谢帮助。

FILE * fPointer;
fPointer = fopen("myBMP.bmp", "rb");

FILE * wfPointer;
wfPointer = fopen("myBMP2.bmp", "wb");

unsigned char fileChars;
unsigned char wfBMP;

unsigned int toBMPFile[1024];
unsigned int intcon;

int count = 0;
int countchars = 0;
int i = 0;

while(!feof(fPointer))
{
    fileChars = fgetc(fPointer);
    intcon = fileChars;

    // strip 255 out of file
    if(intcon == 255)
    {
        // printf("%i ", intcon);
        continue;
    }
    else if(intcon < 255)
    {
        // write values < 255 into file
        toBMPFile[i] = intcon;
        printf("%c ", toBMPFile[i]);
        wfBMP = toBMPFile[i];
        fwrite(&wfBMP, sizeof(wfBMP), 1, wfPointer);
        // fprintf(wfPointer, "%c", wfBMP);
        countchars++;
    }   
    else 
    {
        continue;
    }   

    count++;

}

printf("\nnumber of characters in new file: %i\n", countchars);
fclose(fPointer);

fclose(wfPointer);

return 0;

}

2 个答案:

答案 0 :(得分:3)

BMP文件包含一个标题,描述数据的格式和图像的尺寸,后跟图像数据。您正在创建整个文件的副本,除了碰巧具有值255的字节。

这会导致两个问题:

  • 如果标题中的任何字节恰好具有值255,则不会复制它们,因此生成的标题将不具有正确的结构,并且可能不包含合理的信息
  • 因为您省略了一些图像数据,所以存在的数据总量将不再是标题引导读者期望的数据

你真的想做什么?

如果您打算制作较小的图像,则需要更改标题以反映该图像。

如果您的意图是在不改变图像大小的情况下用不同的颜色值替换某些颜色值,则需要写出新值而不是仅跳过这些字节。

在任何一种情况下,您都需要分别处理处理图像数据的操作。 BMP标题格式在很多地方都有记录,但如果您只是处理图像数据,那么最简单的方法可能是使用第三方库来读取和写入图像 - 这就是您&# 39;免费获得各种其他功能(应对不同颜色深度,可能还有其他图像格式)。

答案 1 :(得分:1)

fgetc()返回int,而不是char

the man page

int fgetc(FILE *stream);

因为您将int的{​​{1}}值截断为字符,所以您无法正确识别文件的结尾。

打开所有编译器警告。

随机删除BMP文件中的值可能也会导致问题,因为在您删除EOF像素后,您似乎没有正确地重新创建标题部分。