Форум: "WinAPI";
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];
ВнизВывод 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.004 c