将24位图像的R、G、B各个分量提取出来,并保存成图片解决思路

将24位图像的R、G、B各个分量提取出来,并保存成图片
我想将24位图像的各个颜色分量提取出来,并保存成bmp格式的图片。程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#define  BMP_Width  885
#define  BMP_Height 680

unsigned char *pBmpBuf;//读入图像数据的指针
unsigned char image_red[BMP_Height][BMP_Width]={0};
unsigned char image_green[BMP_Height][BMP_Width]={0};
unsigned char image_blue[BMP_Height][BMP_Width]={0};
RGBQUAD *pColorTable;//颜色表指针
int biBitCount;//图像类型
int lineByte;


bool read_bmp(char *bmpName)
{
    FILE *fp=fopen(bmpName,"rb");
if(fp==0) return 0;
fseek(fp,sizeof(BITMAPFILEHEADER),0);
BITMAPINFOHEADER head;  
fread(&head,sizeof(BITMAPINFOHEADER),1,fp); 
biBitCount=head.biBitCount;
lineByte=(BMP_Width*biBitCount/8+3)/4*4;
if(biBitCount==8)
{
pColorTable=new RGBQUAD[256];
fread(pColorTable,sizeof(RGBQUAD),256,fp);
}
pBmpBuf=new unsigned char[lineByte*BMP_Height];
fread(pBmpBuf,1,lineByte*BMP_Height,fp);
fclose(fp);
return 1;
}


bool save_bmp(char *bmpName, unsigned char *imgBuf, int width, int height, 
  int biBitCount, RGBQUAD *pColorTable)
{
if(!imgBuf)
return 0;
int colorTablesize=0;
if(biBitCount==8)
colorTablesize=1024;
int lineByte=(width * biBitCount/8+3)/4*4;
FILE *fp=fopen(bmpName,"wb");
if(fp==0) return 0;
BITMAPFILEHEADER fileHead;
fileHead.bfType = 0x4D42;//bmp类型
fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ colorTablesize + lineByte*height;
fileHead.bfReserved1 = 0;
fileHead.bfReserved2 = 0;
fileHead.bfOffBits=54+colorTablesize;
fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp);
BITMAPINFOHEADER head; 
head.biBitCount=biBitCount;
head.biClrImportant=0;
head.biClrUsed=0;
head.biCompression=0;
head.biHeight=height;
head.biPlanes=1;
head.biSize=40;
head.biSizeImage=lineByte*height;
head.biWidth=width;
head.biXPelsPerMeter=0;
head.biYPelsPerMeter=0;
fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);
if(biBitCount==8)
fwrite(pColorTable, sizeof(RGBQUAD),256, fp);
fwrite(imgBuf, height*lineByte, 1, fp);
fclose(fp);
return 1;
}
int main()
{
int i,j;
FILE *fp;
read_bmp("1.bmp");

for(i=0;i<BMP_Height;i++)
{
for(j=0;j<BMP_Width;j++)
{
image_blue[i][j]=pBmpBuf[i*lineByte+j*3+0];
image_green[i][j]=pBmpBuf[i*lineByte+j*3+1];
image_red[i][j]=pBmpBuf[i*lineByte+j*3+2];
}
}


pColorTable=(RGBQUAD*)malloc(256*sizeof(RGBQUAD));
i=sizeof(RGBQUAD);
memset(pColorTable,0,256*sizeof(RGBQUAD));
for(i=0;i<256;i++)
{
pColorTable[i].rgbBlue=i;
pColorTable[i].rgbGreen=i;
pColorTable[i].rgbRed=i;
pColorTable[i].rgbReserved=0;
}

save_bmp("image_red.bmp",image_red[0],BMP_Width,BMP_Height,8,pColorTable);
save_bmp("image_green.bmp",image_green[0],BMP_Width,BMP_Height,8,pColorTable);
save_bmp("image_blue.bmp",image_blue[0],BMP_Width,BMP_Height,8,pColorTable);

free(pColorTable);
return 1;
}
使用的24位图片为:
将24位图像的R、G、B各个分量提取出来,并保存成图片解决思路
得到的各个颜色分量的图片如下:
红色将24位图像的R、G、B各个分量提取出来,并保存成图片解决思路
绿色将24位图像的R、G、B各个分量提取出来,并保存成图片解决思路
蓝色将24位图像的R、G、B各个分量提取出来,并保存成图片解决思路


不知道为什么不对!这个问题困扰我好几天了!麻烦大家帮我看看!


------解决方案--------------------
BMP要求每行数据4字节对齐