如题.我知道颜色表换算出错了.但错在那里那.如何换算呢?帮忙呀!汗!!!
代码如下,请帮调试,高分,不够再给.
void CtestDlg::CreateDIBBitmap(int nWidth, int nHeight, int nPitch)
{
HDC hDC = ::GetDC(0);
BYTE * ImageData = new BYTE[nWidth*nHeight*(nPitch/8)];
ZeroMemory(ImageData,nWidth*nHeight*(nPitch/8));
BITMAPINFOHEADER fmtFrame = {sizeof(BITMAPINFOHEADER), 0, 0, 1, nPitch, BI_RGB, 0, 0, 0, 0, 0};
fmtFrame.biWidth = nWidth;
fmtFrame.biHeight = nHeight;
fmtFrame.biSizeImage =nWidth*nHeight*(nPitch/8);
fmtFrame.biXPelsPerMeter = 11811;
fmtFrame.biYPelsPerMeter = 11811;
hBmp = CreateDIBSection(hDC, (BITMAPINFO*) &fmtFrame, DIB_RGB_COLORS, (void**)&byImageData, NULL, 0);
SetDIBits(hDC, hBmp, 0, nHeight, ImageData, (BITMAPINFO*) &fmtFrame, DIB_RGB_COLORS); if( ImageData ) 
{
delete[] ImageData;
ImageData = NULL;
}}
void CtestDlg::CreateBmp()
{
CreateDIBBitmap(150, 190, 16); //bitmap1
PBITMAPFILEHEADER lpbh1 = NULL;
LPBITMAPINFOHEADER lpbi1 = NULL;
/*
PBITMAPFILEHEADER lpbh2 = NULL;
LPBITMAPINFOHEADER lpbi2 = NULL;*/ void *pszSrc1 = NULL;
int nLen1 = 0;
ReadFileData("1.bmp", pszSrc1, nLen1);
BYTE *pszS1 = (BYTE*)pszSrc1;
lpbh1 = (PBITMAPFILEHEADER)pszS1;
pszS1 += sizeof(BITMAPFILEHEADER);
lpbi1 = (LPBITMAPINFOHEADER)pszS1;
pszS1 += sizeof(BITMAPINFOHEADER);
int nSize = (1<<lpbi1->biBitCount) * sizeof(GIFCOLOR);
GIFCOLOR *pColorTable = new GIFCOLOR[nSize];
WORD *pwPalette1 = new WORD [nSize]; memcpy(pColorTable, pszS1, nSize);
pszS1 += nSize;
WORD *TmpPtr = pwPalette1;
GIFCOLOR * pColor = pColorTable;
WORD tmpRed;
WORD tmpGreen;
WORD tmpBlue;
for( int i=0; i<(1<<lpbi1->biBitCount); i++)
{
tmpRed = (*pColor).r;
tmpGreen = (*pColor).g;
tmpBlue = (*pColor).b;
tmpRed>>=3;
tmpGreen>>=2;
tmpBlue>>=3;
*TmpPtr =(tmpRed<<11)|(tmpGreen<<5)|tmpBlue;
pColor++;
TmpPtr++;
}
//transfer
BYTE *pSrc1 = pszS1;
BYTE *pDst1 = byImageData; for(int i=0; i<lpbi1->biHeight; i++)
{
for(int j=0; j<lpbi1->biWidth; j++)
{
*((WORD*)pDst1) = pwPalette1[*pSrc1];
pDst1+=2;
pSrc1++; }
pSrc1+= lpbi1->biSizeImage - lpbi1->biWidth;
}
//end

if ( pwPalette1 ) delete pwPalette1;
if ( pColorTable ) delete pColorTable;
if( pszSrc1 != NULL ) delete pszSrc1;
}BOOL CtestDlg::ReadFileData(const char *pszFileName, void *&pData, int &nDataLen)
{

HANDLE  hf;
hf=::CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hf==INVALID_HANDLE_VALUE)
return FALSE;
nDataLen=SetFilePointer(hf,0,NULL,FILE_END);//得到文件长度
if(nDataLen<=0)
{
CloseHandle(hf);
return FALSE;
}
char *pDataFile=new char[nDataLen];
if(pDataFile==NULL)
{
CloseHandle(hf);
return FALSE;
}
SetFilePointer(hf,0,NULL,FILE_BEGIN); DWORD ReadLen=0;
if(!ReadFile(hf,pDataFile,nDataLen,&ReadLen,NULL))
{
delete[] pDataFile;
CloseHandle(hf);
return FALSE;
}
if((int)ReadLen!=nDataLen)
{
delete[] pDataFile;
CloseHandle(hf);
return FALSE;
}
CloseHandle(hf); pData = (void*)pDataFile;
/*
if( pData != NULL )
{
delete pData;
pData = NULL;
}
*/
return TRUE;
}

解决方案 »

  1.   

    8bits是256色有调色板的,数据区当中存储的是象素颜色的索引
    调色板当中的颜色是r8g8b8的16位有1555和r5g6b5两种格式,前者常见你需要在这两者之间做转换,以到1555格式为例子
    targetColor = (Palette[sourceColor].b>>3) | ((Palette[sourceColor].b>>3) <<5) |
                  ((Palette[sourceColor].r>>3) <<10)
      

  2.   

    多谢happy__888,终于应用l555的模式解决了.但它与r5g6b5之间有什么区别呢?我怎样区分什么时候用第一种,什么时候用第二种呢?
    马上给分,大家帮忙在回答一下.
      

  3.   

    大部分支持16位色深的显卡都是555格式的,565模式少见很不幸的是,没有api函数直接返回颜色是555还是565的
    两种模式下,GetDeviceCaps这个函数返回的每个象素都占16位你只能是自己来测试它
    比如建立一个内存dc和一个内存bitmap,把这个bitmap选入d内存dc后
    用SetPixelColor和GetPixelColor设置一个Green颜色大于32的数值,取回后比较颜色是否一致来判定它是555还是565
    GetGvalue是相关函数,可以提取颜色当中的对应Green分量
      

  4.   

    有一篇文章: http://www.newebug.com/article/cpp/2062.shtml