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

时间:2014-08-20 00:34:35

标签: c xcode5 bmp

我已成功读取BMP文件中的二进制文件,使用Vectors来存储数据,然后将其写入新文件...按照下面的代码。 我意识到这个代码可以改进,我找到了一些检查书籍和互联网的解决方案。 很多人在下面编写了第二个代码,问题是对我而言运行不好并将任何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);

1 个答案:

答案 0 :(得分:0)

要真正了解正在发生的事情需要更多代码。正如@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");
    
  2. 次要

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

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