gpt4 book ai didi

c - 使用strucs读取二进制文件的问题

转载 作者:太空宇宙 更新时间:2023-11-04 04:42:05 24 4
gpt4 key购买 nike

在将数据写入新文件之前,我已经成功地使用 Vectors 从 BMP 文件中读取二进制文件来存储数据...请按照下面的代码进行操作。我意识到这个代码可以改进,我找到了一些检查书籍和互联网的解决方案。很多人写了下面的第二个代码,问题是对我来说它运行不好,无法将任何 BMP 文件制作成单色文件。我正在使用 Xcode5 编译这个程序。

for (int i = 0; i <= imageW - 1; i++)
{
for (int j = 0; j <= imageH - 1; j++)
{
fread(&rgb[i][j], sizeof(RGBTRIPLE), 1, datas);
}
}

// open output file
FILE *bmp_blue = fopen("newfile.bmp", "w");
if (bmp_blue == NULL)
{
printf("Could not create\n");
return 3;
}

// Write output file BITMAPFILEHEADER
fwrite(&bf, sizeof(BITMAPFILEHEADER), 1, bmp_blue);

// Write output file BITMAPINFOHEADER
fwrite(&bi, sizeof(BITMAPINFOHEADER), 1, bmp_blue);

// go Black
for (int i = 0; i <= imageW - 1; i++)
{
for (int j = 0; j <= imageH - 1; j++)
{
if (rgb[i][j].rgbtRed == 255)
{
rgb[i][j].rgbtGreen = 0;
rgb[i][j].rgbtRed = 0;
rgb[i][j].rgbtBlue = 0;
}
}
}

for (int i = 0; i <= imageW - 1; i++)
{
for (int j = 0; j <= imageH - 1; j++)
{
printf("%d B %d",i,rgb[i][j].rgbtBlue);
printf(" G %d",rgb[i][j].rgbtGreen);
printf(" R %d\n",rgb[i][j].rgbtRed);
}
}

// Write output file RGBTRIPLE
for (int i = 0; i <= imageW - 1; i++)
{
for (int j = 0; j <= imageH - 1; j++)
{
fwrite(&rgb[i][j], sizeof(RGBTRIPLE), 1, bmp_blue);
}
}

不使用 Vector 编写代码并直接使用 FOR 语句迭代二进制文件。

// Write output file BITMAPFILEHEADER
fwrite(&bf, sizeof(BITMAPFILEHEADER), 1, bmp_blue);

// Write output file BITMAPINFOHEADER
fwrite(&bi, sizeof(BITMAPINFOHEADER), 1, bmp_blue);

bi.biHeight = abs(bi.biHeight);

// If Red >>> Go Black

// iterate over infile's scanlines
for (int i = 0 ; i < bi.biHeight; i++)
{
// iterate over pixels in scanline
for (int j = 0; j < bi.biWidth; j++)
{
// temporary storage
RGBTRIPLE rgb;

// read RGB triple from infile
fread(&rgb, sizeof(RGBTRIPLE), 1, bmp_blue);

// crank down blue in all pixels
if(rgb.rgbtRed == 255)
{
rgb.rgbtBlue = 0;
rgb.rgbtRed = 0;
rgb.rgbtGreen = 0;
}
// write RGB triple to outfile
fwrite(&rgb, sizeof(RGBTRIPLE), 1, bmp_blue);

最佳答案

要真正了解发生了什么,需要更多代码。正如@Retired Ninja 指出的那样。特别是,对于 64 位机器,各种 typedef 的大小可能需要更正。

一些问题

  1. 以二进制模式打开文件。

    // this line is implied
    FILE *datas = fopen(..., "rb");

    // FILE *bmp_blue = fopen("newfile.bmp", "w");
    FILE *bmp_blue = fopen("newfile.bmp", "wb");

    // this line is implied
    FILE *bmp_blue = fopen(..., "wb");

未成年人

  1. 假设 rgb[i][j].rgbtBlueunsigned char,使用匹配的格式说明符。

    // printf("%d B %d",i,rgb[i][j].rgbtBlue);
    printf("%d B %hhu", i, rgb[i][j].rgbtBlue);

关于c - 使用strucs读取二进制文件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25395067/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com