我有一个C代码,我可以找到BMP图像。它很好地选择了我的图像,例如,它有3992字节。我用资源调谐器程序检查了这个。如何将缓冲区中保存的内容保存为BMP文件?
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
struct BMPHeader
{
char signature[2];
};
int main()
{
FILE* file = fopen("C:\\Program Files\\...", "rb");
if (!file)
{
printf("Nu s-a putut deschide fisierul.\n");
return 1;
}
struct BMPHeader* bmpHeaders = NULL;
int bmpCount = 0;
fseek(file, 0, SEEK_END);
long fileSize = ftell(file);
fseek(file, 0, SEEK_SET);
while (ftell(file) < fileSize)
{
struct BMPHeader header;
fread(&header, sizeof(struct BMPHeader), 1, file);
if (memcmp(header.signature, "BM", 2) == 0)
{
long int poz = ftell(file);
int fileSizeBMP = 0;
char buffer[3992];
fread(&fileSizeBMP, 4, 1, file);
fseek(file, 0, SEEK_CUR);
size_t bytesread = fread(&buffer, sizeof(char), fileSizeBMP, file);
printf("%i ", fileSizeBMP);
if(fileSizeBMP == 3992)
{
for(size_t i=0; i<bytesread; i++)
{
printf("%02x ", buffer[i]);
}
FILE* file = fopen("image1.bmp", "wb");
fwrite(buffer, sizeof(buffer), 1, file);
printf("%zu ", bytesread);
}
}
}
fclose(file);
return 0;
}
我尝试了,因为它是现在,但文件已损坏,我认为是卡住了。我在想也许标题不完整
3条答案
按热度按时间stszievb1#
BMP文件以
"BM"
开始,然后具有文件大小。你读了那部分但没写。没有该标头的BMP文件将被损坏。它可以与这种改进工作。我不确定
fileSizeBMP
是完整的文件大小还是fileSizeBMP
之后的大小(你的文件可能太大了6个字节)。我不知道你的规则是什么,在
if
/while
/for
和()
之间放置空格nwlls2ji2#
您正在尝试使用
fseek(file, 0, SEEK_CUR)
返回到开头,将所有内容读取到buffer
,并将buffer
写入文件。问题是您的
fseek()
调用将0添加到当前位置,因此没有任何更改。您写入的文件缺少文件头,因为您在fseek()
调用之前读取了它。如果文件只包含BMP数据,您可以简单地使用
fseek(file, 0, SEEK_SET)
将当前位置设置为0。但是由于BMP数据从文件中间开始,因此仍然必须使用SEEK_CUR
。将当前位置移回BMP数据的开头:hi3rlvi23#
我不确定你在尝试什么,但这段代码可能有用。它从一个
RGBType
数组创建一个BMP文件,指定像素信息、dpi以及宽度和高度,因此您可以使用它来确定标题,以便将正确的数据对齐方式传递给FILE
。