Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-8832
Chak
2002-01-18 14:52
2002.02.04
Добавление, удаление файлов в директории


3-8753
sos
2002-01-04 16:53
2002.02.04
Компонента для работы с файлами типа *.btr


4-9030
swr
2001-12-06 09:41
2002.02.04
Анимированный курсор


1-8808
DDDeN
2002-01-16 07:29
2002.02.04
Restorator


3-8761
Paolo_lis
2002-01-04 16:35
2002.02.04
Компоненета с инкриментальным посиком





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский