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;
}
{
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;
}
0.299 * red + 0.587 * green + 0.114 * blue;
然后一点点描吧。