256色是灰度图,需要调色板...通过公式得到灰度后,可以另存一文件或填充一个内存区...下面的代码供你参考一下(从TGA中提取AlphaChannel--256 gray color)bool ExtractTgaAlphaChannel(const char * fullname,const char * filename,int style)
{
    EFile file;
    EFile outfile;
    EFile rgbfile;
    file.Open(fullname,"rb");
    char fAlphaName[260];    switch(style)
    {
    case 0://8bit,256色灰度图
        sprintf(fAlphaName,"%salpha8bit.bmp",filename);
        break;
    case 1://24bit,16M色
        sprintf(fAlphaName,"%salpha24bit.bmp",filename);
        break;
    default:
        sprintf(fAlphaName,"%salpha8bit.bmp",filename);
    }    outfile.Open(fAlphaName,"wb+");    TGAHEADER tgaHeader;
    file.Read(&tgaHeader,TGA_HEADERHEADER_SIZE,1);    long offset = file.Tell();
    long size = 0;    DWORD tmp;
    while(file.Read(&tmp,sizeof(DWORD),1)) size++;    file.Seek(offset,SEEK_SET);    /*
    BITMAPFILEHEADER    BITMAPINFOHEADER \
                      |----> BITMAPINFO
    RGBQUAD          /    */    BITMAPINFOHEADER bmiHeader;
    memset (&bmiHeader,0,sizeof(bmiHeader));
    bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmiHeader.biHeight = tgaHeader.Height;
    bmiHeader.biWidth = tgaHeader.Width;
    bmiHeader.biPlanes = 1;    switch(style)
    {
    case 0://8bit,256色灰度图
        bmiHeader.biBitCount = 8;
        break;
    case 1://24bit,16M色
        bmiHeader.biBitCount = 24;
        break;
    default:
        bmiHeader.biBitCount = 8;
    }    bmiHeader.biXPelsPerMeter = 0x0B12;
    bmiHeader.biYPelsPerMeter = 0x0B12;    //used for grayscale bitmap only
    RGBQUAD rgbquad[256];
    if(style ==0)
    {
        for(int i= 0;i<256;i++)
        {
            rgbquad[i].rgbBlue = i;
            rgbquad[i].rgbGreen = i;
            rgbquad[i].rgbRed = i;
            rgbquad[i].rgbReserved = 0x0;
        }
    }    BITMAPFILEHEADER bmpHeader;
    memset(&bmpHeader,0,sizeof(bmpHeader));
    bmpHeader.bfType = 0x4D42;
    bmpHeader.bfReserved1 = 0;
    bmpHeader.bfReserved2 = 0;
    BYTE clip = 0;
    switch(style)
    {
    case 0://8bit,256色灰度图
        bmpHeader.bfOffBits = sizeof(bmpHeader) + sizeof(bmiHeader) + sizeof(rgbquad);
        break;
    case 1://24bit,16M色
        bmpHeader.bfOffBits = sizeof(bmpHeader) + sizeof(bmiHeader);
        break;
    default:
        bmpHeader.bfOffBits = sizeof(bmpHeader) + sizeof(bmiHeader) + sizeof(rgbquad);
    }    clip = (BYTE)((size + bmpHeader.bfOffBits)%4?(4-(size + bmpHeader.bfOffBits)%4):0);    //补齐位数 4的倍数    switch(style)
    {
    case 0://8bit,256色灰度图
        bmpHeader.bfSize = (DWORD)(size + bmpHeader.bfOffBits + clip);
        break;
    case 1://24bit,16M色
        bmpHeader.bfSize = (DWORD)(size * 3 + bmpHeader.bfOffBits + clip);
        break;
    default:
        bmpHeader.bfSize = (DWORD)(size + bmpHeader.bfOffBits + clip);
    }    outfile.Write(&bmpHeader,sizeof(BITMAPFILEHEADER),1);
    outfile.Write(&bmiHeader,sizeof(bmiHeader),1);    if(style == 0)
        outfile.Write(&rgbquad,sizeof(rgbquad),1);    switch(style)
    {
    case 0://8bit,256色灰度图
        {
            DWORD dword;
            BYTE byte;
            while(file.Read(&dword,sizeof(DWORD),1))
            {
                byte = (BYTE)(dword>>24);
                outfile.Write(&byte,sizeof(BYTE),1);
            }
        }
        break;
    case 1://24bit,16M色
        {
            DWORD dword;
            BYTE byte;
            while(file.Read(&dword,sizeof(DWORD),1))
            {
                byte = (BYTE)(dword>>24);
                outfile.Write(&byte,sizeof(BYTE),1);
                outfile.Write(&byte,sizeof(BYTE),1);
                outfile.Write(&byte,sizeof(BYTE),1);
           }
        }
        break;
    default:
        {
            DWORD dword;
            BYTE byte;
            while(file.Read(&dword,sizeof(DWORD),1))
            {
                byte = (BYTE)(dword>>24);
                outfile.Write(&byte,sizeof(BYTE),1);
            }
        }
    }    if(clip)
        outfile.Write("\0",sizeof(char),clip);    return true;
}