如何得到BMP的调色盘(CPalette)? bmp文件中有一部分是调色盘的信息,可以将这部分信息得到,改变颜色顺序,就变成了PaletteEntries ,再通过CPalette::SetPaletteEntries 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 I write CMightyBitmap to wrap many functionalities! 看我的例子:#define DSPDxax 0x00E20746SwapBitmapColor(CDC* pDC, CBitmap* pBitmap,COLORREF rgbNew, COLORREF rgbOld){ BITMAP bm; CBitmap bmMask; CDC memDC,maskDC; // create memory dc for drawing memDC.CreateCompatibleDC( pDC ); CPalette* pOldPalette = (CPalette*)memDC.SelectPalette( pDC->GetCurrentPalette(),FALSE); memDC.RealizePalette(); CBitmap* Bitmap = memDC.SelectObject( pBitmap ); // fill out bitmap structure pBitmap->GetBitmap( &bm ); // create mask bmMask.CreateBitmap( bm.bmWidth,bm.bmHeight,1,1,NULL ); maskDC.CreateCompatibleDC( &memDC ); CBitmap* bmOld = maskDC.SelectObject( &bmMask ); CBrush brush( rgbNew ); CBrush* brOld = (CBrush*)memDC.SelectObject( &brush ); memDC.SetBkColor( rgbOld ); maskDC.BitBlt( 0,0,bm.bmWidth,bm.bmHeight,&memDC,0,0,SRCCOPY ); memDC.SetBkColor( RGB(255,255,255) ); memDC.SetTextColor( RGB(0,0,0) ); memDC.BitBlt( 0,0,bm.bmWidth,bm.bmHeight,&maskDC,0,0,DSPDxax ); maskDC.SelectObject( bmOld ); memDC.SelectObject( &brOld ); memDC.SelectObject( Bitmap ); memDC.SelectPalette( pOldPalette,FALSE ); FireAngel:用你的方法只能得到系统调色盘,我在资源中加入256色位图,得到的不是256色调色盘,而是24bit的调色盘,与windows设定一样。如何得到它的调色盘? 24bits没有调色板吧。。呵呵。。这个是我写的一个Functon, 你看看吧。。#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)HBITMAP LoadBitmap(TCHAR szFileName[], LOGPALETTE** pPal){ //open file; HFILE hf = _lopen(szFileName, OF_READ); if( hf == NULL ) return NULL; BITMAPFILEHEADER bmfh; BITMAPINFOHEADER bmih; _lread(hf, &bmfh, sizeof(BITMAPFILEHEADER)); _lread(hf, &bmih, sizeof(BITMAPINFOHEADER)); _llseek(hf, sizeof(BITMAPFILEHEADER), FILE_BEGIN); int iSize = bmfh.bfSize - sizeof(BITMAPFILEHEADER); char* pImg = new char[iSize]; _lread(hf, pImg, iSize); _lclose(hf); //if the type is not 'BM' if( bmfh.bfType != 0x4d42 ) return NULL; //check the size; int iLnWid = WIDTHBYTES(bmih.biBitCount * bmih.biWidth); if( bmih.biSizeImage != iLnWid * bmih.biHeight ) return NULL; int iClrNo = 0; RGBQUAD* pRgb = NULL; if( bmih.biClrUsed != 0 ) iClrNo = bmih.biClrUsed; else { switch( bmih.biBitCount ) { case 1: iClrNo = 2; break; case 4: iClrNo = 16; break; case 8: iClrNo = 256; break; default: iClrNo = 0; } } HPALETTE hPal = NULL; if( iClrNo != 0 ) { pRgb = (RGBQUAD*)(pImg + sizeof(BITMAPINFOHEADER)); *pPal = (LOGPALETTE*)new char[sizeof(LOGPALETTE) + iClrNo * sizeof(RGBQUAD)]; (*pPal)->palVersion = 0x300; (*pPal)->palNumEntries = iClrNo; for( int i = 0; i < iClrNo; i++ ) { (*pPal)->palPalEntry[i].peRed = pRgb->rgbRed; (*pPal)->palPalEntry[i].peGreen = pRgb->rgbGreen; (*pPal)->palPalEntry[i].peBlue = pRgb->rgbBlue; (*pPal)->palPalEntry[i].peFlags = 0; } hPal = CreatePalette((*pPal)); } HDC hdc = GetDC(NULL); if( hPal != NULL ) { SelectPalette(hdc, hPal, false); RealizePalette(hdc); } HBITMAP hBmp = CreateDIBitmap(hdc, (BITMAPINFOHEADER*)pImg, CBM_INIT, (void*)(pImg + sizeof(BITMAPINFOHEADER) + iClrNo * sizeof(RGBQUAD)), (BITMAPINFO*)pImg, DIB_RGB_COLORS); BITMAP bm; GetObject(hBmp, sizeof(BITMAP), &bm); ReleaseDC(NULL, hdc); if( hPal != NULL ) DeleteObject(hPal); delete []pImg; return hBmp;} 如何设置使得C++能够实现自动类型转换? 无边透明对话框实现窗口拖拉改变大小? 怎么利用OpenGL中的模板缓存和深度缓存实现下列问题? ctoolbar和ctoolbarctrl有什么区别 关于进度条的一个问题 关于在线程函数里面使用PostMessage的问题 一个很奇怪的问题??? 关于CImageList的问题 如何让对话框程序启动时,不最小化显示? 帮助文档怎么制作。别客气,有几说几。 如何做一个没有眶架的窗口,就是没caption and title bar 调色版的问题,望高手赐教 RGB与PALETTERGB
{
BITMAP bm;
CBitmap bmMask;
CDC memDC,maskDC;
// create memory dc for drawing
memDC.CreateCompatibleDC( pDC );
CPalette* pOldPalette = (CPalette*)memDC.SelectPalette(
pDC->GetCurrentPalette(),FALSE);
memDC.RealizePalette();
CBitmap* Bitmap = memDC.SelectObject( pBitmap ); // fill out bitmap structure
pBitmap->GetBitmap( &bm ); // create mask
bmMask.CreateBitmap( bm.bmWidth,bm.bmHeight,1,1,NULL ); maskDC.CreateCompatibleDC( &memDC );
CBitmap* bmOld = maskDC.SelectObject( &bmMask ); CBrush brush( rgbNew );
CBrush* brOld = (CBrush*)memDC.SelectObject( &brush ); memDC.SetBkColor( rgbOld );
maskDC.BitBlt( 0,0,bm.bmWidth,bm.bmHeight,&memDC,0,0,SRCCOPY ); memDC.SetBkColor( RGB(255,255,255) );
memDC.SetTextColor( RGB(0,0,0) );
memDC.BitBlt( 0,0,bm.bmWidth,bm.bmHeight,&maskDC,0,0,DSPDxax ); maskDC.SelectObject( bmOld );
memDC.SelectObject( &brOld );
memDC.SelectObject( Bitmap );
memDC.SelectPalette( pOldPalette,FALSE );
这个是我写的一个Functon, 你看看吧。。
#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)HBITMAP LoadBitmap(TCHAR szFileName[], LOGPALETTE** pPal)
{
//open file;
HFILE hf = _lopen(szFileName, OF_READ);
if( hf == NULL )
return NULL; BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih; _lread(hf, &bmfh, sizeof(BITMAPFILEHEADER));
_lread(hf, &bmih, sizeof(BITMAPINFOHEADER)); _llseek(hf, sizeof(BITMAPFILEHEADER), FILE_BEGIN);
int iSize = bmfh.bfSize - sizeof(BITMAPFILEHEADER);
char* pImg = new char[iSize]; _lread(hf, pImg, iSize);
_lclose(hf); //if the type is not 'BM'
if( bmfh.bfType != 0x4d42 )
return NULL; //check the size;
int iLnWid = WIDTHBYTES(bmih.biBitCount * bmih.biWidth);
if( bmih.biSizeImage != iLnWid * bmih.biHeight )
return NULL;
int iClrNo = 0;
RGBQUAD* pRgb = NULL; if( bmih.biClrUsed != 0 )
iClrNo = bmih.biClrUsed;
else
{
switch( bmih.biBitCount )
{
case 1:
iClrNo = 2;
break; case 4:
iClrNo = 16;
break; case 8:
iClrNo = 256;
break; default:
iClrNo = 0;
}
}
HPALETTE hPal = NULL;
if( iClrNo != 0 )
{
pRgb = (RGBQUAD*)(pImg + sizeof(BITMAPINFOHEADER)); *pPal = (LOGPALETTE*)new char[sizeof(LOGPALETTE) +
iClrNo * sizeof(RGBQUAD)]; (*pPal)->palVersion = 0x300;
(*pPal)->palNumEntries = iClrNo; for( int i = 0; i < iClrNo; i++ )
{
(*pPal)->palPalEntry[i].peRed = pRgb->rgbRed;
(*pPal)->palPalEntry[i].peGreen = pRgb->rgbGreen;
(*pPal)->palPalEntry[i].peBlue = pRgb->rgbBlue;
(*pPal)->palPalEntry[i].peFlags = 0;
} hPal = CreatePalette((*pPal));
}
HDC hdc = GetDC(NULL);
if( hPal != NULL )
{
SelectPalette(hdc, hPal, false);
RealizePalette(hdc);
} HBITMAP hBmp = CreateDIBitmap(hdc, (BITMAPINFOHEADER*)pImg, CBM_INIT,
(void*)(pImg + sizeof(BITMAPINFOHEADER) + iClrNo * sizeof(RGBQUAD)),
(BITMAPINFO*)pImg, DIB_RGB_COLORS); BITMAP bm;
GetObject(hBmp, sizeof(BITMAP), &bm); ReleaseDC(NULL, hdc); if( hPal != NULL )
DeleteObject(hPal); delete []pImg;
return hBmp;
}