Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.02.04;
Скачать: CL | DM;

Вниз

Вывод bitmap из ресурса   Найти похожие ветки 

 
ggsoft ©   (2001-11-26 22:37) [15]

to _Mike, Delphi-йский ImageEditor тоже конкретно глючит при открытии Image-й на 256-цветах и последующего их сохранения, попробуй! VC6 не глючит.

Evgeny, не все вышесказанное правильно. При выводе изображений на 256-цветах, Windows не «скидывает» их (цвета изображения) до 16 цветов, а пытается подобрать палитру изображения к своей системной. И это происходит во время загрузки рисунка в HBITMAP т. е. из DIB-изображения Windows преобразует DDB, а значит надо при выводе рисунка создать и выбрать в контекст устройства ( HDC) свою палитру, полученную из рисунка... Ниже код, правда я писал его на VC6.

to _Mike, если не сможете перевести на Delphi пишите.



/********************************************************************/
//Загрузить изображение и создать палитру
/********************************************************************/
BOOL CGGAboutDlgLogoBmp::GetBitmapAndPalette(CBitmap &bmpPaint, CPalette &palPaint)
{
HBITMAP hBmp;
DIBSECTION ds;
BITMAPINFOHEADER &bmpInfoHdr = ds.dsBmih;
UINT nColors;
CWindowDC dcDesktop(NULL);
CDC dcMem;
CBitmap *bmpTemp;
RGBQUAD *pRGB;
LOGPALETTE *pPal;
BOOL bRet = FALSE;

if (bmpPaint.m_hObject)
bmpPaint.DeleteObject();
if (palPaint.m_hObject)
palPaint.DeleteObject();

hBmp = (HBITMAP)::LoadImage(AfxGetResourceHandle(),
MAKEINTRESOURCE(GG_IDB_LOGOABOUT), IMAGE_BITMAP,
0, 0, LR_CREATEDIBSECTION);
if (!hBmp)
return FALSE;

bmpPaint.Attach(hBmp);
bmpPaint.GetObject(sizeof(ds), &ds);
nColors = bmpInfoHdr.biClrUsed ?
bmpInfoHdr.biClrUsed : 1 << bmpInfoHdr.biBitCount;

dcMem.CreateCompatibleDC(&dcDesktop);
bmpTemp = dcMem.SelectObject(&bmpPaint);
pRGB = new RGBQUAD [nColors];
pPal = (LOGPALETTE *)new BYTE [sizeof(LOGPALETTE) +
sizeof(PALETTEENTRY) * nColors];
pPal->palNumEntries = nColors;
pPal->palVersion = PALETTEVERSION;
if (GetDIBColorTable(dcMem, 0, nColors, pRGB) == nColors) {
for (UINT i = 0; i < nColors; i++) {
pPal->palPalEntry[i].peRed = pRGB[i].rgbRed;
pPal->palPalEntry[i].peGreen = pRGB[i].rgbGreen;
pPal->palPalEntry[i].peBlue = pRGB[i].rgbBlue;
pPal->palPalEntry[i].peFlags = 0;
}
bRet = palPaint.CreatePalette(pPal);
}
else
ASSERT(FALSE); //GetDIBColorTable worked not correct

delete [] pPal;
delete [] pRGB;
dcMem.SelectObject(bmpTemp);

return bRet;
}

/********************************************************************/
//то же самое событие OnPaint Delphi-йской формы
/********************************************************************/
void CGGAboutDlgLogoBmp::OnPaint()
{
CPaintDC dc(this);
CDC dcMem;
CRect rectClient;
CBitmap *bmpTemp;
CPalette *palTemp = NULL;
BITMAP bmpInfo;

GetClientRect(&rectClient);
if (!m_pPalette)
m_pPalette = new CPalette;

if (GetBitmapAndPalette(m_bmpLogoBitmap, *m_pPalette)) {
m_bmpLogoBitmap.GetBitmap(&bmpInfo);
dcMem.CreateCompatibleDC(&dc);
bmpTemp = dcMem.SelectObject(&m_bmpLogoBitmap);
dc.SetStretchBltMode(COLORONCOLOR);
if (dc.GetDeviceCaps(RASTERCAPS) & RC_PALETTE && m_pPalette->m_hObject) {
palTemp = dc.SelectPalette(m_pPalette, FALSE);
dc.RealizePalette();
}
dc.StretchBlt(rectClient.left, rectClient.top,
rectClient.Width() - 1, rectClient.Height() - 1,
&dcMem, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight,
SRCCOPY);
if (palTemp)
dc.SelectObject(palTemp);
dcMem.SelectObject(bmpTemp);
}
}


С уважением, Евгений!



Страницы: 1 вся ветка

Текущий архив: 2002.02.04;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.01 c
14-8973
Fay
2001-12-10 06:50
2002.02.04
Что означает слово


3-8796
roottim
2002-01-06 12:36
2002.02.04
DbGrid


4-9036
Chup
2001-12-03 16:16
2002.02.04
Как убить процесс сеанса дос.


1-8868
SlavaNew
2002-01-14 12:50
2002.02.04
Как передать иконку?


6-8969
Hawk
2001-11-11 20:20
2002.02.04
Разрыв связи между TServerSocket и TClienSocket