c中的颜色变化bmp

时间:2018-01-02 17:48:27

标签: c binary bmp

我有一个像素信息数组,它具有biSizeImage大小并包含形式(蓝色,绿色,红色)的三元组,其值介于0到255之间。我必须将bmp颜色从红色更改为白色,但我有问题,如图所示。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{ 
BITMAPFILEHEADER file;
BITMAPINFOHEADER info;
FILE* f=fopen("imagine.bmp","rb");
fread(&file,sizeof(BITMAPFILEHEADER),1,f);
fread(&info,sizeof(BITMAPINFOHEADER),1,f);
RGBQUAD *a=malloc(info.biSizeImage*sizeof(RGBQUAD));
fread(a,sizeof(RGBQUAD),info.biSizeImage,f);
for(int i=0;i<info.biSizeImage;i++)
  {
      a[i].rgbBlue=255;
      a[i].rgbGreen=255;
      a[i].rgbRed=255;
  }
FILE* f2=fopen("imagine2.bmp","wb");
if(f2==NULL)
    printf("Error");
fwrite(&file,sizeof(BITMAPFILEHEADER),1,f2);
fwrite(&info,sizeof(BITMAPINFOHEADER),1,f2);
fwrite(a,sizeof(RGBQUAD),info.biSizeImage,f2);
return 0;

Output

Original image

1 个答案:

答案 0 :(得分:0)

info.biSizeImage可以为零。检查以确保它不为零,或根据步幅计算它。始终设置宽度,高度和bitcount值。

如评论中所述,24位图像每像素有3个字节(24位)。 RGBQUA用于32位图像。你必须遍历高度,然后一次加宽3个字节。

int main(void)
{
    BITMAPFILEHEADER file;
    BITMAPINFOHEADER info;
    FILE* f = fopen("imagine.bmp", "rb");
    fread(&file, sizeof(BITMAPFILEHEADER), 1, f);
    fread(&info, sizeof(BITMAPINFOHEADER), 1, f);
    if(info.biBitCount != 24)
        return 0;

    int stride = ((info.biWidth * info.biBitCount + 31) / 32) * 4;
    int size = stride * info.biHeight;
    BYTE *a = malloc(stride * info.biHeight);
    fread(a, 1, size, f);
    for(int y = info.biHeight - 1; y >= 0; y--)
    {
        for(int x = 0; x < stride; x += 3)
        {
            int i = y * stride + x;
            a[i + 0] = 255;
            a[i + 1] = 255;
            a[i + 2] = 255;
        }
    }

    FILE* f2 = fopen("imagine2", "wb");
    if(f2 == NULL)
        printf("Error");
    fwrite(&file, sizeof(BITMAPFILEHEADER), 1, f2);
    fwrite(&info, sizeof(BITMAPINFOHEADER), 1, f2);
    fwrite(a, 1, size, f2);
    return 0;
}