我已成功读取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);
答案 0 :(得分:0)
要真正了解正在发生的事情需要更多代码。正如@Retired Ninja指出一条评论。特别是,给定64位计算机,各种typedef的大小可能需要更正。
一些问题
以二进制模式打开文件。
// 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");
次要
使用匹配的格式说明符,假设rgb[i][j].rgbtBlue
为unsigned char
。
// printf("%d B %d",i,rgb[i][j].rgbtBlue);
printf("%d B %hhu", i, rgb[i][j].rgbtBlue);