|
8和24位转16的555都可以 就是转是565不行,为甚么呀 不就是绿色多了一位嘛 怎么写都不行
_inline WORD 8_to_16(const RGBQUAD * pal,DWORD index)
{
return (pal[index].rgbBlue)>>3 | ((pal[index].rgbGreen>>3)<<5) | ((pal[index].rgbRed>>3)<<10);
}
_inline WORD 24_to_16(BYTE r,BYTE g,BYTE b)
{
return ((WORD)(r>>3)<<10) | ((WORD)(g>>3)<<5) | ((WORD)b>>3);
}
转成565我觉得应该是下面这样呀,哪位帮帮忙呀,郁闷中....
(pal[index].rgbBlue)>>3 | ((pal[index].rgbGreen>>2)<<5) | ((pal[index].rgbRed>>3)<<11);
HRESULT CImage: rawImage(LPDIRECTDRAW7 lpdd,int nOriX,int nOriY,int nWidth,int nHeight,DWORD dwFlags)
{
HRESULT hr;
if(NULL == lpdd)
return E_POINTER;
Convert16();
memset(&m_ddsd,0,sizeof(m_ddsd));
m_ddsd.dwSize = sizeof(m_ddsd);
m_ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
m_ddsd.dwWidth = nWidth;
m_ddsd.dwHeight = nHeight;
m_ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | dwFlags;
if(FAILED(lpdd->CreateSurface(&m_ddsd,&m_pSurf,NULL)))
return E_FAIL;
BITMAPINFOHEADER bih;
memset(&bih,0,sizeof(bih));
bih.biSize = sizeof(bih);
bih.biPlanes = 1;
bih.biWidth = nWidth;
bih.biHeight = nHeight;
bih.biBitCount = m_nBitCount;
HDC hdc;
if(FAILED(hr = m_pSurf->GetDC(&hdc)))
return hr;
HDRAWDIB hdib = DrawDibOpen();
if(!(DrawDibDraw(hdib,hdc,0,0,nWidth,nHeight,&bih,(LPVOID)m_pImage,nOriX,nOriY,nWidth,nHeight,0)))
return E_FAIL;
DrawDibClose(hdib);
if(FAILED(hr = m_pSurf->ReleaseDC(hdc)))
return hr;
return S_OK;
}
inline WORD CImage::_8_to_16(const RGBQUAD * pal,DWORD index)
{
return (pal[index].rgbBlue)>>3 | ((pal[index].rgbGreen>>3)<<5) | ((pal[index].rgbRed>>3)<<10); //555
return (pal[index].rgbBlue)>>3 | ((pal[index].rgbGreen>>2)<<5) | ((pal[index].rgbRed>>3)<<11); //565
}
inline WORD CImage::_24_to_16(BYTE r,BYTE g,BYTE b)
{
return ((WORD)(r>>3)<<10) | ((WORD)(g>>3)<<5) | ((WORD)b>>3);//555
return ((WORD)(r>>3)<<11) | ((WORD)(g>>2)<<5) | ((WORD)b>>3);//565
}
[em7] |
|