Re: Создание CBitmap
От: SlavaV www.tetron.ru
Дата: 29.06.05 14:23
Оценка:
Здравствуйте, SlavaV, Вы писали:

SV>Здравствуйте,

SV>Подскажите пожалуйста как создать CBitmap если имеется указатель на байтовый массив и структуру BITMAPINFO

Спасибо, что ещё терпите, а не махнули рукой
//OnDraw
HDC hDC;
hDC = pDC->GetSafeHdc();
//------------------------------------------------------------------
//Создаём структуру BITMAPINFO
BITMAPINFO *lpDIBHeader = NULL;
LPLOGPALETTE lpPal = NULL;
HPALETTE hPGrayscale = NULL;
// fill the DIB header
if( (lpDIBHeader = (BITMAPINFO *)malloc( sizeof( BITMAPINFO ) + sizeof( RGBQUAD ) * 255 )) == NULL )
MessageBox("lpDIBHeader no mem", "Ошибка", MB_OK);
lpDIBHeader->bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
lpDIBHeader->bmiHeader.biWidth = 256;
lpDIBHeader->bmiHeader.biHeight = 360;
lpDIBHeader->bmiHeader.biPlanes = 1;
lpDIBHeader->bmiHeader.biBitCount = 8;
lpDIBHeader->bmiHeader.biCompression = BI_RGB;
if( (lpPal = (LPLOGPALETTE)malloc( sizeof( LOGPALETTE ) + sizeof( PALETTEENTRY ) * 255 )) == NULL )
MessageBox("lpPal no mem", "Ошибка", MB_OK);
//Заполняем палитру
for( int iCyc = 0; iCyc < 256; iCyc++ )
{
if ( iCyc > 127 )
lpDIBHeader->bmiColors[iCyc].rgbBlue = lpDIBHeader->bmiColors[iCyc].rgbGreen = lpDIBHeader->bmiColors[iCyc].rgbRed = lpPal->palPalEntry[iCyc].peBlue =lpPal->palPalEntry[iCyc].peGreen = lpPal->palPalEntry[iCyc].peRed = (BYTE)255;
else
lpDIBHeader->bmiColors[iCyc].rgbBlue = lpDIBHeader->bmiColors[iCyc].rgbGreen = lpDIBHeader->bmiColors[iCyc].rgbRed = lpPal->palPalEntry[iCyc].peBlue =lpPal->palPalEntry[iCyc].peGreen = lpPal->palPalEntry[iCyc].peRed = (BYTE)0;
}

lpPal->palVersion = 0x300;
lpPal->palNumEntries = 256;
hPGrayscale = ::CreatePalette(lpPal);

char *cptrData;
char *cptrDIBData;
char *lpDIBData;
if( (cptrDIBData = (char *)malloc( sizeof( char ) * 256 * 360 )) == NULL )
MessageBox("cptrDIBData no mem", "Ошибка", MB_OK);
lpDIBData = cptrDIBData;
// rotate an image while copying data to the DIB data
cptrData = (char *)pDoc->m_DataPtr + (360 — 1) * 256;//pDoc->m_DataPtr указатель на массив данных со сканера
//Разворачиваем изображение
for( iCyc = 0; iCyc < 360; iCyc++ )
{
memcpy( cptrDIBData, cptrData, 256 );
cptrData = cptrData — 256;
cptrDIBData = cptrDIBData + 256;
}
::SelectPalette(hDC , hPGrayscale, false);
::RealizePalette(hDC);
::SetDIBitsToDevice(hDC, 40,40, 256, 360, 0, 0, 0, 360, lpDIBData, lpDIBHeader, DIB_RGB_COLORS);
::ReleaseDC(m_hWnd, hDC);

Это код всё нормально работает выводит изображение в основное окно, но не хочет печататься ошибку выдаёт.
и не хочет выводить изображение в диалоговое окно (при подстановке hDC диалога). Поэтому пришла идея преобразовать его в CBitmap и тут опять проблемы.
//Функция обработки события OnPaint в диалоговом окне
//------------------------------------------------------------------
//Создаём структуру BITMAPINFO
BITMAPINFO *lpDIBHeader = NULL;
HBITMAP hBM;
HDC hDC;
CDC DCMem;
if( (lpDIBHeader = (BITMAPINFO *)malloc( sizeof( BITMAPINFO ) + sizeof( RGBQUAD ) * 255 )) == NULL )
MessageBox("lpDIBHeader no mem", "Ошибка", MB_OK);
lpDIBHeader->bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
lpDIBHeader->bmiHeader.biWidth = 256;
lpDIBHeader->bmiHeader.biHeight = 360;
lpDIBHeader->bmiHeader.biPlanes = 1;
lpDIBHeader->bmiHeader.biBitCount = 8;
lpDIBHeader->bmiHeader.biCompression = BI_RGB;
//Заполняем палитру
for( int iCyc = 0; iCyc < 256; iCyc++ )
{
lpDIBHeader->bmiColors[iCyc].rgbBlue = lpDIBHeader->bmiColors[iCyc].rgbGreen = lpDIBHeader->bmiColors[iCyc].rgbRed = (BYTE)iCyc;
}
hDC = ::CreateCompatibleDC(pDC->m_hDC);
hBM = ::CreateCompatibleBitmap(hDC, 256, 360);
::SetDIBits(hDC, hBM, 0, 360, m_DataPtr, lpDIBHeader, DIB_RGB_COLORS);//m_DataPtr указатель на массив данных со сканера
m_Bitmap = CBitmap::FromHandle(hBM);
DCMem.CreateCompatibleDC(pDC);
DCMem.SelectObject(m_Bitmap);
pDC->BitBlt(10, 10, 256, 360, &DCMem, 0, 0, SRCCOPY);
Ни в какую не хочет работать
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.